Raspberry Pi als IPv6-Gateway

rbpipv6Leider hat sich die neuste Version des Internet-Protokolls immer noch nicht soweit durchgesetzt, als dass es in den meisten deutschen Haushalten nativ zur Verfügung stehen würde. Da werden lieber immer neue Wege gefunden, die eigene (ISP-)Infrastruktur doch noch ein paar Jahre mit IPv4 am Leben zu halten. So ist beispielsweise bei vielen Providern Carrier Grade NAT das neuste Ehlend die neuste innovative Lösung des immer knapper werdenden IPv4-Adresspools. Bereits in diesem Artikel habe ich gezeigt, wie dieses Problem zumindest behelfsweise durch Tunneln mit einer FritzBox zu lösen ist, wer eine solche jedoch nicht sein Eigen nennt, kann dies mit dieser Anleitung jedoch auch mit einem Raspberry Pi umsetzen.

 

Account beim Tunnelbroker anlegen

In dieser Anleitung nutzen wir Hurrican Electric als IPv6-Tunnelbroker. Dieser Anbieter hat den Vorteil, dass wir ohne große Umstände IPv6-Netze beantragen und diese ohne zusätzliche Software auf unseren Systemen einrichten können. Dazu erstellen wir unter folgender Adresse einen neues Benutzerkonto:

https://tunnelbroker.net/register.php

und melden uns mit diesem an.

 

Neuen Tunnel erstellen

Auf der Übersichtsseite, die nach dem Anmelden bei tunnelbroker.net erscheint, wählen wir den Menüpunkt “Create Regular Tunnel“. Nun wird uns eine Liste an Tunnelendpunkten angeboten, aus der wir den für uns am nächsten erreichbaren wählen.

1

 

Anschließend vergeben wir dem Tunnel einen Namen, aus dem der Verwendungszweck deutlich wird. Dies dient nur unserer eigenen Übersicht. Wer über keinen eigenen DNS-Server verfügt, kann die von Hurrican Electric zur Verfügung gestellten Server für die Reverse-Records nutzen. Dazu klicken wir auf “Edit” im unteren Bereich der Tunnel-Details.

2

 

Wenn alle Einstellungen getroffen wurden, sehen wir nun eine Übersicht aller für uns relevanten Daten des Tunnels.

3

 

IPv6-Einrichtung auf dem Raspberry

Beschäftigen wir uns nun mit der Einrichtung auf der Himbeere. Dazu aktivieren wir zunächst das Modul “ipv6” beim Systemstart und erlauben die Weiterleitung (das “Forwarding“) von IPv6-Paketen, da wir die Himbeere später als Router einsetzen wollen.

Wir fügen das neue Modul hinzu, indem wir die Datei “/etc/modules” editierend öffnen:

nano /etc/modules

um am Ende der Datei folgendes hinzufügen:

ipv6

 

Mit STRG + X verlassen wir den Editor “nano” und speichern die Datei sogleich. Nun editieren wir eine weitere Konfigurationsdatei, um die Weiterleitung von IPv6-Paketen zu erlauben:

nano /etc/sysctl.conf

 

In dieser Datei suchen wir nach “net.ipv6.conf.all.forwarding” und ersetzen die “0” durch eine “1“:

net.ipv6.conf.all.forwarding=1

 

Anschließend starten wir den Raspberry neu mit

shutdown -r now

 

Wurden die IP-Einstellungen (unabhängig ob v4 oder v6) bisher über einen DHCP-Server bezogen, deaktivieren wir nun den entsprechenden Client:

systemctl disable dhcpcd

 

Nun editieren wir die Konfigurationsdatei für unsere Netzwerkeinstellungen durch

nano /etc/network/interfaces

 

In dieser Datei löschen wir zunächst sämtliche Vorkommen von “eth0” und fügen folgendes ein:

auto he-ipv6
iface he-ipv6 inet6 v4tunnel
    address 2001:470:1f0a:c4::2
    netmask 64
    endpoint 216.66.80.30
    local 192.168.1.234
    ttl 255
    gateway 2001:470:1f0a:c4::1

auto etho
allow-hotplug eth0
iface eth0 inet static
    address 192.168.1.234
    netmask 255.255.255.0
    gateway 192.168.1.254
    dns-nameservers 192.168.1.219
    dns-domain klenzel.net

iface eth0 inet6 static
    pre-up modprobe ipv6
    address 2001:470:1f0b:c5::1
    netmask 64

