Ein Befehlszeilentool zum Tunneln von UDP-Datagrammen über TCP.
Es ist besonders nützlich für das Tunneln von UDP über SSH
Das Tool wurde in erster Linie für den Anwendungsfall entwickelt, bei dem zwei Anwendungen über UDP miteinander kommunizieren müssen, ohne dass eine offensichtliche Client-Server-Beziehung besteht. Das heißt, jede Anwendung kann ein Paket initiieren und muss beim Start mit der Adresse der anderen Anwendung konfiguriert werden (dh Ports dürfen nicht zufällig sein).
Sie führen udp-over-tcp
auf den Hosts beider Anwendungen aus. Jede Instanz fungiert als eine Art lokales Replikat der Anwendung, die auf der anderen Instanz ausgeführt wird. Wenn die Anwendung auf einem Host den UDP-Port P überwacht, überwacht udp-over-tcp
den UDP-Port P des anderen Hosts und stellt sicher, dass der Datenverkehr zum Replikat P zum Port P der realen Anwendung geleitet wird. Entscheidend udp-over-tcp
führt dies für die Ports beider Anwendungen gleichzeitig aus und verbindet die Ports. Es wird praktisch so getan, als ob jede Anwendung lokal für die andere ausgeführt wird.
Konkret ausgedrückt: Wenn die Anwendung auf einem Host ein Datagramm von ihrem Port P an (lokales Replikat) Port Q sendet, kommt das Datagramm am Port Q der realen (entfernten) Anwendung mit dem Quellport P an. Dies bedeutet, dass eine Anwendung immer dieselbe einzelne Adresse (localhost) und denselben Port (den Port der anderen Anwendung) sieht und dasselbe Adresse-Host-Paar auch in der Peer-Konfiguration für die Anwendung verwendet werden kann.
Hoffentlich kann das folgende Diagramm zum Verständnis des udp-over-tcp
konfigurierten Setups beitragen:
Das Programm ist für eine Reihe von Plattformen vorkompiliert (danke, Cargo-Dist!) und sollte ohne Abhängigkeiten sofort ausführbar sein.
Alternativ können Sie es über Cargo mit installieren
$ cargo install udp-over-tcp
Sie haben eine UDP-Anwendung, die auf Host wie folgt:
Erstellen Sie auf einem der beiden Hosts (hier X) zunächst einen TCP-Tunnel zum anderen Host:
ssh -L 7878:127.0.0.1:7878 $Y
Als nächstes führen Sie udp-over-tcp auf beiden Hosts aus, einen mit --tcp-listen
und einen mit --tcp-connect
. --tcp-listen
sollte auf dem Host verwendet werden, zu dem die Weiterleitung eine Verbindung zulässt (hier Y). Sie können sie in beliebiger Reihenfolge ausführen, es empfiehlt sich jedoch, zuerst zuzuhören:
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
Auf Y überwacht dies den UDP-Port $A, leitet diese über TCP an X weiter und übermittelt sie dann dort an den UDP-Port $A. Auf X überwacht dies den UDP-Port $B, leitet diese über TCP an Y weiter und liefert sie dann dort an den UDP-Port $B.
Konfigurieren Sie nun die Anwendung auf Mit anderen Worten: gleicher Port, lokale IP-Adresse.
Jedes Argument benötigt eine Portnummer (wie oben) oder addr:port, um die Adresse anzugeben. (Die Adresse ist standardmäßig 0.0.0.0 für Listen/Bind und 127.0.0.1 für Connect/Sendto.)
Es gibt andere Tools, die bei diesem Problem helfen können, obwohl sie andere Eigenschaften als dieses Tool haben.
Lösungen, die auf nc
oder socat
basieren, behalten die UDP-Datagrammgrenzen nicht bei, was bedeutet, dass zwei UDP- sendmsg
dazu führen können, dass nur eine einzige (kombinierte) Nachricht über recvfrom
ankommt. Viele UDP-Anwendungen sind hiergegen nicht widerstandsfähig, da sie für das Nachrichten-Framing auf UDP angewiesen sind.
Mullvads udp-over-tcp bietet nur unidirektionale Weiterleitung. Man kann zusätzliche Instanzen des Tools ausführen, um in die andere Richtung weiterzuleiten. Dies bedeutet jedoch, dass der Quellport eingehender Datagramme nicht mit dem Zielport ausgehender Datagramme übereinstimmt. Dies ist jedoch wahrscheinlich für Anwendungen im Client-Server-Stil in Ordnung, bei denen der Port des Clients keine Rolle spielt.
Lizenziert unter einem von beiden
nach Ihrer Wahl.
Sofern Sie nicht ausdrücklich etwas anderes angeben, unterliegt jeder Beitrag, der von Ihnen absichtlich zur Aufnahme in das Werk eingereicht wird, wie in der Apache-2.0-Lizenz definiert, einer Doppellizenz wie oben, ohne zusätzliche Bedingungen oder Konditionen.