前言
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
让配置生效
Comments | 1 条评论
博客作者 molezz