Dabei sind folgende, wichtige Punkte zu beachten:

  • Die Adressen für den Tunnel unterscheiden sich von den Adressen, die wir in unserem Netzwerk zur Verfügung stellen können!
  • Wir benötigen auf der Himbeere selbst eine Adresse aus dem Clientnetz (=anderes Netz als Tunnelnetz!).
  • Wir vergeben auch die IPv4-Einstellungen statisch.
  • Wir benutzen kein Copy & Paste der oben gezeigten Einstellungen und wundern uns dann, warum diese Konfiguration nicht funktioniert.
  • Die Adressen für beide Tunnelendpunkte wurden uns bei den Tunnel-Details bekannt gegeben.
  • Das IPv6-Subnetz wurde ebenfalls bei den Tunnel-Details bekannt gegeben.

 

Kommen wir zum letzten, wichtigen Punkt dieser Konfiguration: dem lokalen Endpunkt namens “local“. Diesen erläutere ich genauer unter dem Punkt: “Firewall/Router konfigurieren”

Wir starten den Raspberry neu und prüfen mit

ifconfig

, ob die gewünschten Einstellungen übernommen wurden und ob ein neues Interface namens “he-ipv6” in Erscheinung getreten ist. Wenn dem so ist, testen wir unsere IPv6-Konnektivität mit

ping6 heise.de

 

6

 

 

Firewall/Router konfigurieren

Die wenigsten verfügen über eine statische IPv4-Adresse und selbst wenn, wird diese nicht auf der Himbeere sondern auf dem Router des heimischen Internetanschlusses konfiguriert sein. Daher tragen wir bei den Interfaces unter “local” die lokale Adresse der Himbeere ein und benötigen eine Weiterleitung des Protokolls 41 durch den Router. Bitte nicht mit dem Port 41 verwechseln, dies ist etwas grundsätzlich anderes und trifft an dieser Stelle nicht zu. Exemplarisch zeige ich die Vorgehensweise auf einer Sophos UTM Firewall.

Wir öffnen die Weboberfläche der Sophos UTM und bewegen uns über das Menü “Network Protection” zum Punkt “NAT” ⇒ “NAT“. Dort erstellen wir eine neue DNAT-Regel, die wie folgt aufgebaut wird:

5

 

Den Datenverkehrsdienst musste ich in meinem Fall neu definieren:

4

 

Zudem ist es notwendig, dass wir Hurrican Electric über einen Wechsel unserer öffentlichen IPv4-Adresse informieren. Dieser Wechsel geschieht auch heute immer noch bei den meisten Providern einmal täglich. Dafür erstellen wir uns ein Script, dass ich in diesem Artikel zeige.

Bietet uns unser Router keine Möglichkeit, das Protokoll 41 weiterzuleiten, bleibt uns nichts anderes übrig, als den Raspberry als “Exposed Host” zu deklarieren oder diesen netzwerktechnisch in die DMZ zu platzieren.

 

IPv6-Provisionierung aktivieren

Um unser neues IPv6-Subnetz im heimischen Netz samt Gateway- und DNS-Serveradresse bekannt zu geben, nutzen wir den Dienst “radvd“, welchen wir wie folgt installieren:

apt-get install radvd

 

Anschließend editieren wir die Konfigurationsdatei von “radvd“:

nano /etc/radvd.conf

und fügen folgenden Inhalt ein (natürlich angepasst an die eigenen Gegebenheiten)

interface eth0
{
    AdvSendAdvert on;
    prefix 2001:470:1f0b:c5::/64
    {
        AdvOnLink on;
        AdvAutonomous on;
        AdvRouterAddr on;
    };

    # Öffentlichen DNS-Server bekannt geben
    RDNSS 2001:4f8:0:2::14
    {
        # Keine weiteren Optionen
    };
};

Hierbei ist folgendes zu beachten:

  • Wir geben nicht das IPv6-Netz bekannt, dass für den Tunnel gedacht ist (in diesem Beitrag c4) sondern das uns zugewiesene Clientnetz (c5)
  • Wir geben zusätzlich einen IPv6-fähigen DNS-Server bekannt. Ist ein eigener vorhanden, kann die entsprechende IPv6-Adresse hier angegeben werden
  • Wenn kein eigener vorhanden ist, kann dieser freie DNS-Server verwendet werden: 2001:4f8:0:2::14

 

Nach der Konfiguration starten wir den Dienst neu mit

/etc/init.d/radvd restart

 

IPv6-Firewall auf dem Raspberry einrichten

