IPv6 wird irgendwann kommen. IPv6 muss irgendwann kommen. Schon jetzt gibt es Provider, welche ihren Kunden keinen vollwertigen IP Anschluss mittels IPv4 mehr liefern können und auf Methoden wie DS-Lite zurückgreifen, weil einfach keine ausreichende Anzahl IP-Adressen mehr verfügbar ist. Vermutlich wird es bald auch die ersten Adressen im Netz geben, die nur noch via IPv6 erreichbar sein werden. Aber leider bieten viele DSL-Provider bei Endkunden-Anschlüssen noch kein IPv6. So ergeht es auch mir mit einem Telekom-DSL-16000 Anschluss. Nun habe ich aber nicht ausreichend Geduld zu warten, bis mein Anschluss auch natives IPv6 bietet. Und zusätzliche hätte ich auch gerne in anderen Netzen, bei Freunden usw. auch IPv6, wenn benötigt.

 

Der Raspberry Pi mit Linux als universelles IPv6 Gateway

 

 

Mein Projekt zur Umsetzung dieses IPv6-am-liebsten-jetzt-schon-überall-Wunsches realisiere ich mit einem Raspberry Pi und Linux, genauer gesagt Raspbian. Für die IPv6 Anbindung nutze ich SixXS, wo ich mir einen kostenlosen IPv6 Tunnel einrichten kann. Der Raspberry Pi soll nun so eingerichtet werden, dass er in jedem Netz über das LAN Interface eine IPv4 Adresse ganz normal per DHCP bezieht. Danach startet er über die dann bestehende Netzverbindung den IPv6 Tunnel zu SixXS. Das von SixXS zugewiesene IPv6 Netzwerkpräfix zur Verwendung im lokalen Netz soll der Raspberry danach über das eth0 Interface im lokalen LAN bekannt geben. Dann können alle Systeme in diesem LAN IPv6 nutzen und routen den IPv6 Traffic über den Raspberry Pi und dessen Tunnel.

 

Was benötigen wir für diese Installation

  • Einen Raspberry Pi
  • Ein installiertes, aktuelles Raspbian auf dem Raspberry PI. In der Standardinstallation bezieht das LAN Interface seine Adresse (IPv4) per DHCP.
  • Einen kostenlosen IPv6 Tunnel bei SixXS.
  • Das installierte Paket "aiccu" für den Tunnel zu SixXS
  • Das installierte Paket "radvd" (Router Advertising Daemon) zur Verteilung des zugewiesenen IPv6 Netzwerkpräfix im eigenen LAN.

Schritt 1: Raspbian installieren

Hierzu gibt es bereits eine Vielzahl guter Tutorials, wie z.B. hier 

 

Schritt 2: SixXS Tunnel beantragen

Bei SixXS muss man sich zuerst registrieren. Danach kann man einen IPv6 Tunnel beantragen.  Wichtig ist hierbei, dass der Tunnel als sog. "Dynamic NAT-traversing IPv4 Endpoint using AYIYA" beantragt wird. Innerhalb von 2-3 Tagen ist meist der Tunnelantrag durch die dortigen Administratoren genehmigt und man bekommt eine E-Mail Benachrichtigung mit der zugewiesenen Tunnel-ID (z.B. T004711) sowie dem nutzbaren IPv6 Prefix (angegeben unter "Your IPv6" in der Mail).

 

Schritt 3: IPv6 Unterstützung und Routing einschalten

Damit der Raspberry mit Raspbian problemlos mit IPv6 umgehen kann, muss noch das ipv6 Modul geladen werden. Dazu wird am Ende der Datei /etc/modules die Zeile

ipv6

angefügt.

Weiterhin muss der Raspberry die IPv6 Pakete zwischen dem LAN und dem SixXS Tunnel auch routen. Hierzu wird in der Datei /etc/sysctl.conf folgender Wert auf '1' geändert und ein vorhandenes Kommentarzeichen '#' am Zeilenanfang entfernt werden:

net.ipv6.conf.all.forwarding=1

 

Anschließend diese Konfiguration im laufenden System mittels

modprobe ipv6
sysctl -p

aktivieren. Analog dazu kann auch der Raspberry neu gestartet werden. 

 

Schritt 4: Tunnelendpunkt auf dem Raspberry PI einrichten

Wir installieren zunächst den SixXS-Tunneldaemon unter Raspbian mittels

apt-get install aiccu

Bei der Einrichtung mittels apt-get erfragt das Paketmanagement die Zugangsdaten für den Tunnel. Hier geben wir unsere SixXS Nutzerkennung und das Passwort an, welches wir bei der Registrierung bei SixXS verwendet haben. Damit ist schon alles nötige erledigt. Nach dem Start dess aiccu Daemon erscheint ein zusätzliches Interface "sixxs" in der Ausgabe von 'ifconfig'. Wenn dieses Interface sichtbar ist, hat der Tunnelaufbau geklappt.

Ein Test mittels

ping6 google.de

sollte schon Antworten erzeugen. Dann funktioniert der Tunnel wie erwartet.

 

Schritt 5: IPv6 Adresse an das lokale Interface eth0 binden

Damit der Raspberry im lokalen Netz später auch per IPv6 erreichbar ist, binden wir eine IPv6 Adresse aus dem zugewiesenen Netzprefix an das Interface eth0. Dazu fügen wir folgende Zeilen in die Datei /etc/network/interfaces auf dem Raspberry ein:

iface eth0 inet6 static
        address 2001:db8::1
        netmask 64 

In der 'address' Zeile ist dabei das zugewiesene Tunnelprefix zu verwenden, statt des hier angegebenen Beispiels 2001:db8::. Wie man sehen kann bekommt das Interface eth0 innerhalb des Netzwerkprefix den Hostteil ::1.

 

