Jahrelalang habe ich ssh, wie wahrscheinlich die meisten von uns, nur zum administrieren und direkten Zugriff auf entfernte Server benutzt. Ab und zu vielleicht nochmal scp aber dann war’s das auch wirklich.
In den letzten Monaten habe ich aber so viele coole Funktionen von ssh kennengelernt, dass ich die hier jetzt nochmal sammeln möchte um nicht alles in der nächsten Woche wieder vergessen zu haben.

Authentifizierung

Ein Feature, das die tägliche Arbeit sehr erleichtert ist das authorized_keys file in ~/.ssh
Hier trägt man einfach den public key des users ein der sich auf diesen Host verbinden darf und alle Passworteingaben haben sich erstmal erledigt.

Portweiterleitung

Man kann ssh nicht nur für die direkte Kommunikation auf eine remote shell benutzen sondern alle Möglichen Dienste durch ssh tunneln und so Firewallgrenzen überspringen und sich die Arbeit erleichtern.
Ich benutze als Beispiel mal einen Webserver, der auf einem entfernten Host läuft und nur über einen weiteren Hop erreichbar ist. Die Firewall im Bild lässt bloß Port 22 auf HostA zu.

Aufbau ssh environment

ssh environment


Beispiel 1: Zugriff von HomeLaptop auf auf webserver.
Um dieses Szenarion zu realisieren kann man z.B. den Port 80 des webservers über HostA durch den ssh tunnel auf den lokalen Port 8080 des HomeLaptops weiterleiten.
Hierbei hat man zwei Möglichkeiten. Entweder man baut 2 Tunnel hintereinander, oder man sagt ssh wie es von LaptopHome zum webserver kommt.

# als erstes einen tunnel vom webserver zum HostA
user@LaptopHome:# ssh kalle@HostA
user@HostA:# ssh -L 8080:127.0.0.1:80 manfred@webserver
# als nöchstes in einem anderen terminal
user@LaptopHome:# ssh -L 8080:127.0.0.1:8080 user@HostA

Die Alternative finde ich persönlich viel schöner.
Man öffnet auf LaptopHome die ~/.ssh/config Datei und trägt folgenden Zeilen ein.

Host HostA
   User Kalle
   Hostname HostA
Host webserver
   User manfred
   # mit -a bewirkt dass der public key des gateway hosts auf dem Zielsystem sein muss
   ProxyCommand ssh -x -a -q HostA nc %h 22
   # kein -a bewirkt, dass der public key des initiierenden users auf dem Zielsystem sein muss
   ProxyCommand ssh -x -q HostA nc %h 22

Am Ende kann man mit einem kurzen Befehl den Tunnel aufbauen

user@LaptopHome:# ssh -L 8080:127.0.0.1:80 webserver

Einen Wunsch könnte man im Zweifelsfall noch haben. Eventuell möchte man vom HomePC auch auf den webserverzugreifen. Jetzt könnte man natürlich die .ssh/config Datei um ein weiteres ProxyCommand erweitern. Es gibt jedoch noch eine andere Möglichkeit. Mit Hilfe der ssh option -g kann man den lokalen Port allgemein Verfügbar machen.

user@LaptopHome:# ssh -L 8080:127.0.0.1:80 webserver -g

Und schon kann von HomePC auf http://LaptopHome:8080 zugegriffen werden.
Beispiel 2: Den Kollegen auf der Arbeit den Datenbankserver zur Verfügung stellen.
Der Datenbankserver HomeDB stellt im LAN eine mysql Datenbank auf Port 3306 bereit.

user@HomeDB:# ssh kalle@HostA -R 10000:HomeDB:3306

Das führt dazu, dass auf der man auf der Arbeit auf HostA, Port 10000 der mysql Dienst zur Verfügung steht.

magical bash

Das ProxyCommand Beispiel bedient sich, um die direkte Weiterleitung sicherzustellen, des Linux tools netcat alias nc. Es soll allerdings in der großen weiten Welt Systeme geben, auf denen kein netcat existiert. Im Beispiel müsste dieses auf HostA installiert sein. Sollte es sich bei diesem jedoch z.B. um ein älteres Solaris oder AIX System handelt so könnte es auch sein, dass dem nicht so ist.
Möchte man jetzt aber trotzdem das ProxyCommand nutzen gibt es noch eine Möglichkeit mit Hilfe der /dev/tcp Schnittstelle, die einem von BASH bereitgestellt wird, ein netcat nachzubilden.

Host HostA
   User Kalle
   Hostname HostA
Host HostA
   User Manfred
   ProxyCommand ssh webserver "/bin/bash -c 'exec 3<>/dev/tcp/HostA/22; cat <&3 & cat >&3;kill $!'"

Sollte ich noch weitere ssh magic herausfinden werde ich nicht zögern euch diese mitzuteilen.

Christoph Niemann
Christoph Niemann
Senior Consultant

Christoph hat bei uns im Bereich Managed Service begonnen und sich dort intensiv mit dem internen Monitoring auseinandergesetzt. Seit 2011 ist er nun im Consulting aktiv und unterstützt unsere Kunden vor Ort bei größeren Monitoring-Projekten und PERL-Developer-Hells.