用於透過 TCP 隧道傳輸 UDP 資料封包的命令列工具。
它對於透過 SSH 建立 UDP 隧道特別有用
該工具主要針對以下用例而設計:您有兩個應用程式需要透過 UDP 相互通信,而沒有明顯的客戶端-伺服器關係。也就是說,任一應用程式都可以發起資料包,並且必須在啟動時配置另一個應用程式的位址(即連接埠不能是隨機的)。
您在兩個應用程式的主機上執行udp-over-tcp
。每個實例都充當另一個實例上運行的應用程式的本機副本。如果一台主機上的應用程式偵聽 UDP 連接埠 P,則udp-over-tcp
將偵聽另一台主機上的UDP 連接埠P,並確保到副本P 的流量流向真實應用程式的連接埠P。重要的是, udp-over-tcp
將同時對兩個應用程式的連接埠執行此操作並綁定連接埠。它將有效地“假裝”每個應用程式都在另一個應用程式本地運行。
具體來說,如果一台主機上的應用程式從其連接埠 P 向(本地副本)連接埠 Q 發送資料報,則該資料報將到達真實(遠端)應用程式的連接埠 Q ,來源連接埠為 P 。這意味著應用程式始終會看到相同的單一位址(本機主機)和連接埠(另一個應用程式的連接埠),並且該相同的位址-主機對也可以在應用程式的對等配置中使用。
希望下圖可以幫助您理解udp-over-tcp
配置的設定:
該程式針對多種平台進行了預編譯(感謝cargo-dist!),並且應該可以開箱即用,沒有依賴項。
或者,您可以透過 Cargo 安裝它
$ cargo install udp-over-tcp
您有一個在主機X 的連接埠A 上執行的UDP 應用程式。進行通信。
在任一主機(此處為 X)上,先建立到另一主機的 TCP 隧道:
ssh -L 7878:127.0.0.1:7878 $Y
接下來,在兩台主機上執行 udp-over-tcp,一台使用--tcp-listen
,另一台使用--tcp-connect
。 --tcp-listen
應該在轉送允許連線的主機上使用(此處為Y)。您可以按任一順序運行它們,但最佳實踐是先聽:
Y $ udp-over-tcp --tcp-listen 7878 --udp-bind $A --udp-sendto $B
X $ udp-over-tcp --tcp-connect 7878 --udp-bind $B --udp-sendto $A
在 Y 上,這將偵聽 UDP 連接埠 $A,透過 TCP 將這些轉送到 X,然後將它們傳送到那裡的 UDP 連接埠 $A。在 X 上,這將偵聽 UDP 連接埠 $B,透過 TCP 將這些轉送到 Y,然後將它們傳遞到那裡的 UDP 連接埠 $B。
現在將 X 上的應用程式設定為傳送至 127.0.0.1:$B,並將 Y 上的應用程式設定為傳送至 127.0.0.1:$A。換句話說,相同的連接埠、本地IP位址。
每個參數都採用連接埠號碼(如上所述)或 addr:port 來指定位址。 (監聽/綁定的位址預設為 0.0.0.0,連接/發送的位址預設為 127.0.0.1)
還有其他工具可以幫助解決此問題,儘管它們具有與此工具不同的屬性。
依賴nc
或socat
解決方案不會保留 UDP 資料封包邊界,這表示兩個 UDP sendmsg
只能導致一個(組合的)訊息經由recvfrom
到達。許多 UDP 應用程式對此沒有彈性,因為它們依賴 UDP 提供訊息幀。
mullvad 的 udp-over-tcp 僅提供單向轉送。人們可以運行該工具的其他實例以向另一個方向轉發,儘管這樣做意味著傳入資料封包的來源連接埠將與傳出資料封包的目標連接埠不符。然而,這對於客戶端-伺服器類型的應用程式來說可能很好,因為客戶端的連接埠並不重要。
已獲得以下任一許可
由您選擇。
除非您另有明確說明,否則您有意提交的包含在作品中的任何貢獻(如 Apache-2.0 許可證中所定義)均應獲得上述雙重許可,沒有任何附加條款或條件。