Hallo Martin,
On Mon, Nov 23, 2015 at 00:43:17 +0100, Martin Schuchardt wrote:
ich will auf einen Rechner A (der eine IP-Adresse mittels NAT bekommen hat) Zugriff erlangen, im mindesten per SSH. Sprich ich müsste von diesem aus beispielsweise einen SSH Tunnel auf einen festen Punkt im Netz aufbauen und dann durch diesen rückwärts zugreifen können.
Ich dazu 2007 mal ein wenig Doku zusammengehackt.
Die Warnung bzgl. geaendertem Host-Key wird bei ausreichend neuer ssh nicht mehr auftauchen, weil inzwischen auch verschiedene Portnummern des gleichen Hosts in der ~/.ssh/known_hosts unterschieden werden.
-----------------------------hier-abbeissen---------------------------
+-----------------------+ |"hopper" | |machine on the internet| |with public IP address | +-----------------------+ / \ / \ / \ . . . Internet . . . / \ / \ +-------------------------+ +-----------------------+ |"anywhere" | |"adminbox" | |any machine with internet| |NAT gateway | |access | +-----------------------+ +-------------------------+ | | local net | +-----------------------+ |"mybox" | |machine behind | |NAT gateway | +-----------------------+
Ziel ==== ssh-Erreichbarkeit des Rechners "mybox" von irgendwo aus dem Internet.
Normalerweise wuerde man das NAT-Gateway "adminbox" so konfigurieren, dass Port 22 (ssh) an "mybox" weitergeleitet wird.
Problem ======= "adminbox" wird nicht von uns administriert, wir haben keinen Einfluss darauf.
Loesung ======= Verwenden des Remote Port Forwarding Feature von ssh, der Rechner "hopper" wird dabei als Zwischenstation genutzt.
Voraussetzungen =============== a) Wir brauchen einen ssh-Account "user" auf einem Rechner mit fester, oeffentlicher IP-Adresse "hopper". Der ssh-Server auf "hopper" muss TCP Port Forwarding erlauben. Die zugehoerige Option in /etc/ssh/sshd_config lautet "AllowTcpForwarding yes". Wenn sie fehlt, ist Port Forwarding trotzdem erlaubt (Defaulteinstellung). Darueber hinaus sollte der ssh-Server auf "hopper" Public Key Authentication erlauben (Defaulteinstellung).
b) Von "mybox" aus muss man sich mittels ssh via Public Key Authentication und ohne Passphrase auf "hopper" einloggen koennen. Der ssh-Server auf "mybox" braucht keine speziellen Einstellungen.
c) Auf "mybox" muessen autossh und screen installiert sein.
Umsetzung ========= Falls b) noch nicht erfuellt ist, erzeugen wir zuerst ein ssh-Schluesselpaar auf "mybox": [ich@mybox]$ ssh-keygen -t dsa -N "" -f ~/.ssh/id_dsa
Es entstehen zwei Dateien: ~/.ssh/id_dsa (privater Schluessel, verbleibt auf "mybox") und ~/.ssh/id_dsa.pub (oeffentlicher Schluessel, muss auf "hopper" kopiert werden).
Kopieren des oeffentlichen Schluessels auf "hopper": [ich@mybox]$ scp ~/.ssh/id_dsa.pub user@hopper:
Einloggen auf "hopper", dort den oeffentlichen Schluessel zu den erlaubten Schluesseln hinzufuegen: [user@hopper]$ cat id_dsa.pub >> ~/.ssh/authorized_keys [user@hopper]$ rm id_dsa.pub
Jetzt sollte es moeglich sein, von "mybox" mit: [ich@mybox]$ ssh user@hopper passwortlos einzuloggen.
Nach einem Reboot von "mybox" soll sich diese automatisch zu "hopper" verbinden. Ausserdem soll die ssh-Verbindung zu "hopper" einen Reboot von "adminbox" ueberleben bzw. danach neu gestartet werden. Fuer den Zweck setzen von autossh ein. Dieses Tool ueberwacht eine ssh-Verbindung und startet sie ggf. neu. Ein Testaufruf sieht so aus:
[ich@mybox]$ autossh -M 15000 -R 10022:localhost:22 -T user@hopper
Die Option "-M 15000" setzt den Monitorport, den autossh fuer die Ueberwachung der ssh-Verbindung benutzt. Der Rest der Kommandozeile wird an die aufgerufene ssh uebergeben. Die Option "-R 10022:localhost:22" sorgt dafuer, dass sich nach erfolgreichem ssh-Login der ssh-Server auf "hopper" an Port 10022 bindet. Zugriffe auf Port 10022 fuehren zurueck zu Port 22 von "mybox", durch die bereits bestehendende ssh-Verbindung und landet damit beim ssh-Server von "mybox". Die Angabe "localhost" in "-R 10022:localhost:22" bezieht sich also auf den Rechner, von dem die ssh-Verbindung aufgebaut wurde.
Fuer den Start von autossh aus einem Initskript beim Booten wird screen benoetigt, da sich ssh ohne kontrollierendes Terminal gleich wieder beendet. Die folgende Zeile sollte in ein Initskript eingefuegt oder zu einem eigenen Initskript ausgebaut werden:
su -c "/usr/bin/screen -d -m /usr/bin/autossh -M 15000 \ -R 10022:localhost:22 -T user@hopper" - ich
Die screen-Session wird im detached-Modus gestartet, laeuft also ohne sichtbare Ausgabe im Hintergrund. Funktioniert die bisherige Konstruktion, sollte sich "mybox" automatisch beim Booten auf "hopper" einloggen und dabei einen Tunnel zurueck auf sich selbst bereitstellen.
Den Tunnel benutzen =================== Um von irgendwo auf "mybox" zu kommen, ist ein zweistufiges ssh-Login noetig. Normales ssh-Login auf "hopper": [me@anywhere]$ ssh user@hopper
Danach ssh-Login auf dem durchs Forwarding belegten Port: [user@hopper]$ ssh -p 10022 ich@localhost
Hinweis: Falls ssh in ~/.ssh/known_hosts bereits einen Host Key fuer "localhost" findet, wird es vermutlich Alarm schlagen, weil sich der Key vermeintlich geaendert hat:
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY! Someone could be eavesdropping on you right now (man-in-the-middle attack)! It is also possible that the RSA host key has just been changed. The fingerprint for the RSA key sent by the remote host is f0:0b:a0:d0:0d:de:ad:af:fe:ba:dd:ad:08:15:ab:cd. Please contact your system administrator. Add correct host key in /home/user/.ssh/known_hosts to get rid of this message. Offending key in /home/user/.ssh/known_hosts:10 RSA host key for localhost has changed and you have requested strict checking. Host key verification failed.
Die Ursache ist, dass ssh-Zugriffe auf Port 22 und 10022 unterschiedliche Host Keys liefern, die known_hosts-Datei jedoch nicht Port-granular zwischen Hosts unterscheidet. Die Verwendung der zusaetlichen ssh-Option "-o NoHostAuthenticationForLocalhost=yes" unterdrueckt die Verifikation des Host Keys fuer localhost: [user@hopper]$ ssh -p 10022 ich@localhost -o NoHostAuthenticationForLocalhost=yes
Eine andere Moeglichkeit ist das Entfernen der entsprechenden Host-Zeile aus der known_hosts-Datei (nicht empfohlen).
Sicherheitsbetrachtungen ======================== + Remote Tunnel nur direkt von "hopper" nutzbar, Zugriffe auf Port 10022 der Maschine "hopper" von ausserhalb werden nicht zugelassen. + Falls "adminbox" ein Einwahlrouter mit dynamischer IP-Adresse ist, muss diese nicht per dyndns (o.ae.) bekannt gemacht werden, da die Verbindung initial von "mybox" ueber "adminbox" aufgebaut wird. - Privater ssh-Schluessel auf "mybox" ist nicht durch eine Passphrase gesichert.
-----------------------------hier-abbeissen---------------------------
Gruss, Chris