it-swarm.com.de

UDP-Verkehr durch SSH-Tunnel

Der Titel bringt es auf den Punkt. Ich möchte UDP-Verkehr über einen SSH-Tunnel senden. Insbesondere muss ich in der Lage sein, UDP-Pakete durch den Tunnel zu senden, und der Server muss in der Lage sein, sie an mich auf der anderen Seite zurückzusenden. Ich kann es für TCP Verbindungen tun. Ist das mit UDP möglich?

63
heavyd

In diesem kleinen Handbuch erfahren Sie, wie Sie UDP-Datenverkehr über SSH mit den Standard-Tools (ssh, nc, mkfifo) der meisten UNIX-ähnlichen Betriebssysteme senden.

Durchführen eines UDP-Tunnels über eine SSH-Verbindung

Schritt für Schritt Öffnen Sie mit Ihrer SSH-Verbindung einen TCP Forward-Port

Stellen Sie auf Ihrem lokalen Computer (lokal) über SSH mit der zusätzlichen Option -L eine Verbindung zum entfernten Computer (Server) her, sodass SSH mit TCP port-forward:

local# ssh -L 6667:localhost:6667 server.foo.com

Auf diese Weise können TCP Verbindungen auf der Portnummer 6667 Ihres lokalen Computers über den sicheren Kanal an die Portnummer 6667 auf server.foo.com weitergeleitet werden. Richten Sie das TCP für die UDP-Weiterleitung auf dem Server ein

Auf dem Server öffnen wir einen Listener auf dem TCP -Port 6667, der Daten an den UDP-Port 53 einer angegebenen IP weiterleitet. Wenn Sie wie ich DNS-Weiterleitungen durchführen möchten, können Sie die IP des ersten Nameservers verwenden, die Sie in der Datei /etc/resolv.conf finden. Aber zuerst müssen wir ein FIFO erstellen. Das FIFO ist für die bidirektionale Kommunikation zwischen den beiden Kanälen erforderlich. Eine einfache Shell-Pipe überträgt nur die Standardausgabe des linken Prozesses an die Standardeingabe des rechten Prozesses.

server# mkfifo /tmp/fifo
server# nc -l -p 6667 < /tmp/fifo | nc -u 192.168.1.1 53 > /tmp/fifo

Auf diese Weise kann TCP Datenverkehr auf dem Port 6667 des Servers an UDP-Datenverkehr auf dem Port 53 von 192.168.1.1 weitergeleitet werden, und die Antworten werden zurückgesendet. Richten Sie UDP auf Ihrem Computer so ein, dass es TCP weiterleitet

Jetzt müssen wir das Gegenteil von dem machen, was oben auf dem lokalen Rechner gemacht wurde. Sie benötigen privilegierten Zugriff, um den UDP-Port 53 zu binden.

local# mkfifo /tmp/fifo
local# Sudo nc -l -u -p 53 < /tmp/fifo | nc localhost 6667 > /tmp/fifo

Auf diese Weise kann UDP-Datenverkehr auf Port 53 des lokalen Computers an TCP Datenverkehr auf Port 6667 des lokalen Computers weitergeleitet werden. Viel Spaß mit Ihrem lokalen DNS-Server :)

Wie Sie jetzt wahrscheinlich erraten haben, wird auf dem lokalen Computer eine DNS-Abfrage ausgeführt, z. Auf dem lokalen UDP-Port 53 wird es an den lokalen TCPPort 6667 weitergeleitet, dann an den TCPPort 6667 des Servers und dann an den DNS-Server des Servers, UDP-Port 53 von 192.168.1.1. Um DNS-Dienste auf Ihrem lokalen Computer nutzen zu können, geben Sie in Ihrer /etc/resolv.conf die folgende Zeile als ersten Nameserver ein:

nameserver 127.0.0.1
35
John T

