返回目录
开源项目系统与运维类新手

rathole:用 Rust 编写的轻量高性能 NAT 穿透反向代理(frp / ngrok 替代方案)

rathole 是一个使用 Rust 编写的安全、稳定、高性能的反向代理,用于 NAT 穿透。它通过一台具有公网 IP 的服务器,把位于 NAT 之后的设备上的服务暴露到互联网,用法与 frp、ngrok 类似。项目主打高吞吐、低内存占用(二进制可小至约 500KiB)、服务级强制 Token 认证、可选 Noise Protocol 加密与 TLS 支持,以及通过热重载配置文件动态增删服务。

0 次阅读2026/09/15 发布
rathole:用 Rust 编写的轻量高性能 NAT 穿透反向代理(frp / ngrok 替代方案) 来源图片

社区作者 · zZz

它解决什么问题

rathole 是一个用 Rust 编写的、面向 NAT 穿透的安全稳定高性能反向代理。与 frp、ngrok 类似,它可以借助一台具有公网 IP 的服务器,把位于 NAT 之后设备上的服务暴露到互联网。

【项目定位】 项目页给出的简述为:A secure, stable and high-performance reverse proxy for NAT traversal, written in Rust;可将 NAT 后设备上的服务通过公网 IP 服务器暴露到互联网。配图 1 为项目 logo。

【核心特性】

  1. 高性能:相比 frp 可实现更高的吞吐量,在处理大量连接时更稳定,详见 Benchmark。
  1. 低资源占用:内存消耗远低于同类工具;二进制体积可小至约 500KiB,以适应路由器等嵌入式设备的限制。
  1. 安全:服务 Token 为强制且按服务(service-wise)配置;服务端与客户端各自负责自己的配置;可选启用 Noise Protocol,便于完成加密配置,无需创建自签名证书;同时支持 TLS。
  1. 热重载:可通过热重载配置文件动态添加或移除服务。HTTP API 仍在开发中(WIP)。

【性能基准】 项目页说明 rathole 的延迟与 frp 相近,但能处理更多连接、提供更大带宽,并且内存占用更少,详见单独的 Benchmark 页面;相关图示见配图 2(http_throughput)、配图 3(tcp_bitrate)、配图 4(udp_bitrate)、配图 5(mem-graph)。 页面同时提示:不要据此认为 rathole 能把被转发的服务神奇地提速数倍。

该基准测试在本地回环(local loopback)上进行,反映的是 CPU 受限时的性能表现;在网络不是瓶颈时可以获得相当程度的提升,但对很多用户而言网络本身就是瓶颈,此时主要收益是更低的资源消耗,带宽与延迟未必有显著改善。

【配置说明】 如果配置文件中只存在 [server] 和 [client] 之一,rathole 会根据配置内容自动判断运行在服务端模式还是客户端模式(如 Quickstart 示例)。两者也可以放在同一个文件里,此时需在服务端运行 rathole --server config.toml,在客户端运行 rathole --client config.toml 显式指定运行模式。 页面建议在阅读完整配置规范前,先浏览配置示例以熟悉配置格式;加密与 transport 块的更多细节见 Transport 文档。

