rathole内网穿透& 流量加密

配置概览:

  • 阿里云服务器(跳板机):
    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/

  1. 两个服务器都要做的
//创建一个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端口 放行

  1. 登录 阿里云控制台
  2. 找到你的 ECS 实例(IP)
  3. 点击「安全组」→「配置规则」
  4. 在 入方向(Inbound) 添加规则:
  • 授权策略:允许
  • 协议类型:自定义 TCP
  • 端口范围:2333
  • 授权对象:0.0.0.0/0 (或你的客户端公网 IP)

5. 验证连接

ssh -p5200 yourname@106.14.1.17
//106.14.1.17为跳板机IP

断连立刻重试,开机自动运行

  1. 创建 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证书

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

Popular Posts

Categories

Tags