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
-- 
Christian Perle                                    chris AT linuxinfotag.de
010111                                              http://chris.silmor.de/
101010                          LinuxGuitarKitesBicyclesBeerPizzaRaytracing

_______________________________________________
Lug-dd maillist  -  [email protected]
https://ssl.schlittermann.de/mailman/listinfo/lug-dd

Antwort per Email an