Channel Header
2394749

Wie Sie einen entfernten SSH-Server trotz Firmenfirewall erreichen

12.12.2018 | 15:01 Uhr |

Der Zugriff von außen auf ein Linux-System im Netzwerk per SSH erfordert eine Portweiterleitung und einen dynamischen Domainnamen. Ist deren Einrichtung in Firmennetzwerken verboten, geht es dennoch – mit trickreichen Umwegen.

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 ( http://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.

Rückkanal: Hier dient ein Raspberry Pi als Relaisserver, der die umgekehrte SSH-Verbindung zum Zielserver offen hält. Nur dieses Relais muss aus dem Internet per SSH erreichbar sein.
Vergrößern Rückkanal: Hier dient ein Raspberry Pi als Relaisserver, der die umgekehrte SSH-Verbindung zum Zielserver offen hält. Nur dieses Relais muss aus dem Internet per SSH erreichbar sein.

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.

PC-WELT Marktplatz

0 Kommentare zu diesem Artikel
2394749