Nach Hause telefonieren – Zugriff von unterwegs

Also prinzipiell ganz einfach – Portweiterleitung an der FritzBox einrichten, entsprechende Dienste auf sheeva laufen lassen und schon fertig. Der Teufel liegt im Detail: unterwegs ist meist nur ein Zugriff auf Port 443 (https) möglich (oft auch Port 80 http – da aber der Traffic hier öffentlich einsehbar ist, schauen viele Firewalls sich die Pakete an und machen zu, wenn sie kein http-Protokoll sehen. Ein ssh-Zugang funktioniert so meist nicht. Über Port 443 geht verschlüsselter Verkehr, da kann eh niemand reinschauen. Aber ich will beides, ssh und https. Das Zaubertool hierfür ist sslh. Vorher müssen wir allerdings einiges erledigen.

Achtung: wir basteln hier an unserem Zugang zum System, wenn es dumm läuft, sind wir draussen. Ganz Vorsichtige schalten sich also für die Zeit noch ein telnet frei oder starten einfach einen sshd von Hand auf einem ganz anderen Port.

SSH einrichten

Die Konfig für den SSH-Server finden wir in /etc/ssh/sshd_config, Port 22 beschränke ich auf lokale Verbindungen – hier dockt später der sslh an. Um auch ohne sslh noch auf das System zu kommen, lasse ich den sshd zusätzlich noch auf Port 2022 lauschen. Dafür braucht es diese beiden Zeilen in der config:

ListenAddress 127.0.0.1:22
ListenAddress 0.0.0.0:2022

Ob das geklappt hat, kann man (nach einem Neustart des sshd) einfach anhand des netstat sehen:

root@sheeva:/# netstat -alpn |grep tcp | grep ssh
tcp        0      0 127.0.0.1:22            0.0.0.0:*               LISTEN      834/sshd        
tcp        0      0 0.0.0.0:2022            0.0.0.0:*               LISTEN      834/sshd        
tcp        0      0 127.0.0.1:22            127.0.0.1:57597         ESTABLISHED 4898/sshd: mathias

Die ersten beiden Zeilen zeigen, dass der sshd auf Port 22 auf localhost und Port 2022 auf allen interfaces lauscht. Die letzte Zeile ist meine aktuelle Session, ich bin schon über localhost:22 drin, also läuft offenbar der sslh schon.

Webserver einrichten

Passend zum sheeva ist das bei mir ein lighttpd. Dem muss ich also nun ssl beibringen und ihn auf die richtigen Ports biegen. Beides recht einfach, für Ersteres legen wir ein Verzeichnis /etc/lighttpd/certs/ und erzeugen dort das Zertifikat:

openssl req -new -x509 -keyout lighttpd.pem -out lighttpd.pem -days 3000 -nodes

Das ist natürlich nur ein self-signed, d.h. jeder Browser wird beim Zugriff da drauf erstmal genau deswegen meckern. Für mich reichts aber, der Verschlüsselung tut das keinen Abbruch.

Dann machen wir das Zertifikat noch beim Webserver bekannt und regeln die Sache mit den Ports, alles in der lighttpd.conf:

$SERVER["socket"] == "127.0.0.1:8443" {
ssl.engine = "enable"
ssl.pemfile = "/etc/lighttpd/certs/lighttpd.pem"
}

Den lighttpd neu starten und wieder per netstat prüfen:

root@sheeva:/# netstat -alpn |grep tcp |grep lighttpd
tcp        0      0 127.0.0.1:8080          0.0.0.0:*               LISTEN      2556/lighttpd   
tcp        0      0 127.0.0.1:8443          0.0.0.0:*               LISTEN      2556/lighttpd

sslh einrichten

Der letzte Schritt ist nun der Einfachste. In der /etc/default/sslh steht die Konfig vom sslh, für mich sind das die beiden Zeilen:

RUN=yes
DAEMON_OPTS="-v -u sslh -p 0.0.0.0:443 -s 127.0.0.1:22 -l 127.0.0.1:8443 -P /var/run/sslh.pid"

Also der sslh lauscht an allen Interfaces auf Port 443, schickt ssh-Traffic an localhost:22 und https-Traffic an localhost:8443, an die beiden Ports hatten wir ja zuvor sshd und lighttpd gebunden.

Jetzt noch einmal von Aussen einloggen und schauen ob alles geht.