Damit unsere Clients nicht ungeschützt mit dem Internet verbunden werden, errichten wir nun eine kleine Firewall auf der Himbeere. Es sollte jedem klar sein, dass sich alle Clients, sofern diese IPv6-fähig sind, ab sofort mit einer öffentlichen Adresse im Internet bewegen und diese somit direkt erreichbar sind. Die Zeiten, in denen wir uns hinter dem hochgelobten NAT verstecken, sind damit vorbei.

Für unsere Firewall errichten wir uns zunächst ein Arbeitsverzeichnis:

mkdir -p /scripts/firewall/

und editieren in diesem eine neue Datei, in welcher wir unsere Regeln ablegen:

nano /scripts/firewall/ipv6regeln.sh

 

Beispielhaft könnte unser Satz an Regeln wie folgt aussehen. Natürlich übernehme ich auch hier keine Haftung für irgendwelche Schäden die entstehen, weil ich in der folgenden Auflistung irgendeine wichtige Regel vergessen habe. Die Auflistung dient auch nur als minimale Aufzählung dessen, was theoretisch notwendig ist.

 

#!/bin/bash

# Alle Regeln löschen
ip6tables -F
ip6tables -X
ip6tables -t mangle -F
ip6tables -t mangle -X

ip6tables -A INPUT -m rt --rt-type 0 -j DROP
ip6tables -A FORWARD -m rt --rt-type 0 -j DROP

ip6tables -A INPUT -i lo -j ACCEPT

ip6tables -A INPUT -i eth0 -j ACCEPT
ip6tables -A FORWARD -i eth0 -o eth0 -j ACCEPT

ip6tables -A INPUT -s fe80::/10 -j ACCEPT

ip6tables -I INPUT -p icmpv6 -j ACCEPT
ip6tables -I FORWARD -p icmpv6 -j ACCEPT

ip6tables -A FORWARD -m state --state NEW -i eth0 -o he-ipv6 -j ACCEPT
ip6tables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
ip6tables -A INPUT -i he-ipv6 -m state --state ESTABLISHED,RELATED -j ACCEPT
ip6tables -A FORWARD -m state --state INVALID -j DROP

ip6tables -A FORWARD -p ipv6-nonxt -m length --length 40 -j ACCEPT

ip6tables -P INPUT DROP
ip6tables -P FORWARD DROP
ip6tables -P OUTPUT ACCEPT

 

Nach dem Verlassen des Editors und dem Speichern der Datei erlauben wir nun die Ausführung dieser:

chmod +x /scripts/firewall/ipv6regeln.sh

 

Anschließend sorgen wir dafür, dass dieses Firewall-Script beim Systemstart geladen wird. Dazu öffnen wir die Datei “/etc/rc.local” mit einem Texteditor:

nano /ect/rc.local

und tragen in dieser vor der Zeile “exit 0;” folgende Zeile ein:

/scripts/firewall/ipv6regeln.sh

 

Wir verlassen auch diese Datei nach dem Speichern und aktivieren zu guter Letzt noch die IP6Tables beim Systemstart:

systemctl enable ip6tables

 

Mit

ip6tables -L -n -v

können wir uns das aktuelle Regelwerk anschauen und beobachten, wieviele Pakete durch welche Regel gewandert sind.

10

 

 

Konfiguration von Windows-Clients

Bei einem einzurichtenden Windows-Client, welcher künftig IPv6-fähig sein soll, öffnen wir das Netzwerk- und Freigabecenter. Dort öffnen wir die Einstellungen der Netzwerkkarte, die uns mit dem Internet verbindet. In unserem Fall wäre das eine kabelgebundene Netzwerkkarte von Intel. In den Eigenschaften der Netzwerkkarte aktivieren wir das Kontrollkästchen “Internetprotokoll Version 6“. Die Optionen dieses Menüpunktes belassen wir beim Standard, so dass die Einstellungen automatisch bezogen werden.

6.5

 

 

Nachdem die Änderung mit “OK” bestätigt wurde, können wir einige Sekunden später den Erfolg unter “Details” betrachten. In diesem Dialog sehen wir, dass unser Client nun über eine (unter anderem globale) IPv6-Adresse, einem IPv6-DNS-Server sowie einem IPv6-Gateway verfügt.

7-2

 

 

Wir öffnen die “Eingabeaufforderung” (Window-Taste + R ⇒ “cmd” ⇒ “OK“) und prüfen auch auf diesem Gerät die IPv6-Konnektivität durch

ping -6 heise.de

8

 

 

Eine weitere Möglichkeit bietet uns die Seite http://test-ipv6.com. Beim Aufruf dieser Seite wird ebenfalls die Konnektivität via IPv6 getestet, als Ergebnis erhalten wir jedoch detailiertere Informationen.

9