为什么使用 rathole
在之前的博客frp中,我介绍了frp
。
跟frp
一样,rathole
也是一个内网穿透工具。
但是frp
存在着很多问题。
frp
并不支持websocket
,这会导致基于websocket
的即时消息应用不能正常使用。frp
代理https
时不够灵活。因为占用 80 端口,所以配置 http 自动跳转 https 非常繁琐。
所以,我用rathole
完全替代了frp
。
并且在远程服务器上配合Nginx
反向代理,区分多个应用和配置 https。
安装 rathole
下载rathole
,Release 版本。
根据使用的电脑选择不同的版本。
跟frp
不同rathole
的服务端和客户端都包括一个可执行文件中,rathole
通过toml
配置文件或者-c
(-s
)命令参数区分服务端和客户端。
将可执行文件放入/usr/bin/
路径中。
配置服务端
我们需要在远程服务器上配置服务端。
需要在/etc/rathole
下创建如下server.toml
配置文件。
[server]
bind_addr = "0.0.0.0:2333"
default_token = "123" # 默认令牌,服务端和客户端需要匹配
[server.services.foo1] # 服务名为foo1
bind_addr = "0.0.0.0:5202" # 绑定至远程服务器5202端口,
# 如果需要使用反向代理,
# 则可以绑定到远程服务器的本地端口
配置客户端
我们需要在本地服务器上配置客户端。
需要在/etc/rathole
下创建如下client.toml
配置文件。
[client]
remote_addr = "localhost:2333"
default_token = "123"
[client.services.foo1]
local_addr = "127.0.0.1:80" # 本地服务端口
加密传输配置
上述配置为最简配置,并不能保证安全性
所以我们需要进一步配置传输方式,rathole
提供了Noise Protocol
和TLS
两种加密传输方式。
这里我使用了Noise Protocol
。
生成密钥对
使用--genkey
参数运行。
rathole --genkey
我们可以得到一对密钥对,例如:
Private Key:
cQ/vwIqNPJZmuM/OikglzBo/+jlYGrOt9i0k5h5vn1Q=
Public Key:
GQYTKSbWLBUSZiGfdWPSgek9yoOuaiwGD/GIX8Z1kkE=
服务端
我们需要在刚才的配置文件server.toml
中添加
[server.transport]
type = "noise"
[server.transport.noise]
local_private_key = "cQ/vwIqNPJZmuM/OikglzBo/+jlYGrOt9i0k5h5vn1Q=" # 私钥
客户端
我们需要在刚才的配置文件client.toml
中添加
[client.transport]
type = "noise"
[client.transport.noise]
remote_public_key = "GQYTKSbWLBUSZiGfdWPSgek9yoOuaiwGD/GIX8Z1kkE=" # 公钥
添加守护进程
需要在/etc/systemd/system/
中创建ratholes.service
。
服务端服务
[Unit]
Description=Rathole Server Service
After=network.target
[Service]
Type=simple
User=nobody
Restart=on-failure
RestartSec=5s
ExecStart=/usr/bin/rathole -s /etc/rathole/server.toml
LimitNOFILE=1048576
[Install]
WantedBy=multi-user.target
客户端服务
需要在/etc/systemd/system/
中创建ratholec.service
。
[Unit]
Description=Rathole Client Service
After=network.target
[Service]
Type=simple
User=nobody
Restart=on-failure
RestartSec=5s
ExecStart=/usr/bin/rathole -c /etc/rathole/client.toml
LimitNOFILE=1048576
[Install]
WantedBy=multi-user.target
命令
这里以服务端为例,客户端命令类似。
运行服务
sudo systemctl start ratholes.service
开机运行服务
sudo systemctl enable ratholes.service
停止服务
sudo systemctl stop ratholes.service