Schritt 6: Verteilung des zugewiesenen IPv6 Netzwerkprefix im lokalen Netz

Hierfür ist der Daemon 'radvd' zuständig. Wir installieren ihn über

apt-get install radvd 

Nach der Installation müssen wir über die /etc/radvd.conf noch manuell die Konfiguration vornehmen. Die Konfiguration sollte wie folgt aussehen:

interface eth0 
{
AdvSendAdvert on;
# SIXXS Tunnel Network
prefix 2001:db8::/64
{
AdvOnLink on;
AdvAutonomous on;
AdvRouterAddr on;
};

       # Announce Google DNS Server
       RDNSS 2001:4860:4860::8888 2001:4860:4860::8844
       {
               # No option to be set
       };
};

 

Als 'prefix' ist hier wieder das von SixXS zugewiesene IPv6 Prefix nebst Standard-Netzmaske "/64" einzutragen.

Nach dem anschließenden Start des Radvd Daemon mittels 'service radvd start' announced der Radvd das Prefix im lokalen Netz über eth0. Jedes IPv6 fähige Gerät in dem Netz konfiguriert sich daraufhin automatisch, ohne weiteres Zutun eine IPv6 Adresse innerhalb des announcten IPv6 Netzwerk Prefix und richten den Raspberry Pi automatisch als Default Gateway für den IPv6 Traffic ein sowie die Google DNS Server für die Namensauflösung per IPv6.

 

Schritt 7: Test der Verbindung

Von einem anderen Linux Rechner im LAN, der nun auch automatisch über eine IPv6 Adresse verfügen sollte, starten wir auch ein

ping6 google.de

und sollten auch eine Antwort bekommen. Dann funktioniert auch der Radvd.

 

Schritt 8: Nacharbeiten/Besonderheiten

Eine Besonderheit gegenüber "normalen" Rechnern hat der Raspberry Pi. Er besitzt keine batteriegepufferte Echtzeituhr. Daher hat er nach dem Einschalten keine aktuelle Uhrzeit und bezieht sich diese Information erst während des Startvorgangs aus dem Netz per NTP. Da der Tunnelaufbau zu SixXS jedoch bei einer grob abweichenden Uhrzeit fehl schlägt, hat diese Tatsache auf unsere Installation folgende Auswirkungen: Der Tunnelaufbau direkt bei einem Cold-Boot nach dem Einstecken der Stromversorgung schlägt fehl, da die Uhrzeit noch nicht abgeglichen ist.

Umgehen können wir dies, indem wir in der Datei /etc/rc.local auf dem Raspberry Pi folgende Zeilen einfügen:

# Check if SixXS Tunnel is up and restart it if not
ifconfig |grep sixxs || sleep 10; service aiccu restart

Bei der Ausführung der rc.local während des Bootens wird so geprüft, ob die Ausgabe des 'ifconfig' die Zeichenkette 'sixxs' enthält (das logische Interface bei erfolgreichen Tunnelaufbau). Fehlt diese Zeichenkette, wartet das Script 10 Sekunden und startet dann den Aiccu Daemon erneut. Diese 10 Sekunden haben nach meiner Erfahrung ausgereicht, um zwischenzeitlich die Uhr des Raspberry mittels NTP korrekt zu stellen.

 

Vor dem Entfernen des Raspberry Pi aus dem LAN sollte man diesen immer ordnungsgemäß herunter fahren. Dabei stoppt dann nämlich der Radvd Daemon und signalisiert dabei allen Rechnern im Netz auch, dass das Prefix jetzt nicht mehr zur Verfügung steht. Alle Teilnehmer im Netz werden dann sofort den IPv6 Traffic über den Raspberry Pi einstellen. Wird dagegen der Raspberry Pi einfach "hart" aus dem Netz genommen, erfahren die anderen Netzteilnehmer nichts davon und versuchen weiterhin, den Raspberry als Default Gateway für IPv6 zu verwenden. Dies führt in der Regel dazu, dass plötzlich Verbindungen nicht mehr funktionieren.

 

Achtung: Wenn IPv6 im LAN und der SixXS Tunnel aktiv sind, sind alle Rechner im LAN über ihre IPv6 Adresse aus dem Internet direkt erreichbar! Die Firewall des DSL Routers bzw. andere Sicherheitssysteme wirken sich nicht auf den IPv6 Netzwerktraffic aus. In Abhängigkeit der im LAN befindlichen Systeme und angebotenen Services (z.B. Laufwerksfreigaben usw.) kann dies ein nicht zu unterschätzendes Sicherheitsrisiko sein und sollte vorab individuell abgewogen werden.

Ich betreibe meine Systeme und Services auch im LAN mit den jeweiligen Sicherheitsvorkehrungen und sehe es als großen Vorteil, wenn alle Systeme über eine eigene Adresse direkt aus dem Internet erreicht werden können. Entspricht dies doch dem ursprünglichen Grundgedanken des Internets.

 

Fazit

Mit einem Raspberry Pi mit dieser Konfiguration haben wir ein kleines Gerät, welches wir überall in ein bestehendes Netzwerk hängen können und dort sofort IPv6 in vollem Umfang nutzen können. Dazu holt sich der Raspberry per DHCP eine IPv4 Adresse, baut dann einen IPv6 Tunnel zu SixXS auf, verteilt anschließend das zugewiesene IPv6 Netz im lokalen Netz für alle beteiligten Rechner und steht für diese als Router zur IPv6 Außenwelt zur Verfügung.

So kann jedes bestehende IPv4 Netzwerk ganz leicht "IPv6 ready" gemacht werden.