前言

Rathole是一个号称无论是内存占用还是吞吐量均秒杀frp的新内网穿透工具,使用rust编写
- TCP/UDP 最大吞吐量比 frp 高几倍
- 内存占用从 60~70MiB 减少到 10MiB 以下( Rust vs Go ,这种结果并不意外)。
- 二进制文件精简,且支持编译时开关特性裁剪,最小二进制在 x86_64 上大小只有 500KiB 左右。
- 连接延迟和 frp 基本相同,但能承载更高并发。

虽然rathole吹的很厉害,但是在我这1核1g的中转小鸡上,压测该崩还是得崩,并没有看出多牛逼。

不过倒是有一个神奇的地方,
用rathole + nginx后,压测php接口,php接口崩溃,其他转发端口也不同程度受到影响,但是酸酸乳之流照样正常运行

要知道之前frp的时候,压测php接口,不仅整个frp所有转发的端口全线崩溃,而且中转vps上的酸酸乳也跟着一起崩,ssh连接vps并没有看到cpu和内存被大量占用,但就是崩,要等十几分钟才能恢复过来,而且frp的服务端和客户端必须手动重启,不然一直崩。这样看来,rathole+nginx相比frp也是一种进步吧。(不知道这功劳是得算在rathole还是nginx的头上)

安装

安装rathole分别需要安装服务器端与客户端。如果你不打算用docker安装rathole,那就比较坑了。
rathole说是和frp是二进制的不需要依赖,实际上rathole是要求你的linux的GLIBC为2.18以上的版本的,如果你是centos7等系统的vps,恭喜你,赶紧重装centos8吧。frp就没有这种烦恼,直接运行完事,这就是rathole的第一个坑。

一开始我不信邪,按网上教程编译GLIBC_2.18,但是怎么编译安装就是全程不报错,但是GLIBC就是没安装进去。又是一顿百度,发现可能和gcc环境有关,可能gcc的环境太低导致编译安装失败,又是找教程编译安装gcc,结果编译到最后就是出现error2错误,试了好多遍都是这样,又是一顿百度。最后发现,原来是1核1g的vps内存不足,需要升级配置或者改虚拟内存,而且看网上说gcc编译安装没有高配置的主机的话,耗时巨久,我安装个内网穿透咋就这么多事呢。

换成centos8,安装一些git之类,源又出现了问题,又得换源,折腾半天,最后换清华源好了(想不通一个中国香港的vps居然连不上centos官方源???)

rathole配置

官方说配置文件和frp差不多,确实是差不多,缺点就是相比frp真的是非常不人性化

举个例子

这是我的frp客户端(nas)的配置文件

[common]
server_addr = 1.1.1.1
server_port = 7000

[wordpress]
type = tcp
local_port = 80
remote_port = 8000

这是frp的服务端(中转vps)配置文件

[common]
bind_port = 7000

这样,当你需要增加修改网站,比如你想再加一个discuz论坛的映射,只需要修改客户端的配置。

这是rathole的客户端配置

[client]
remote_addr = "1.1.1.1:7000" 

[client.services.wordpress]
local_addr = "127.0.0.1:80" 

这是rathole服务端的配置

[server]
bind_addr = "1.1.1.1:7000"

[server.services.wordpress]
bind_addr = "0.0.0.0:8000"

有没有发现,rathole在配置方面,是完全分开的,本地端口由客户端指定,而传出端口由服务端指定。

这么设计,对于需要映射的服务一两个还好,对于需要映射的服务多的,相比frp,就需要写两倍的配置量。

如果你是要和我一样搞http内网穿透,那你还更需要配置一个nginx的反代配置,不像frp,只需要把type改为http,指定一个custom_domain就可以。可见frp在易用性这方面真的是非常好。

分别运行rathole服务端与客户端

服务器端

如果你使用的是centos8,这里还有一个坑,centos8不能直接安装screen,需要安装个epel-release

sudo yum install epel-release

之后,就和后台运行frp的流程差不多了

screen -S rathole
./rathole --server server.toml

客户端

客户端我是群晖使用docker运行,这里也是有一个坑,frp是直接映射配置文件进去,非常傻瓜。

但是rathole的docker在群晖里,不仅需要映射,还需要改一下启动命令,官方对docker启动的教程也是写的不清不楚的,我还是看了别人issue贴的配置才恍然大悟。

nginx配置

经过以上的步骤,访问你vps的ip:8000应该可以访问到我们之前配置的wordpress了。
随便百度个安装教程,然后安装nginx,安装完,打开默认的 /etc/nginx/nginx.conf
把http{}里的所有server全部删掉,换成我们自己的,如下所示

    server {
           listen       80 default_server;
           #server_name  localhost;

           #charset koi8-r;
           #access_log  /var/log/nginx/host.access.log  main;

           location / {
               return 404;
               root   /usr/share/nginx/html;
               index  index.html index.htm;
           }

           #error_page  404              /404.html;

           # redirect server error pages to the static page /50x.html
           #
           error_page   500 502 503 504  /50x.html;
           location = /50x.html {
               root   /usr/share/nginx/html;
           }
       }

    server {
        listen       80;
        server_name  mydomain.com;

        location / {
            proxy_pass http://127.0.0.1:8000;
            proxy_redirect off;
            proxy_set_header Host $host;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Real-IP $HTTP_CF_CONNECTING_IP;
        }

        error_page 404 /404.html;
            location = /40x.html {
        }

        error_page 500 502 503 504 /50x.html;
            location = /50x.html {
        }
    }

第一个server{}是必要的,它是默认的server,让没有符合nginx反代的访问返回404错误。这样你的vps如果使用cdn的话,就不用担心暴露源站ip了。

第二个server{}就是你的wordpress的反代配置了,访问mydomain.com就会反代到本机(vps)的8000端口,8000端口又通过rathole内网穿透到你的nas,所以最后就输出一个你的wordpress的页面。

如果你想再多加几个http内网穿透,只需要修改rathole的服务端,客户端配置文件,然后再改nginx的反代配置,复制一下第二个server{},把server_name改成你想访问的域名,proxy_pass的端口改成服务器配置中的端口,就可以了

最后,每修改一次nginx.conf,记得

service nginx restart

让配置生效


代码萌新,热爱折腾,喜欢花草和养鱼