Portumleitungs-Adventure

Mein kleines Projekt mit dem Raspberry Pi macht Fortschritte. Mittlerweile läuft ein Webserver (nginx) und die letzten Tage habe ich mich mit der Frage beschäftigt, wie man den von außen erreicht.

Klar, in erster Näherung heißt das, wir brauchen eine registrierte Domain irgendwo bei einem DynDNS-Dienst, denn ich habe ja keine statische IP im Internet, sondern bekomme nach jeder Verbindungstrennung ein neue IP zugewiesen. Also habe ich erst mal nach kostenlosen DynDNS-Providern gesucht und bin bei dynv6.com rausgekommen. Eine Domain ist da schnell erstellt und die Anleitung sagt einem auch, was man in die Fritzbox eintragen soll.

Der nächste Schritt wäre dann die Portumleitung, damit eingehende Anfragen auf einem Port nicht bei der Fritzbox aufschlagen sondern eben beim Raspberry Pi. Das habe ich gemacht für IPv4 und IPv6. Dann der Test, ob ich meinen Webserver, den ich intern ja schon sehe nun auch über eine öffentliche Adresse sehen kann. Also mein https://xxxxxxx.dynv6.net eingetippt (xxxxxx ist nur ein Platzhalter) und gestaunt, als ich das Login meiner Fritzbox zu sehen bekam. WTF?!

Nach einigem Googeln und ausprobieren war klar:

  • Tippe ich die IPv4-Adresse meiner Fritzbox ein, dann klappt die Portumleitung für https und ich sehe meinen Webserver des Raspberry Pi.
  • Tippe ich die IPv6-Adresse ein die bei Dynv6.com registriert wurde, dann lande ich im Login der Fritzbox, ebenso wenn ich den Domainnamen eintippe, der dann wohl nach IPv6 aufgelöst wird.

Also: Port-Forwarding mit IPv6 funktioniert nicht. Erst mal drüber schlafen. Das hat dann auch die Erkenntnis gebracht, dass ich hier von falschen Annahmen ausgegangen bin. Bei IPv4 ist es ja so, dass die Fritzbox als NAT-Router funktioniert, d.h. jeder Rechner im internen Netz kommuniziert nach draußen mit der öffentlichen IP-Adresse der Fritzbox. Und für eingehende Verbindungen brauche ich die Port-Umleitung.

IPv6 wurde aber eingeführt weil uns die IPv4-Adressen knapp wurden und man ein Adressierungschema haben wollte in der die Adressen nun nicht ausgehen. Jeder Rechner und jedes internetfähige Gerät sollte eine eigene IPv6-Adresse haben über die es weltweit erreichbar ist.

Also mal die Probe aufs Exempel gemacht und die IPv6-Adresse des Raspberry Pi in den Browser eingegeben (IPv6-Adressen muss man in eckigen Klammern eingeben) und siehe da, ich sehe meine Webseite vom Raspberry Pi. Die Fritzbox spielt hier einfach Router ohne NAT, d.h. für IPv6 braucht man eigentlich gar kein Port-Forwarding.

Aber woher soll der Dynv6-Dienst jetzt die IPv6 Adresse meiner Fritzbox kennen? Die Antwort lautet, dass nicht die Fritzbox sich beim DynDNS-Dienst registriert, sondern eben der Raspberry Pi. Also den DynDNS-Provider in der Fritzbox gelöscht und dieses Skript auf den Raspberry Pi geladen wo es jede Minute als Cronjob ausgeführt wird.

Das Skript ermittelt die IPv6-Adresse und wenn diese sich seit dem letzten Aufruf geändert hat (wegen dynamischer IP vom Provider), dann führt das Skript folgende Befehle aus:

Die Variable „$bin“ steht hier entweder für wget oder curl, wir rufen also eigentlich nur eine Webseite ab und geben ein paar API-Parameter mit. Bei IPv6 wird die ermittelte Webseite des Rasberry Pi übergeben, bei IPv4 dürfte das „auto“ sagen, nimm die IPv4-Adresse von der das kommt, also die öffentliche Adresse der Fritzbox.

Bedeutet, dass ich in der Fritzbox nun nur ein Port-Forwarding für IPv4 einrichten muss, was ja auch problemlos geht.

Damit funktioniert das dann auch problemlos. Und der Traffic hält sich in Grenzen weil das Skript ja nur dann tatsächlich einen wget oder curl macht wenn sich die IPv6-Adresse geändert hat.

Bei aller Freude über die Erreichbarkeit des Webservers von außen kam dann aber auch sofort die Frage auf: Wenn IPv6 durchgeroutet wird, dann heißt das, dass nicht nur mein Webserver von außen erreichbar ist (was ich ja will), sondern auch mein SSH-Port über den ich den Raspberry Pi administriere. Und SSH-Zugriff übers Internet brauche ich nun nicht wirklich zwingend, also wäre es gut, wenn man das abdrehen könnte.

Eine Möglichkeit das irgendwie in der Fritzbox so einzustellen, dass SSH von außen kommend blockiert wird habe ich jetzt auf die Schnelle nicht gefunden. Aber man kann natürlich auf dem Raspberry Pi den SSH-Dämon so konfigurieren, dass der nur auf IPv4 lauscht. Dazu muss einfach in der sshd_config unter /etc/ssh/ folgende Zeile eingetragen sein:

Damit ist sichergestellt, dass SSH nur über IPv4 erreichbar ist, also für alle Geräte aus dem internen Netz ohne Probleme, für Leute die vom Internet kommen jedoch nicht, weil ich ja keine Portfreigabe für IPv4 auf Port 22 eingerichtet habe. Hier schützt dann das IPv4-NAT der Fritzbox wie ein Firewall.