为什么使用 rathole

在之前的博客frp中,我介绍了frp

frp一样,rathole也是一个内网穿透工具。

但是frp存在着很多问题。

  1. frp并不支持websocket,这会导致基于websocket的即时消息应用不能正常使用。
  2. frp代理https时不够灵活。因为占用 80 端口,所以配置 http 自动跳转 https 非常繁琐。

所以,我用rathole完全替代了frp

并且在远程服务器上配合Nginx反向代理,区分多个应用和配置 https。

安装 rathole

下载ratholeRelease 版本

根据使用的电脑选择不同的版本。

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 ProtocolTLS两种加密传输方式。

这里我使用了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

参考