OpenSSH Reverse Tunneling

Bei meinen Diensten beim Kunden kommt es immer wieder vor, dass eine Fernwartungsmöglichkeit gewünscht ist. Die Firewall des Kunden verbietet aber in der Regel Verbindungen von draußen auf das interne Netz. Wenn jedoch eine Möglichkeit gegeben ist, eine ausgehende SSH-Verbindung aufzubauen, so kann über diese Session eine Rückverbindung aufgebaut werden, mit der ich den Zugriff auf den Server (und das interne Netz) erhalte. OpenSSH Logo

Siehe auch: http://proxytunnel.sourceforge.net/ (Binaries available!)

Voraussetzungen

  • Verbindung ins Internet zu Port 22 (oder 443 – je nach Konfiguration des eigenen SSH-Servers)
  • root-Rechte werden nicht benötigt (außer bei ports ≤ 1024)

Schritte

  • Der Kunde baut eine Verbindung zu meinem Server auf
kunde@kundensystem$ ssh -R 10000:127.0.0.1:22 kundenaccount@my.server.ip 

Hierdurch wird port 10000 auf meinem Server aktiviert, um ein forwarding und alle weiteren Verbindungen auf Port 22 des Ziels einzustellen.

  • Diese Session darf nicht geschlossen werden (auch nicht durch Inaktivität) –> (Anpassungen in /etc/ssh/sshd_config)
  • Von my.server.ip kann ich jetzt eine Rückverbindung aufbauen mittels
ich@mysystem$ su - kundenaccount
kundenaccount@mysystem$ ssh -p 10000 -l kunde 127.0.0.1
  • Jetzt erscheit der Login des Kundensystems.

Timeout vorbeugen

Wir sollten sicherstellen, dass die SSH Session ohne Timeout geöffnet bleibt.

Datei: /etc/ssh/sshd_config auf meinem System

...
TCPKeepAlive yes
ClientAliveInterval 30
ClientAliveCountMax 99999
...

GatewayPorts

Wenn o.a. Beispiel über einen zusätzlichen Rechner in der Mitte funktionieren soll, muss das Feature “GatewayPorts” erlaubt werden.

Datei: /etc/ssh/sshd_config auf dem Rechner in der Mitte

...
GatewayPorts yes
...

Somit wird es ermöglicht, dass die forward-ports in der Mitte von dem anderen host erreicht werden können. Wenn die Rechte hierfür nicht ausreichen, dann kann man natürlich auch von dem Rechner direkt eine weitere SSH-Verbindung aufbauen auf 127.0.0.1:10000.

D.h. anstelle von

kunde@kundensystem$ ssh user@mitte -p 10000

schreibt man

kunde@kundensystem$ ssh user@mitte

und dann

user@mitte$ ssh user@localhost -p 10000

Verbesserungen

Wenn wir auf dem Kundensystem mittels

ssh-keygen -t dsa

ein private/public Schlüsselpaar erstellen und den Public-Key in die Datei “~kundenaccount/.ssh/authorized_keys” eintragen, kann eine Verbindung ohne Kennwort automatisiert aufgebaut werden.

ssh -R 10000:127.0.0.1:22 -N -f kundenaccount@my.server.ip 

Hierdurch wird eine SSH-Verbindung nur für den Tunnel aufgebaut und in den Hintergrund gelegt (-f = fork). Diesen Prozess können wir mittels cron prüfen und falls die Verbindung abgebrochen ist, automatisch wieder starten lassen. So ist eine Fernwartung weiterhin gewährleistet.

Damit die Verbindung aber auch mögliche Timeouts auf Kundenseite übersteht können wir durch

kundenaccout@myserver$ ssh -p 10000 -f "while : ; do echo X ; sleep 15; done" >/dev/null &

(alle 15 sec. 1 Zeichen) Traffic simulieren.

 
wissen/security/ssh/reverse_tunnel.txt · Zuletzt geändert: 05.09.2010 20:31
 
Recent changes RSS feed Donate Valid XHTML 1.0 Valid CSS Recent cached RSS feed cacert-signed web site: inhalt.serviert.de