Dieses Beispiel (ich glaube, Johns Antwort zeigt dasselbe an einer anderen Stelle) beschreibt, wie man über TCP/IP auf die UDP/DNS-Dienste eines anderen Computers zugreift. SSH-Verbindung.

Wir leiten lokalen UDP/53-Verkehr an TCP weiter, dann TCP Verkehr mit dem Portweiterleitungsmechanismus von SSH an den anderen Rechner, dann TCP an UDP/53 am anderen Ende.
Normalerweise können Sie dies mit openvpn tun.
Aber hier machen wir es mit einfacheren Tools, nur mit openssh und netcat.

Am Ende dieser Seite befindet sich ein weiterer Kommentar mit einem Verweis auf ' socat '.
Derselbe UDP/DNS-Zugriff erfolgt mit,

Serverseite: socat tcp4-listen:5353,reuseaddr,fork UDP:nameserver:53
Clientseite: socat udp4-listen:53,reuseaddr,fork tcp:localhost:5353

Weitere Informationen finden Sie in socat-Beispielen .

24
nik

SSH (mindestens OpenSSH) unterstützt einfache VPNs. Mit der Option -w oder Tunnel im ssh-Client können Sie an beiden Enden ein tun-Gerät erstellen, das zum Weiterleiten von IP-Verkehr jeder Art verwendet werden kann. (Siehe auch Tunnel in der Manpage von ssh_config(5) .) Beachten Sie, dass hierfür an beiden Enden OpenSSH (und möglicherweise Root-Rechte) erforderlich sind.

20
grawity

Oder Sie können einfach ssf (das für diesen Anwendungsfall entwickelt wurde) mit einem einfachen Befehl verwenden:


Client Seite:

#>./ssfc -U 53:192.168.1.1:53 server.foo.com

Dieser Befehl leitet den lokalen Port 53 (DNS) über einen sicheren Tunnel zwischen localhost und server.foo.com zu 192.168.1.1 Port 53 um.


Sie benötigen einen SSF-Server (anstelle von - oder neben - Ihrem SSH-Server):

#>./ssfs

Übrigens arbeiten sowohl die Client- als auch die Serverseite von ssf unter Windows/Linux/Mac. Dies ist eine Userland-Anwendung, sodass Sie weder Tun/Tap noch VPN benötigen.

Um Port 53 umzuleiten, benötigen Sie Administratorrechte - unabhängig vom verwendeten Tool.

Für weitere Informationen, Details, Anwendungsfälle oder Download: https://securesocketfunneling.github.io/ssf/

14
ssf-developers

Ich konnte nc nicht für SNMP zum Laufen bringen, da SNMP-Clients weiterhin einen neuen Quell-UDP-Port auswählen und mehrere gleichzeitig aktiv sein können.

Stattdessen habe ich in diesem Blog-Beitrag einen Beitrag geschrieben, in dem am Beispiel von SNMP beschrieben wird, wie man es mit socat macht. Im Wesentlichen mit zwei Terminals, beginnend mit einer Übersicht:

overview

Terminal eins:

client$ ssh -L 10000:localhost:10000 server
server$ socat -T10 TCP4-LISTEN:10000,fork UDP4:switch:161

Dadurch wird die SSH-Weiterleitung von TCP Port 10000 erstellt und socat auf dem Server ausgeführt. Beachten Sie, wie die IP-Adresse des Switches in der socat-Befehlszeile als "switch" angegeben wird.

Terminal zwei:

client$ Sudo socat UDP4-LISTEN:161,fork TCP4:localhost:10000

Das setzt socat auf dem Klienten fest. Das sollte es tun.

9
Peter V. Mørch

Ein VPN ist eine bessere Lösung, wenn Sie Zugriff auf einen UDP-Port haben.

Wenn Sie nur Zugriff auf den TCP-SSH-Port haben, ist ein SSH-Tunnel mindestens für Ping und Packet Backtracking so gut wie ein VPN.

4
Michael