配置概览:
- 阿里云服务器(跳板机):
Linux daxue 6.1.0-41-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.158-1 (2025-11-09) x86_64 GNU/Linux - 内网服务器:
Linux workstation 6.8.0-84-generic #84~22.04.1-Ubuntu SMP PREEMPT_DYNAMIC Tue Sep 9 14:29:36 UTC 2 x86_64 x86_64 x86_64 GNU/Linux
rathole内网穿透基础配置
参考链接:https://github.com/rathole-org/rathole/
- 两个服务器都要做的
//创建一个rathole目录
mkdir rathole-file
//安装对应版本文件
wget https://github.com/zhzyker/dismap/releases/download/v0.4/dismap-0.4-linux-amd64
//解压文件
unzip rathole-x86_64-unknown-linux-gnu.zip
2.跳板机配置:
vi server.toml
# server.toml
[server]
bind_addr = "0.0.0.0:2333" #跳板机监听客户端连接的端口
default_token="yourtoken"#与客户端必须一致
[server.services.my_nas_ssh]
bind_addr = "0.0.0.0:5200" # `5200` 配置了将 `my_nas_ssh` 暴露给互联网的端口
pkill rathole
./rathole server.toml
3.内网服务器配置:
vi client.toml
配置:
#client.toml
[client]
remote_addr = "myserver.com:2333" # myserver.com是服务器的地址,端口必须与跳板机监听端口相同
[client.services.my_nas_ssh]
token = "yourtoken" # 与跳板机一致
local_addr = "127.0.0.1:22" # 需要被转发的服务的地址
pkill rathole
./rathole client.toml
⭐️ 4. 阿里云跳板机给 2333端口 和 5200端口 放行
- 登录 阿里云控制台
- 找到你的 ECS 实例(IP)
- 点击「安全组」→「配置规则」
- 在 入方向(Inbound) 添加规则:
- 授权策略:允许
- 协议类型:自定义 TCP
- 端口范围:2333
- 授权对象:0.0.0.0/0 (或你的客户端公网 IP)
5. 验证连接
ssh -p5200 yourname@106.14.1.17
//106.14.1.17为跳板机IP
断连立刻重试,开机自动运行
- 创建 systemd 服务文件
cd /etc/systemd/system/
#跳板机上
vi rathole-server.server
#内网服务器上
vi rathole-client.server
2. rathole.server 配置(内网服务器上同样配置,只server.toml -> client.toml)
[Unit]
Description=Rathole Service
After=network.target
[Service]
#rathole的地址和server.toml的地址
ExecStart=/root/rathole_file/rathole /root/rathole_file/server.toml
Restart=always # ← 关键:总是重启
RestartSec=5s # ← 断连后 5 秒重试
StartLimitInterval=60s # 在 60 秒内
StartLimitBurst=10 # 最多重启 10 次,防止日志刷爆
User=root
[Install]
WantedBy=multi-user.target
3. 启用并启动服务
# 重载 systemd 配置
sudo systemctl daemon-reload
# 启用开机自启
sudo systemctl enable rathole-server # server 端
sudo systemctl enable rathole-client # client 端
# 立即启动
sudo systemctl start rathole-server
sudo systemctl start rathole-client
4. 验证状态
# 查看日志(实时)
sudo journalctl -u rathole-client -f
# 查看状态
systemctl status rathole-client
流量加密
参考链接:https://github.com/rathole-org/rathole/blob/main/docs/transport.md
最简单方式:使用rathole提供的noise方法
1. 生成密钥对(记住Private Key & Public Key)
rathole --genkey
2. 跳板机server.toml配置【Private Key】
# server.toml
[server]
bind_addr = "0.0.0.0:2333"
default_token = "yourtoken"
[server.transport]
type = "noise"
[server.transport.noise]
local_private_key = "yourprivatekey"
[server.services.my_nas_ssh]
bind_addr = "0.0.0.0:5200"
3. 内网client.toml配置【Public Key】
# client.toml
[client]
remote_addr = "myserver.com:2333"
default_token = "yourtoken"
[client.transport]
type = "noise"
[client.transport.noise]
remote_public_key = "yourpublickey"
[client.services.my_nas_ssh]
local_addr = "127.0.0.1:22" # 内网中真正提供服务的地址
4. 验证连接(同上)
抓包验证
抓包:tcpdump; 包分析:wireshark
因要验证流量是否加密成功,应在跳板机上进行抓包。
#端口为跳板机server监听内网服务器client的端口号
sudo tcpdump -i any -w noise.pcap 'port 2333'
!注意:应在server和client建立连接之前就开始抓包,在ssh连接内网服务器成功之后停止抓包(因为SSH 服务会暴露版本,开头服务器会发版本号,所以得在ssh连接之前就抓包)。过程:
抓包 —— server和client建立连接 —— ssh连接内网服务器 —— 停止抓包
将跳板机上的noise.pcap包下载到本地电脑:
scp root@106.14.1.17:/root/path/noise.pcap ~/noise.pcap
Wireshark 打开noise.pcap包,找一个 带有[PSH, ACK]标志的包(表示有实际数据),查看 “Packet Details” 面板最后一行之后的内容 —— 如果有 “Data” 或 “Unreassembled Fragment”,就点开它。
- 明文流量:右侧能看到
SSH-2.0-OpenSSH_8.9(版本号) - 加密流量:右侧:ASCII 尝试解码(大部分是
.,因为不可打印) - 直接搜索SSH 关键字,若加密成功,则无法搜索。
图片参考:

