Rathole:基于Rust開(kāi)發(fā)的輕量級(jí)高性能反向代理,替代Frp和Ngrok!
在當(dāng)今互聯(lián)網(wǎng)環(huán)境中,許多設(shè)備由于受到NAT(Network Address Translation)限制,很難直接從外部網(wǎng)絡(luò)訪問(wèn)。然而,通過(guò)反向代理和隧道技術(shù),我們可以將這些設(shè)備暴露到互聯(lián)網(wǎng)上。多種此類工具已經(jīng)存在,如frp和ngrok,但是這些工具在性能和資源消耗上存在一定的不足。本文將深入介紹一個(gè)新的替代方案:rathole。
rathole 是什么?
rathole是一個(gè)使用Rust編寫(xiě)的輕量級(jí)高性能反向代理,專為NAT穿透而設(shè)計(jì),旨在替代frp和ngrok。它主要有以下幾個(gè)特點(diǎn):
- 高性能:能夠比f(wàn)rp實(shí)現(xiàn)更高的吞吐量,并且在處理大量連接時(shí)更加穩(wěn)定。
- 低資源消耗:消耗比類似工具少得多的內(nèi)存,適合嵌入式設(shè)備等資源受限的設(shè)備。
- 安全性:通過(guò)強(qiáng)制的服務(wù)令牌認(rèn)證和可選的Noise協(xié)議加密,提供了更高的安全性。
- 熱重載:可以通過(guò)熱重載配置文件動(dòng)態(tài)添加或移除服務(wù)。
快速入門
要開(kāi)始使用rathole,您需要一個(gè)具有公共IP的服務(wù)器和一個(gè)在NAT后面的設(shè)備。假設(shè)您在NAT后的家用網(wǎng)絡(luò)附加存儲(chǔ)(NAS)上運(yùn)行了一個(gè)SSH服務(wù),并希望將其暴露到互聯(lián)網(wǎng)上。可以通過(guò)以下步驟實(shí)現(xiàn):
在具有公共IP的服務(wù)器上
創(chuàng)建并編輯server.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"啟動(dòng)服務(wù)器:
./rathole server.toml在NAT后面的設(shè)備 (例如NAS) 上
創(chuàng)建并編輯client.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"啟動(dòng)客戶端:
./rathole client.toml現(xiàn)在,客戶端會(huì)嘗試連接到服務(wù)器myserver.com的端口2333,并將任何到達(dá)myserver.com:5202的流量轉(zhuǎn)發(fā)到客戶端的22端口。您可以通過(guò)SSH連接到myserver.com:5202來(lái)訪問(wèn)您的NAS。
配置詳解
rathole可以通過(guò)配置文件自動(dòng)確定運(yùn)行模式(服務(wù)器或客戶端),根據(jù)配置文件中是否包含[server]或[client]塊來(lái)決定。如果希望顯式指定運(yùn)行模式,可以使用命令行選項(xiàng)--server或--client。
示例配置文件如下:
客戶端配置
[client]
remote_addr = "example.com:2333"
default_token = "default_token_if_not_specify"
heartbeat_timeout = 40
retry_interval = 1
[client.transport]
type = "tcp"
[client.transport.tcp]
proxy = "socks5://user:passwd@127.0.0.1:1080"
nodelay = true
keepalive_secs = 20
keepalive_interval = 8
[client.services.service1]
type = "tcp"
token = "whatever"
local_addr = "127.0.0.1:1081"
nodelay = true
retry_interval = 1
[client.services.service2]
local_addr = "127.0.0.1:1082"服務(wù)器配置
[server]
bind_addr = "0.0.0.0:2333"
default_token = "default_token_if_not_specify"
heartbeat_interval = 30
[server.transport]
type = "tcp"
[server.transport.tcp]
nodelay = true
keepalive_secs = 20
keepalive_interval = 8
[server.services.service1]
type = "tcp"
token = "whatever"
bind_addr = "0.0.0.0:8081"
nodelay = true
[server.services.service2]
bind_addr = "0.0.0.1:8082"日志管理
rathole使用環(huán)境變量來(lái)控制日志級(jí)別。支持的日志級(jí)別包括info, warn, error, debug, trace。例如,運(yùn)行以下命令可以僅記錄錯(cuò)誤級(jí)別的日志信息:
RUST_LOG=error ./rathole config.toml如果未設(shè)置RUST_LOG,默認(rèn)日志級(jí)別為info。
性能調(diào)優(yōu)
從v0.4.7起,rathole默認(rèn)啟用TCP_NODELAY,這有助于降低延遲,適用于交互式應(yīng)用程序如rdp和Minecraft服務(wù)器。如果帶寬更重要,可以通過(guò)設(shè)置nodelay = false來(lái)禁用此選項(xiàng)。
性能基準(zhǔn)
rathole的延遲與frp相近,但可以處理更多的連接,提供更大的帶寬,并且內(nèi)存使用更少。
然而需注意,rathole不能神奇地使轉(zhuǎn)發(fā)服務(wù)的速度比以前快數(shù)倍。基準(zhǔn)測(cè)試是在本地回環(huán)上進(jìn)行的,主要展示的是CPU受限情況下的性能。如果網(wǎng)絡(luò)不是瓶頸,則會(huì)帶來(lái)不小的提升。不幸的是,這種情況對(duì)于許多用戶來(lái)說(shuō)并不常見(jiàn)。這種情況下,主要的好處是較低的資源消耗,而帶寬和延遲可能不會(huì)顯著改善。
總結(jié)
通過(guò)本文介紹,您應(yīng)該對(duì)rathole有了深入的了解。作為一個(gè)基于Rust開(kāi)發(fā)的高性能反向代理工具,rathole在性能和資源消耗上具有顯著優(yōu)勢(shì),并且提供了靈活的配置方式和優(yōu)秀的安全性選擇。如果您正在尋找一種新型的解決方案來(lái)替代frp或ngrok,rathole無(wú)疑是一個(gè)值得嘗試的選擇。





























