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.
Siehe auch: http://proxytunnel.sourceforge.net/ (Binaries available!)
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.
ich@mysystem$ su - kundenaccount kundenaccount@mysystem$ ssh -p 10000 -l kunde 127.0.0.1
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 ...
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
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.