TLS + 域名伪装——失败的尝试
目的:让 rathole 流量看起来像标准 HTTPS 流量(端口 443 + 有效证书 + 域名),从而绕过流量检测
前提条件:
已备案域名
服务器开放 80 和 443 端口
1. DNS解析:域名的 A 记录指向服务器公网 IP。
2. 在服务器上申请 Let’s Encrypt 证书。
#安装 Certbot
sudo apt update
sudo apt install -y certbot
# 申请证书(确保 80 端口未被占用)
DOMAIN="your-domain.com"
sudo certbot certonly --standalone -d $DOMAIN --non-interactive --agree-tos --email your@email.com
3. 证书位置
证书链:/etc/letsencrypt/live/$DOMAIN/fullchain.pem
私钥:/etc/letsencrypt/live/$DOMAIN/privkey.pem
4. 启用 TLS + 443 端口
① AI【通义千问、gimini3pro】对type=”tls”会提示报错,应阅读rathole文档

参考链接:
https://github.com/rathole-org/rathole/blob/main/examples/tls/server.toml
② PKCS#12 证书格式兼容性问题
Rathole 使用的 Rustls 库对安全性要求很高,可能不支持 OpenSSL 默认的旧算法(RC2)或某些新算法(PBES2),在服务端强制使用 AES-256 算法,这是现代 Rust 程序支持最好的格式。
#进入证书源目录
cd /etc/letsencrypt/live/$DOMAIN/
# 生成 AES-256 证书 (Rathole 的最爱)
openssl pkcs12 -export \
-in fullchain.pem \
-inkey privkey.pem \
-out /root/rathole.p12 \
-passout pass:123456 \
-keypbe AES-256-CBC \
-certpbe AES-256-CBC \
-macalg SHA256
#移动到你的工作目录 (假设是 /home/daxue/rathole_file/)
cp /root/rathole.p12 /home/daxue/rathole_file/rathole.p12
chown daxue:daxue /home/daxue/rathole_file/rathole.p12
chmod 644 /home/daxue/rathole_file/rathole.p12
此时,rathole-file文件下也有rathole.p12文件(避免在 /etc 文件下的权限问题),服务器的server.toml配置为:
#server.toml
[server]
bind_addr = "0.0.0.0:443"
default_token = "yourtoken"
[server.transport]
type = "tls"
[server.transport.tls]
pkcs12 = "/root/rathole_file/rathole.p12"
pkcs12_password = "123456"
[server.services.my_nas_ssh]
bind_addr = "0.0.0.0:5200"
内网服务器配置:
#client.toml
[client]
# 必须填写域名,不能填IP,否则证书验证会失败
remote_addr = "your-domain.com:443"
default_token = "yourtoken"
[client.transport]
type = "tls"
[client.transport.tls]
# 必须填写已域名,用于 SNI 验证,这是伪装的关键
hostname = "your-domain.com"
#Let's Encrypt 是受信任的证书,无需ca_cert参数,系统会自动验证
[client.services.my_nas_ssh]
local_addr = "127.0.0.1:22"
检查网站证书是否正确: 使用 OpenSSL 客户端手动测试 TLS/SSL 连接
openssl s_client -connect your-domain.com:443 -servername your-domain.com
以上配置,证书格式兼容性已成功解决,验证通过,但443端口无法监听成功(主包域名未备案)
⭐️使用域名必须是已备案域名,没备案的域名用 443 会被云服务商阻断
5. 其余方法:
TLS + WebSocket 封装
rathole自带 TLS(rustls) + CA证书

发表回复