Loading... # rathole 入门指南 # 一、概述 ## 1. 简介 ### A. 是什么 rathole 是一个用 Rust 编写的轻量级、高性能反向代理工具,用于 NAT 穿透。它可以将位于 NAT 后面的设备上的服务暴露到互联网上。与 frp 和 ngrok 类似,rathole 通过一台具有公网 IP 的服务器来中转流量,使内网服务可被外网访问。 ### B. 为什么学 - 解决家庭服务器或 NAS 无法直接访问的问题 - 相比 frp 具有更高的性能和更低的资源占用 - 用 Rust 编写,二进制文件可小至 500KiB,适合嵌入式设备 ### C. 学完能做什么 - 在公网服务器上部署 rathole 服务端 - 在内网设备上配置客户端,将本地服务暴露到公网 - 配置加密传输,保护数据安全 - 热重载配置,无需重启服务 # 二、环境准备 ## 1. 系统要求 - 服务器:具有公网 IP 的 Linux 服务器 - 客户端:位于 NAT 后面的设备(家用电脑、NAS 等) - 操作系统:Linux、macOS、Windows、支持 Docker 的平台 ## 2. 安装步骤 从官方发布页面下载预编译二进制文件: Linux: ```bash wget https://github.com/rathole-org/rathole/releases/download/v0.5.0/rathole-x86_64-unknown-linux-musl.tar.gz tar -xzf rathole-x86_64-unknown-linux-musl.tar.gz ``` Docker: ```bash docker pull rapiz1/rathole ``` 从源码编译: ```bash git clone https://github.com/rathole-org/rathole.git cd rathole cargo build --release ``` ## 3. 验证安装 ```bash ./rathole --version ``` # 三、核心概念 ## 1. 基本术语 - 服务端(Server):运行在具有公网 IP 的服务器上,监听来自客户端的连接和来自外网的访问请求 - 客户端(Client):运行在 NAT 后面的设备上,主动连接服务端并注册需要转发的服务 - Token:服务端和客户端之间用于身份验证的密钥 - 服务(Service):需要转发的具体应用,如 SSH、Web 服务器等 ## 2. 工作原理 ```mermaid graph LR A[外网用户] -->|访问公网端口| B[服务端] B <-->|加密通道| C[客户端] C -->|转发请求| D[本地服务] ```  rathole 的工作流程如下: 1. 客户端主动连接服务端,并使用 Token 进行身份验证 2. 服务端记录客户端注册的服务映射关系 3. 外网用户访问服务端的公网端口 4. 服务端通过加密通道将流量转发给客户端 5. 客户端将流量转发到本地服务 # 四、快速上手 ## 1. 基本示例:暴露 NAS 的 SSH 服务 ### 场景 你有一台位于家庭网络的 NAS,希望从互联网上通过 SSH 访问它。 ### 服务端配置 创建 server.toml 文件: ```toml [server] bind_addr = "0.0.0.0:2333" [server.services.my_nas_ssh] token = "use_a_secret_that_only_you_know" bind_addr = "0.0.0.0:5202" ``` 启动服务端: ```bash ./rathole --server server.toml ``` ### 客户端配置 创建 client.toml 文件: ```toml [client] remote_addr = "myserver.com:2333" [client.services.my_nas_ssh] token = "use_a_secret_that_only_you_know" local_addr = "127.0.0.1:22" ``` 启动客户端: ```bash ./rathole --client client.toml ``` ### 验证连接 ```bash ssh -p 5202 myserver.com ``` ## 2. 多服务配置 可以在一个配置文件中定义多个服务: 客户端配置: ```toml [client] remote_addr = "myserver.com:2333" [client.services.ssh] token = "ssh_token" local_addr = "127.0.0.1:22" [client.services.web] token = "web_token" local_addr = "127.0.0.1:8080" [client.services.minecraft] token = "mc_token" local_addr = "127.0.0.1:25565" type = "tcp" ``` 服务端配置: ```toml [server] bind_addr = "0.0.0.0:2333" [server.services.ssh] token = "ssh_token" bind_addr = "0.0.0.0:5202" [server.services.web] token = "web_token" bind_addr = "0.0.0.0:5203" [server.services.minecraft] token = "mc_token" bind_addr = "0.0.0.0:5204" type = "tcp" ``` ## 3. UDP 服务转发 rathole 支持 UDP 协议转发: ```toml [client.services.quic] type = "udp" token = "quic_token" local_addr = "127.0.0.1:4433" ``` ```toml [server.services.quic] type = "udp" token = "quic_token" bind_addr = "0.0.0.0:4433" ``` # 五、进阶配置 ## 1. 传输层加密 rathole 支持三种传输模式:TCP、TLS、Noise。 ### TLS 加密 服务端配置: ```toml [server.transport] type = "tls" [server.transport.tls] pkcs12 = "identity.pfx" pkcs12_password = "your_password" ``` 客户端配置: ```toml [client.transport] type = "tls" [client.transport.tls] trusted_root = "ca.pem" hostname = "example.com" ``` ### Noise Protocol 加密 Noise Protocol 是现代的加密协议,无需证书: ```toml [client.transport] type = "noise" [client.transport.noise] pattern = "Noise_NK_25519_ChaChaPoly_BLAKE2s" local_private_key = "your_base64_key" remote_public_key = "server_base64_key" ``` ## 2. 代理连接 客户端可以通过代理连接服务端: ```toml [client.transport.tcp] proxy = "socks5://user:passwd@127.0.0.1:1080" ``` 支持 HTTP 和 SOCKS5 代理。 ## 3. 日志控制 通过环境变量控制日志级别: ```bash RUST_LOG=error ./rathole config.toml ``` 可用级别:error、warn、info、debug、trace 默认级别为 info。 ## 4. 性能调优 从 v0.4.7 开始,rathole 默认启用 TCP_NODELAY,这对延迟敏感的应用(如 RDP、Minecraft 服务器)有益,但会略微降低带宽。 如果带宽更重要,可以禁用: ```toml [client.transport.tcp] nodelay = false [server.transport.tcp] nodelay = false ``` 也可以针对单个服务配置: ```toml [client.services.my_service] nodelay = false ``` ## 5. 心跳与重连 客户端心跳配置: ```toml [client] heartbeat_timeout = 40 retry_interval = 1 ``` 服务端心跳配置: ```toml [server] heartbeat_interval = 30 ``` - heartbeat_interval:应用层心跳发送间隔,设为 0 禁用 - heartbeat_timeout:心跳超时时间,必须大于 server.heartbeat_interval - retry_interval:重连服务器的间隔 # 六、部署实战 ## 1. systemd 服务配置 创建 /etc/systemd/system/rathole-server.service: ```ini [Unit] Description=Rathole Server After=network.target [Service] Type=simple User=root ExecStart=/path/to/rathole --server /path/to/server.toml Restart=on-failure RestartSec=5s [Install] WantedBy=multi-user.target ``` 创建 /etc/systemd/system/rathole-client.service: ```ini [Unit] Description=Rathole Client After=network.target [Service] Type=simple User=root ExecStart=/path/to/rathole --client /path/to/client.toml Restart=on-failure RestartSec=5s [Install] WantedBy=multi-user.target ``` 启用并启动: ```bash systemctl daemon-reload systemctl enable rathole-server systemctl start rathole-server ``` ## 2. Docker 部署 服务端: ```bash docker run -d \ --name rathole-server \ -p 2333:2333 \ -p 5202:5202 \ -v /path/to/server.toml:/app/server.toml \ rapiz1/rathole --server /app/server.toml ``` 客户端: ```bash docker run -d \ --name rathole-client \ --network host \ -v /path/to/client.toml:/app/client.toml \ rapiz1/rathole --client /app/client.toml ``` # 七、性能对比 ## 1. 与 frp 的对比 rathole 在性能方面相比 frp 有显著优势: - **吞吐量**:HTTP 吞吐量更高 - **连接数**:能处理更多并发连接 - **内存占用**:显著低于 frp - **延迟**:与 frp 相当 ## 2. 性能基准 根据官方基准测试结果: - HTTP 吞吐量:比 frp 提升 2-3 倍(本地回环测试) - TCP 比特率:显著优于 frp - 内存占用:仅为 frp 的 30-50% 需要注意的是,这些测试是在本地回环环境下进行的,反映的是 CPU 限制场景下的性能。实际使用中,网络往往是瓶颈,此时性能提升可能不那么明显。但 rathole 的主要优势在于低资源消耗。 ## 3. 资源占用优化 rathole 的二进制文件可以编译至约 500KiB,非常适合: - 路由器等嵌入式设备 - 资源受限的 VPS - 需要同时运行多个服务的环境 # 八、常见问题 ## 1. 连接失败 **问题**:客户端无法连接到服务端 **排查**: - 检查服务端防火墙是否开放监听端口 - 确认 Token 配置是否一致 - 验证 remote_addr 地址和端口是否正确 - 查看服务端日志是否有连接记录 ## 2. 热重载不生效 **问题**:修改配置后服务未生效 **解决**: - 目前需要重启服务应用新配置 - HTTP API 配置功能正在开发中 ## 3. 性能不佳 **问题**:转发服务变慢 **排查**: - 检查客户端和服务端的网络延迟 - 确认没有启用不必要的代理 - 尝试调整 TCP_NODELAY 设置 - 检查本地服务本身是否有性能问题 *** ## 参考资料 1. [rathole GitHub 仓库](https://github.com/rathole-org/rathole) 2. [rathole 官方文档](https://github.com/rathole-org/rathole/blob/main/README.md) 最后修改:2026 年 03 月 19 日 © 允许规范转载 赞 如果觉得我的文章对你有用,请随意赞赏