完整配置规范(节选要点):

  • [client]:remote_addr 为必填,指服务器地址;default_token 可选,作为服务未单独定义 Token 时的默认值;heartbeat_timeout 可选,设为 0 可禁用应用层心跳测试,该值必须大于 server.heartbeat_interval,默认 40 秒;retry_interval 可选,为重连服务器的间隔,默认 1 秒。
  • [client.transport]:整块可选,type 可选值为 ["tcp", "tls", "noise"],默认 "tcp"。
  • [client.transport.tcp]:同样影响 noise 与 tls;proxy 可选,支持 http 与 socks5(示例为 socks5://user:[email protected]:1080);nodelay 可选,默认 true,启用 TCP_NODELAY 可改善延迟但降低带宽;keepalive_secs 默认 20 秒;keepalive_interval 默认 8 秒。
  • [client.transport.tls]:当 type 为 "tls" 时必填;trusted_root 必填,为签发服务器证书的 CA 证书;hostname 可选,用于校验证书,未设置时回退到 client.remote_addr。
  • [client.transport.noise]:pattern 可选,默认 Noise_NK_25519_ChaChaPoly_BLAKE2s;local_private_key、remote_public_key 可选(base64 编码)。
  • [client.transport.websocket]:当 type 为 "websocket" 时必填;tls 为 true 时使用 client.transport.tls 中的设置。
  • [client.services.service1]:服务名可任意,但必须与服务端配置中的名称一致;type 可选,可选值为 ["tcp", "udp"],默认 "tcp";token 在未设置 client.default_token 时必填;local_addr 必填,为需要转发的服务地址;nodelay 可选,可覆盖 client.transport.nodelay;retry_interval 可选,默认继承全局配置。可定义多个服务(如 [client.services.service2])。
  • [server]:bind_addr 必填,为服务器监听客户端的地址,通常只需修改端口;default_token 可选;heartbeat_interval 可选,默认 30 秒,设为 0 可禁用心跳发送。
  • [server.transport] 与 [client.transport] 相同;[server.transport.tls] 在 type 为 "tls" 时必填,需要 pkcs12(服务器证书与私钥的 pkcs12 文件)与 pkcs12_password(pkcs12 文件密码)。
  • [server.services.service1]:服务名必须与客户端一致;type 可选,同客户端;token 在未设置 server.default_token 时必填;bind_addr 必填,为服务对外暴露的地址,通常只需修改端口;nodelay 可选。

【日志】 与许多 Rust 程序一样,rathole 通过环境变量控制日志级别,可选 info、warn、error、debug、trace。例如 RUST_LOG=error ./rathole config.toml 表示仅输出 error 级别日志;如果未设置 RUST_LOG,默认日志级别为 info。

【调优】 从 v0.4.7 起,rathole 默认启用 TCP_NODELAY,这有利于延迟敏感与交互式应用(如 rdp、Minecraft 服务器),但会略微降低带宽。如果带宽更重要,可用 nodelay = false 关闭该选项。

【后续规划】

项目页另有 Out of Scope 列表,说明不计划实现哪些特性及其原因。

  • 用于配置的 HTTP API。

— 本文由 AI 根据公开来源辅助整理,命令、版本与许可证请在使用前到原始页面复核。

安装 / 开始使用

以下步骤整理自项目页 Quickstart 与相关说明,建议按顺序执行。

一、准备环境

  • 一台具有公网 IP 的服务器(运行服务端)。
  • 一台位于 NAT 之后、需要暴露服务的设备(运行客户端,例如家中的 NAS)。
  • 获取 rathole 的三种方式:从 release page 下载功能完整的已发布版本;或从源码构建(适用于其他平台,并可最小化二进制体积);项目同时提供 Docker 镜像。

二、服务端(公网 IP 服务器)

  1. 创建 server.toml,并按需调整内容:

server.toml

[server] bind_addr = "0.0.0.0:2333" # 2333 指定 rathole 监听客户端的端口

[server.services.my_nas_ssh] token = "use_a_secret_that_only_you_know" # 用于认证该服务客户端的 Token,改成任意值 bind_addr = "0.0.0.0:5202" # 5202 指定把 my_nas_ssh 暴露到互联网的端口

  1. 运行:
命令
./rathole server.toml

三、客户端(NAT 之后的设备,例如你的 NAS)

  1. 创建 client.toml,并按需调整内容:

client.toml

[client] remote_addr = "myserver.com:2333" # 服务器地址;端口必须与 server.bind_addr 中的端口一致

[client.services.my_nas_ssh] token = "use_a_secret_that_only_you_know" # 必须与服务端一致才能通过校验 local_addr = "127.0.0.1:22" # 需要转发的服务地址

  1. 运行:
命令
./rathole client.toml

四、首次运行与验证 客户端会尝试连接服务器 myserver.com 的 2333 端口,所有发往 myserver.com:5202 的流量都会被转发到客户端的 22 端口。因此可以用 ssh myserver.com:5202 登录到你的 NAS。

五、运行模式与后台运行

  • 若配置文件中只包含 [server] 与 [client] 其中之一,rathole 会自动判断运行模式;若两块写在同一文件中,则服务端运行 rathole --server config.toml,客户端运行 rathole --client config.toml。
  • 在 Linux 上把 rathole 作为后台服务运行,可参考项目提供的 systemd examples。

六、日志控制

使用环境变量 RUST_LOG 控制日志级别,可选 info、warn、error、debug、trace。例如

使用环境变量 RUST_LOG 控制日志级别,可选 info、warn、error、debug、trace。例如
RUST_LOG=error ./rathole config.toml 仅输出 error 级别日志;未设置 RUST_LOG 时默认级别为 info。

七、调优 从 v0.4.7 起默认启用 TCP_NODELAY,有利于 rdp、Minecraft 服务器等延迟敏感和交互式应用,但会略微降低带宽;若带宽更重要,可设置 nodelay = false。

八、常见问题与注意事项

  • Token:Token 是强制的、按服务配置;客户端 Token 必须与服务端对应服务的 Token 完全一致才能通过校验。也可通过 default_token 提供默认值。
  • 端口对应:client.remote_addr 中的端口必须与 server.bind_addr 中的端口相同。
  • 服务名对应:客户端与服务端同一服务的名称必须完全一致(示例中均为 my_nas_ssh)。
  • 心跳配合:client.heartbeat_timeout 必须大于 server.heartbeat_interval;将其设为 0 可禁用应用层心跳测试,将 server.heartbeat_interval 设为 0 可禁用心跳发送。
  • 加密:可选 Noise Protocol(无需自签名证书)或 TLS(服务端需提供 pkcs12 证书与密码,客户端需提供 trusted_root CA 证书,hostname 未设置时回退到 client.remote_addr)。
  • 性能预期:基准测试在本地回环上进行,反映 CPU 受限时的表现;若网络本身是瓶颈,主要收益是更低的资源占用,带宽与延迟未必显著改善。

来源教程配图

rathole-logo
配图 1 · rathole-logo查看原图
http_throughput
配图 2 · http_throughput查看原图
tcp_bitrate
配图 3 · tcp_bitrate查看原图
udp_bitrate
配图 4 · udp_bitrate查看原图
mem
配图 5 · mem查看原图

适用场景

把家中 NAS 的 SSH 服务通过公网服务器暴露到互联网(示例场景)
将 NAT 或防火墙之后的自托管服务(Web
远程桌面
游戏服务器等)发布到公网
作为 frp
ngrok 的替代方案进行内网穿透
在路由器等资源受限的嵌入式设备上运行(二进制可小至约 500KiB)
通过 TCP/UDP 转发承载需要大量并发连接的业务
为延迟敏感的交互式应用(如 rdp
Minecraft 服务器)提供转发
并可用 nodelay 调优
在 Linux 上以 systemd 后台服务方式长期运行内网穿透服务