Linux-PCs und Ein-Platinen-Computer wie der Raspberry Pi sind als SSH-Server oder als SSH-Gateway schnell eingerichtet. Dazu braucht es wenig mehr als die Installation des Open-SSH-Servers. Der Router des Netzwerks muss den gewünschten Port für das SSH-Protokoll an den Linux-Rechner im internen Netzwerk weiterleiten. Zudem braucht der Router an einem DSL-Anschluss für seine wechselnde externe IP einen dynamischen Domainnamen von kostenlosen Diensten wie No-IP ( https://www.noip.com ) oder Freedns ( https://freedns.afraid.org ).
Steht der Linux-Rechner allerdings in einem fremden Netzwerk oder in der IT-Infrastruktur einer größeren Firma, dann scheidet solche Einrichtung einer Portweiterleitung auf eigene Faust aus. Es gibt aber einen Weg, mit etwas Vorbereitung von außen per SSH auf einen Linux-Rechner hinter Router und Firewall zu kommen.
Auch interessant VPN mit dem Raspberry Pi – so geht’s
Die Rolle rückwärts
Die Lösung lautet „Reverse SSH“ und kommt ohne Konfiguration von Router oder Firewall aus. Dabei öffnet SSH mit einem „Remote Port“ aktiv eine Verbindung nach außen zu einem anderen Linux-System im Internet. Solange diese Verbindung dann steht, kann sie zur Rückverbindung zum Zielsystem dienen. Weil das Zielsystem diese SSH-Verbindung als Client aktiv von innen initiiert, kommt sie durch eine Firewall und funktioniert auch mit NAT (Network Address Translation), mit dem die meisten Router arbeiten.
1. Relaisserver konfigurieren: Der aufwendigste Konfigurationsabschnitt ist die Bereitstellung eines Linux-Systems mit einem laufenden SSH-Server an einem beliebigen Ort, der aus dem Internet heraus erreichbar ist. Dieser Server dient als Relaisstation. Als beliebiger Ort kommt ein Hoster im Internet infrage, aber auch jeder kleine Linux-Server im Netzwerk zu Hause, den man per Portweiterleitung auf dem eigenen Router erreichbar machen kann. Wichtig ist, dass auf diesem Relaisserver der Open-SSH-Server läuft. In Debian/Ubuntu/Raspbian installiert man diesen mit dem Befehl
sudo apt-get install openssh
SSH läuft danach automatisch.
2. Portweiterleitung zum Relaisserver: In unserem Beispiel haben wir einen Raspberry Pi hinter einem DSL-Router per Weiterleitung des Ports 22 und dem Domainnamen „linuxwelt.mooo.com“ als SSH-Server erreichbar gemacht. Alle weiteren Schritte beziehen sich auf diese Beispielkonfiguration.
3. Konfiguration des Zielservers: Achtung – auch der Zielserver braucht einen installierten und laufenden Open-SSH-Server, sonst bleibt der Rückkanal geschlossen. Nach der Installation eines Linux-Systems ist üblicherweise nur der SSH-Client vorhanden. Schritt 1 ist also auch auf dem Zielserver erforderlich.
4. Aktion am Zielserver: Hinter der Firewall oder dem Router mit NAT baut nun dieser Befehl Im Terminal auf dem Zielserver eine Verbindung zum Relais-Server „linuxwelt.mooo.com“ auf:
ssh -R 2222:localhost:22 [user]@linuxwelt.mooo.com
Der Platzhalter „[user]“ steht in diesen Beispielen stets für den tatsächlichen Benutzernamen. Nun verbindet sich der Zielserver auf dem Port 22 zum Relaisserver und fungiert damit aus der Sicht des Netzwerkprotokolls als Client. Auf dem Relais öffnet der Befehl eine Remoteverbindung auf dem Port 2222, der jetzt als Kanal zur Rückverbindung zum Zielserver dient.
5. Aktion auf einem beliebigen Client: Auf dem Linux-Rechner „linuxwelt.mooo.com“ kann sich nun jeder User, der auf dem Zielserver ein Benutzerkonto hat, per SSH zum Zielserver verbinden – auch mit Windows und dem SSH-Client Putty oder Kitty. Denn das Rendezvous mit dem Zielserver findet ja in der Shell des Relaisservers statt. Dazu melden Sie sich per SSH auf „linuxwelt.mooo.com“ an:
ssh [user]@linuxwelt.mooo.com
Nach der Anmeldung geben Sie in der Shell des Relaisservers folgenden Befehl ein, um die bereits stehende Verbindung zum Zielserver als Rückkanal zu nutzen:
ssh [user]@localhost -p 2222
Bei dieser Verbindungsaufnahme ist nun nicht das Benutzerkonto und das Passwort für den Relaisserver gefragt, sondern für den Zielserver. Nach der üblichen Aufnahme des Zielserver-Fingerabdrucks in die Liste der bekannten SSH-Hosts und der Passworteingabe gelangt man auf die Shell des Zielservers.

Autossh: Permanente Verbindung
Der erste Verbindungsaufbau des Zielservers zum Relaisserver verlangt eine manuelle Aktion auf dem Zielserver – typischerweise durch Sie selbst. Dabei, dass diese Verbindung auch noch steht, wenn Sie die Firma längst verlassen haben, hilft das Tool Autossh ( www.harding.motd.ca/autossh ). Es findet sich in den Standard-Paketquellen aller verbreiteten Linux-Distributionen und sorgt dafür, dass eine gestartete SSH-Verbindung zum Relaisserver nicht abläuft, und stellt sie bei Abbrüchen sogar wieder her, sobald der Relaisserver wieder erreichbar ist. In Debian/Ubuntu und Varianten installiert der Befehl
sudo apt install autossh
das Programm. Mit der Eingabe
autossh -vR 2222:localhost:22 -N [user]@linuxwelt.mooo.com
startet man auf dem Zielserver wieder eine Tunnelverbindung zum Relais, hier „linuxwelt.mooo.com“. Der Unterschied ist, dass sich Autossh sofort wieder neu verbindet, falls die SSH-Konnektivität verlorengeht.
Einen Wrapper für Systemd zum automatischen Start muss man sich selbst bauen. Soll Autossh automatisch beim Systemstart laufen, so muss man eine schlüsselbasierte SSH-Anmeldung am Relaisserver aktivieren. Auf dem Zielserver generiert der Befehl
ssh-keygen
ein Schlüsselpaar. Dabei bestätigt man alle Abfragen mit der Eingabetaste und gibt kein zusätzliches Passwort an. Nun kopiert das Kommando
ssh-copy-id [user]@linuxwelt.mooo.com
den öffentlichen Schlüssel auf den Relaisserver und macht die Systeme einmalig mit dem Befehl
sudo -H ssh [user]@linuxwelt.mooo.com
miteinander bekannt. Ab jetzt gelingt die Anmeldung vom Zielserver zum Relais ohne Passwortabfrage. Mit root-Recht erstellen Sie die Konfigurationsdatei „/etc/systemd/system/autossh.service“ mit dem Inhalt aus dem Kasten „Listing: Systemd-Script für Autossh“.
Die Platzhalter „[user]“ und „[relais-server]“ müssen Sie an die tatsächlichen Verhältnisse anpassen. Danach setzen die beiden Befehlen
sudo systemctl enable autossh.service sudo systemctl start autossh.service
den neuen Systemd-Dienst in Gang. Das Kommando
sudo systemctl status autossh.service
zeigt, ob Autossh korrekt starten konnte.
Listing: Systemscript für Autossh
[Unit]
Description=Umgekehrtes SSH mit AutoSSH
After=network-online.target ssh.service
[Service]
ExecStart=/usr/bin/autossh -M 0 -vR 2222:localhost:22 -N [user]@[relais-server] -i /home/[user]/.ssh/id_rsa
[Install]
WantedBy=multi-user.target
Wenn der Verbindungsaufbau scheitert
Bei ersten Versuchen der Verbindungsaufnahme über den Rückkanal zum Zielserver kann es passieren, dass SSH die Anmeldung mit der Meldung „ssh_exchange_identification: Connection closed by remote host“ verweigert.
- In den meisten Fällen fehlt auf dem Zielserver nur der Open-SSH-Server.
- Die Firewallregeln von iptables und ipv6tables müssen auf dem Relaisserver von außen den Port 22 (TCP) erlauben.
- Falls auf dem Relaisserver Fail2ban oder Sshguard zur Absicherung des SSH-Ports läuft, sollten Sie diese testweise abschalten:
sudo systemctl stop sshguard
sudo systemctl stop fail2ban - Zur Fehlersuche empfiehlt sich bei allen SSH-Befehlen der Parameter „-v“, der Meldungen zum Debugging ausgibt.