當前位置: 妍妍網 > 碼農

rathole:基於Rust開發的輕量級高效能反向代理,替代frp和ngrok!

2024-06-06碼農

在當今互聯網環境中,許多裝置由於受到NAT(Network Address Translation)限制,很難直接從外部網路存取。然而,透過反向代理和隧道技術,我們可以將這些裝置暴露到互聯網上。多種此類工具已經存在,如frp和ngrok,但是這些工具在效能和資源消耗上存在一定的不足。本文將深入介紹一個新的替代方案:rathole。

rathole 是什麽?

rathole是一個使用Rust編寫的輕量級高效能反向代理,專為NAT穿透而設計,旨在替代frp和ngrok。它主要有以下幾個特點:

  • 高效能 :能夠比frp實作更高的吞吐量,並且在處理大量連線時更加穩定。

  • 低資源消耗 :消耗比類似工具少得多的記憶體,適合嵌入式裝置等資源受限的裝置。

  • 安全性 :透過強制的服務令牌認證和可選的Noise協定加密,提供了更高的安全性。

  • 熱多載 :可以透過熱多載配置檔動態添加或移除服務。

  • 快速入門

    要開始使用rathole,您需要一個具有公共IP的伺服器和一個在NAT後面的裝置。假設您在NAT後的家用網路附加儲存(NAS)上執行了一個SSH服務,並希望將其暴露到互聯網上。可以透過以下步驟實作:

    在具有公共IP的伺服器上

    建立並編輯 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"

    啟動伺服器:

    ./rathole server.toml

    在NAT後面的裝置 (例如NAS) 上

    建立並編輯 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"

    啟動客戶端:

    ./rathole client.toml

    現在,客戶端會嘗試連線到伺服器 myserver.com 的埠 2333 ,並將任何到達 myserver.com:5202 的流量轉發到客戶端的 22 埠。您可以透過SSH連線到 myserver.com:5202 來存取您的NAS。

    配置詳解

    rathole可以透過配置檔自動確定執行模式(伺服器或客戶端),根據配置檔中是否包含 [server] [client] 塊來決定。如果希望顯式指定執行模式,可以使用命令列選項 --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:[email protected]: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"


    伺服器配置

    [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使用環境變量來控制日誌級別。支持的日誌級別包括 info , warn , error , debug , trace 。例如,執行以下命令可以僅記錄錯誤級別的日誌資訊:

    RUST_LOG=error ./rathole config.toml

    如果未設定 RUST_LOG ,預設日誌級別為 info

    效能調優

    從v0.4.7起,rathole預設啟用 TCP_NODELAY ,這有助於降低延遲,適用於互動式應用程式如rdp和Minecraft伺服器。如果頻寬更重要,可以透過設定 nodelay = false 來禁用此選項。

    效能基準

    rathole的延遲與frp相近,但可以處理更多的連線,提供更大的頻寬,並且記憶體使用更少。

    然而需註意,rathole不能神奇地使轉發服務的速度比以前快數倍。基準測試是在本地回環上進行的,主要展示的是CPU受限情況下的效能。如果網路不是瓶頸,則會帶來不小的提升。不幸的是,這種情況對於許多使用者來說並不常見。這種情況下,主要的好處是較低的資源消耗,而頻寬和延遲可能不會顯著改善。

    總結

    透過本文介紹,您應該對rathole有了深入的了解。作為一個基於Rust開發的高效能反向代理工具,rathole在效能和資源消耗上具有顯著優勢,並且提供了靈活的配置方式和優秀的安全性選擇。如果您正在尋找一種新型的解決方案來替代frp或ngrok,rathole無疑是一個值得嘗試的選擇。

    文章精選

    「Rust

    關註公眾號並回復 」rathole「 立即獲取計畫地址