Reverse SSH Tunnel mit autossh und systemd

In meinem Fall ist das Zielsystem nicht von ausserhalb der Firewall erreichbar und mit dieser Lösung habe ich von meinem eigenen Jump-Host immer eine Verbindung zum Zielsystem.
Achtung: Das Einrichten eines Reverse Tunnels verstösst fast immer gegen Sicherheitsrichtlinien wenn dies in das Firmen-Netzwerk geschieht! Im Zweifelsfall immer den Netzwerk-Administrator fragen.

In diesem Beispiel hier, existieren folgende Systeme:

  • jump: Der Jump-Host von welchem aus die Verbindung hergestellt werden soll. Dieser Host ist im Internet auflösbar unter dem Namen jump.yourdomain.example und der Port 22 ist geöffnet.
  • oob: Das Zielsystem auf welches verbunden werden soll. Es ist von aussen nicht erreichbar und hat eine Dynamische IP.

Der verwendete User, abgesehen von root, ist auf beiden Systemen john.

Erstellen des SSH-Keys

Als erstes wird auf oob ein zusätzlicher, dedizierter SSH-Key für den User root erstellt. Ein Passwort für den SSH-Key setzt voraus, dass dieser jeweils nach jedem neustart entsperrt wird. In meiner Anwendung spielt dies keine Rolle und ich setze KEIN Passwort.

ssh-keygen -b 4096 -f /root/.ssh/john@jump.yourdomain.example

Nun wird der Public-Key auf dem jump dem Benutzer john als vertrauenswürdiger Key hinzugefügt, indem der Inhalt der Datei /root/.ssh/john@jump.yourdomain.example.pub von oob der Datei /home/john/.ssh/authorized_keys auf jump angehängt wird.
Achtung: Nicht den bestehenden In halt der authorized_keys überschreiben, lediglich anhängen!

Die Datei /root/.ssh/config auf oob mit diesem Block erweitern:

Host jump.yourdomain.example
  Port 22
  User john
  ServerAliveInterval 30
  ServerAliveCountMax 3
  RemoteForward 5000 localhost:22
  IdentityFile  ~/.ssh/id_rsa-john@jump.yourdomain.example

Nun kann auf oob das Systemd-Unitfile /etc/systemd/system/autossh-john-tunnel.service erstellt werden:

[Unit]
Description=AutoSSH tunnel service SSH for john local port 5000
After=network-online.target

[Service]
Environment="AUTOSSH_GATETIME=0"
Environment="AUTOSSH_LOGLEVEL=7"
Environment="AUTOSSH_LOGFILE=/var/log/%p.log"
ExecStart=/usr/bin/autossh -M 0 -q -N john@jump.yourdomain.example
RestartSec=3
ExecStop=/usr/bin/killall -s KILL autossh

[Install]
WantedBy=multi-user.target

Bevor die Verbindung mit mit autossh und systemd funktioniert, muss erst einmal der Host-Key von jump akzeptiert werden. Vom oob den folgenden Befehl ausführen:

ssh john@jumpyourdomain.example

…und die Frage mit yes bestätigen. Ein erfolgreiches Anmelden ist nicht nötig.

Zu guter letzt kann die Systemd-Unit geladen und aktiviert werden:

systemctl daemon-reload
systemctl enable autossh-john-tunnel.service
systemctl start autossh-john-tunnel.service
systemctl status autossh-john-tunnel.service

Wenn alles geklappt hat, kann nun auf jump mit dem Befehl

ssh john@localhost -p 5000

eine SSH-Verbindung geöffnet werden.

Quellen