zurück zum Artikel

OpenWRT würfelt IPv6-Präfixe

| Reiko Kaps

Obwohl noch kein großer Internet-Provider derzeit IPv6 an Privatkunden verteilt, sorgen sich schon Datenschützer und Surfer um die Privatsphäre. Der gewiefte IPv6-Pionier verschleiert seine Identität mit OpenWRT, das IPv6-Netzwerkpräfixe per Zufall auswählt und einrichtet.

Während sich die ersten großen Internet- Provider noch darauf vorbereiten, ihren Privatkunden Internet per IPv6 bereitzustellen, warnen Datenschützer vor einem drohenden Eingriff in die Privatsphäre, den das künftige Internetprotokoll IPv6 durch die dauerhafte Vergabe fester IPv6-Adressen/Präfixe mit sich bringe.

Eine IPv6-Adresse besteht aus zwei 64 Bit langen Bestandteilen: Der hintere heißt Interface Identifier. Den vorderen nennt man Präfix: Er wird vom Provider zugewiesen und vom eigenen Router an die Geräte im LAN weitergereicht. Den Interface Identifier erzeugen Netzwerkgeräte in der Regel selbst und verknüpfen ihn mit dem Präfix zu einer vollständigen IPv6-Adresse, die für den Internetzugriff taugt (Stateless Address Autoconfiguration).

Damit ein Host nicht an seinem Interface Identifier zu erkennen ist, erzeugen Netzwerkgeräte mit den "Privacy Extensions" (PE) regelmäßig und zufällig neue – in manchen Betriebssystemen wie Linux muss man die PE jedoch selbst einschalten. Mit aktiven Privacy Extensions taugt der Interface Identifier nicht mehr zur Identifizierung, ohne PE erkennt man IPv6-Rechner [1] leicht an der eingeschobenen Ziffernfolge "ff:fe". Windows wechselt den per PE erzeugten temporären Interface Identifier übrigens erst dann, wenn tatsächlich Verkehr über die Netzwerkkarte läuft.

Das vom Provider zugewiesene Präfix sagt jedoch genauso viel oder wenig über den User aus wie bisher die IPv4-Adresse, denn es identifiziert den Internetanschluss. Um beim Präfix für mehr Privatsphäre zu sorgen, hat die Telekom zwei Verfahren angekündigt [2], um auch hier zu variieren. Zum einen soll der Kunde über einen Knopf im Online-Kundencenter ein neues Präfix anfordern können. Das entspricht dann einer Neueinwahl bei IPv4. Zudem sollen die IPv6-tauglichen Speedport-Router innerhalb des zugeteilten Präfixes variieren. Dazu teilt sie dem Router ein nur 56 Bit langes Präfix mit, der dann daraus ein 64 Bit langes erzeugt und es den PCs mitteilt. Die 8 nicht zugeteilten Bits variiert der Router. Datenschützer loben zwar einerseits diese Bemühungen der Telekom, auf der anderen Seite kritisieren sie das recht lange /56-Netzwerkpräfix, das vom europäischen Adressverwalter RIPE als Standardlänge für Einwahlzugänge vorgeschlagen wurde. Tracking-Software wird sich daher auf diese Präfixlänge stürzen. Andere IPv6-Zugangsanbieter verteilen hingegen /48-Präfixe, deren freie 16 Bit solche Analysen deutlicher erschweren.

Auf handelsüblichen Heim-Routern lassen sich diese IPv6-Privacy-Mechanismen meist leider nicht nachbauen. So beherrschen die allermeisten derzeit noch kein IPv6, andere wie AVMs Fritzboxen lassen sich vom Nutzer nur schwer erweitern. Anders sieht es beim Router-Linux OpenWRT [3] aus: Es bringt diverse (IPv6-)Tools sowie Skriptsprachen mit, mit deren Hilfe sich leicht ein zufälliges Präfix erzeugen lässt und die beim automatischen Verteilen im eigenen Netz helfen.

Der Router muss dazu aus den frei verfügbaren Bits eine Subnetzkennung würfeln, sie mit dem vom Provider zugewiesenen Präfix verbinden und ausschließen, dass dieses neue Präfix in der näheren Vergangenheit bereits genutzt wurde. Will man zusätzlich eigene Dienste anbieten, reserviert man ein Subnetz und vergibt auf Router und PCs die (sinnvollerweise statischen) IPv6-Adressen per Hand. Bevor man sich jedoch an die Details des Skripts macht, lohnt ein Blick auf die IPv6-Interna und Spezifikationen, die bei der Wahl der Einstellungen und Vorgaben helfen.

Ein IPv6-tauglicher Rechner braucht für den Zugriff auf das Internet zwei Adressen, die das Protokoll jeweils für andere Zwecke einsetzt (Scopes): Bereits beim Start erzeugt er eine link-lokale, nur auf dem eigenen Netzwerksegment gültige Adresse, die er etwa für die Einrichtung global gültiger IPv6-Adressen braucht. Sind die oben genannten Privacy Extensions eingeschaltet, steht für jedes aktive, global gültige Netzwerkpräfix eine temporäre Adresse bereit, die regelmäßig verfällt. Laut RFC 3484 [4] und RFC 3542 [5] bevorzugen die Betriebssysteme temporäre Adressen als Quellenangabe, wenn Anwendungen ausgehende Verbindungen aufbauen.

Die aktuellen Gültigkeitszeiten verraten die eingebauten Netzwerktools: Unter Windows zeigt netsh interface ipv6 show addr Adressen und deren Verfallsdatum für alle Schnittstellen an, ...

Die aktuellen Gültigkeitszeiten verraten die eingebauten Netzwerktools: Unter Windows zeigt netsh interface ipv6 show addr Adressen und deren Verfallsdatum für alle Schnittstellen an, ...
... auf Linux ermittelt das Kommando ip addr show diese Werte. Fügt man beiden Befehlen einen Schnittstellennamen hinzu, grenzen die Kommandos die Ausgabe auf die angegebene Netzwerkkarte ein.

... auf Linux ermittelt das Kommando ip addr show diese Werte. Fügt man beiden Befehlen einen Schnittstellennamen hinzu, grenzen die Kommandos die Ausgabe auf die angegebene Netzwerkkarte ein.

Dynamisch erzeugte Adressen verwirft das Betriebssystem nach einer gewissen Zeit: Dazu besitzt jede IPv6-Adresse zwei Zähler. In dem einen steht die maximale Gültigkeitsdauer der Adresse für eingehende Anfragen. Der andere enthält die Zeit, in der das Betriebssystem diese Adresse für neue, ausgehende Verbindungen nutzt. Wurde durch den IPv6-Router nichts anderes vorgegeben, akzeptiert Windows sieben Tage lang eingehende Verbindungen auf einer dynamischen Adresse (Gültigkeitsdauer), nach 24 Stunden (bevorzugte Gültigkeitsdauer) erzeugt es jedoch bereits eine neue dynamische Adresse für ausgehende Verbindungen. Ähnlich verhalten sich auch die IPv6-Stacks von Linux und Mac OS X.

Temporäre Adressen verursachen allerdings auch Probleme. Verwirft das Betriebssystem eine dynamische Adresse vollständig, unterbricht das auch laufende Verbindungen. Durch die im RFC 4862 [6] vorgegebenen und in den Betriebssystemen voreingestellten langen Gültigkeitszeiten wirkt sich das allerdings nur auf sehr lang laufende Verbindungen wie SSH-Tunnel, Netzwerkfreigaben etwa über NFS oder auch Peer2Peer-Software aus.

Um dieses Problem zu minimieren, empfiehlt RFC 4862 [7] daher sehr lange Gültigkeitszeiten für dynamische Adressen/Präfixe: Die Dauer, in der das Betriebssystem über die nicht mehr bevorzugte Adresse Daten weiterhin entgegen nimmt (deprecation period), muss lang genug sein, damit Anwendungen ausreichend Zeit haben, auf die neue Adresse respektive das neue Netzwerkpräfix wechseln zu können. Ein anderer Ausweg ist ein zusätzliches Präfix im eigenen Netz, über dessen Adressbereich solche lang andauernden Verbindungen laufen können – vorausgesetzt die jeweiligen Anwendungen lassen sich auf diesen Quelladressbereich einstellen.

Weil sich lange Lebenszeiten aus Gründen des Privatsphärenschutzes verbieten, könnte man versucht sein, sie so kurz wie möglich zu setzen – doch eine sehr kurze Adresslebensdauer unter zwei Stunden verursacht Probleme unter Linux. Wie auch andere Betriebssysteme mit eingeschalteter PE erzeugt es für jedes Präfix mindestens zwei Adressen. Überschreitet die Menge dieser temporären Adressen eine bestimmte Zahl (offenbar 16), schalten aktuelle Linuxe mit einer wenig aussagekräftigen Fehlermeldung [8] (ipv6_create_tempaddr(): use_tempaddr is disabled.) die Privacy Extensions schlicht ab. Als Quelladresse verwendet Linux dann wieder die aus der Hardwareadresse abgeleitete, was das zusätzliche Verwirrspiel mit dem wechselnden Präfix entwertet.

Zudem erhöht sich mit einer kurzen Präfix-Lebensdauer zwar die Entropie in den Logdateien der besuchten Webserver, sie bringt hingegen kaum einen Vorteil gegenüber den im RFC 4862 [9] genannten Werten oder den Betriebssystemvorgaben. Wendet man die oben genannten Werkseinstellungen auch für den wechselnden Präfix an, vermeidet man Verbindungsprobleme und verwirrt Tracking-Software täglich mit einem neuem Netzwerkpräfix.

Mit IPv6 lassen sich Netzwerke einfach umnummerieren respektive mit neuen Präfixen versorgen. Ein IPv6-Router verteilt dazu neben dem alten Präfix auch ein neues. Das alte bleibt etwa für eingehende Daten weiterhin gültig (valid_lifetime). Gleichzeitig setzt der Router die preferred_lifetime auf 0, sodass die Clients das Präfix nicht mehr für ausgehende Verbindungen einsetzen. Nachdem der Zähler in valid_lifetime abgelaufen ist, verwirft das Betriebssystem bei der Stateless Address Autoconfiguration diese Adresse vollständig und automatisch. Die Grundeinrichtung von IPv6 unter OpenWRT sowie einige Eigenheiten des Router-Linux beschreiben die Artikel IPv6-Zugang fürs LAN nachrüsten [10] und Taschenrouter als IPv6-Verteiler [11] auf heise Netze.

Mit diesem Wissen und mit einem OpenWRT-Router lässt sich schnell ein einfaches Beispiel-Skript zusammenbauen (Download als ZIP-Archiv [12]), das all diese Vorgaben erledigt, einen Präfix auswürfelt und verteilt, die Router-Adressen setzt und sich auch um das Zurückholen abgenutzter Präfixe kümmert. Das in AWK [13] geschriebene Skript greift des Weiteren auf die Jobsteuerung cron sowie OpenWRT-typische Funktionen wie die Konfigurationshilfe uci [14] zurück, die etwa den Linux IPv6 Router Advertisement Daemon (radvd) weitgehend automatisch einrichtet. Auf unserem Testrouter (D-Link DIR-300 Rev. B [15]) läuft ein Sixxs-Tunnel [16], für den ein /48-Präfix bereitsteht, sowie ein aus den Trunk-Quellen übersetztes OpenWRT [17] mit einem radvd [18] in Version 1.8.2. Ab dieser Version erleichtert eine zusätzliche Funktion das Zurückholen eines benutzten Präfixes – umständliches Setzen von Laufzeiten sowie manuelle Neustarts entfallen. Allerdings muss man die Hilfe zuerst ausdrücklich einschalten.

uci set radvd.@prefix[0].DeprecatePrefix=on
uci set radvd.@prefix[0].DecrementLifetimes=on

Der BEGIN-Block des IPv6-Präfix-Würfel-Skripts setzt den eigenen Präfix (prefix) und ein reserviertes, also vom Skript niemals zu nutzendes Subnetz (reserved). Außerdem finden sich dort die Vorgaben für Gültigkeit, Lebensdauer und die Zeit, nach der das Skript ein einmal genutztes Präfix erneut verwenden darf.

BEGIN {
srand();
prefix="2001:0db8:1";
reserved="affe";
AdvValidLifetime=604800;
AdvPreferredLifeTime=86400;
do {
gensubnet();
} while (find_in_alltime(full_prefix) == 0)
...
exit;
}

function find_in_alltime(full_prefix)
{
FS=";";
erg=1;
while ((getline line < alltime) > 0)
{
split(line, data, ";")
if ( data[1] == full_prefix ) {
if ( data[3] > systime() - (3*AdvValidLifetime)) {
erg=0;
}
}
}
close(alltime);
return erg;
}

function gensubnet() {
do {
subnet=sprintf("%x", int(0xffff*rand()));
} while(subnet == reserved)
full_prefix=prefix ":" subnet "::/64";
router_addr=prefix ":" subnet "::1/64";
gentime=systime();
return;
}

function setgwaddr(addr, ...) {
...
}

function set_newprefix(nprefix,...) {
...
}

Anschließend würfelt die Funktion gensubnet() eine Subnetz-ID und überprüft, ob sie reserviert ist. Falls ja, läuft gensubnet() weiter, bis ein Subnetz-ID gefunden wurde. Zum Abschluss liest das Skript aus einer Logdatei alle bisher verwendeten Präfixe ein und vergleicht sie mit dem gerade erzeugten (find_in_alltime(full_prefix)). Kommt es dabei zu Kollisionen, tritt wieder gensubnet() auf den Plan. Alle anderen Skriptteile kümmern sich über uci um die Einrichtung des Netzes und aktivieren mit ip eine zum Präfix passende und ebenfalls temporäre Gateway- Adresse auf dem Router.

Den täglichen Wechsel des IPv6-Präfixes stößt man über die Jobsteuerung cron an. Die über das Kommando crontab -e eingegebene Zeile

0 5 * * * awk -f /usr/local/bin/mkprefix.awk

rollt allmorgendlich ein neues Präfix aus. Hinterlegt man die Kommandozeile in /etc/rc.local, führt der Router das Skript auch beim Start aus. Das IPv6-Präfix-Würfel-Skript speichert die einmal verwendeten Präfixe in einer Textdatei unter /tmp/prefix.log, die allerdings bei jedem Router-Neustart verloren geht. Zum Schluss muss man noch die IPv6- Firewall des Routers anpassen, die nun ausgehende Daten aller Subnetze unterhalb des eigenen /48-Präfix ins Internet durchreichen soll.

ip6tables -A FORWARD -m state --state NEW \
-i eth0 -o sixxs -s 2001:db8:1234::/48 -j ACCEPT
ip6tables -A FORWARD -m state --state ESTABLISHED,RELATED \
-j ACCEPT

Den hier verwendeten Präfix 2001:db8: 1234::/48 müssen Sie gegen Ihren eigenen austauschen. Anschließend gelangen Sie über den Router mit täglich wechselnden Subnetzen ins Internet. Um den zweiten Teil der IPv6-Adresse (Interface Identifier) muss sich hingegen das Betriebssystem auf den Endgeräten kümmern.

Nach der Veröffentlichung dieses Artikels in c't hat der Autor des Linux IPv6 Howtos [19], Peter Bieringer, das Skript grundlegend überarbeitet: Denn das oben beschriebene Skript funktioniert so nur auf Routern, die per Sixxs-Tunnel ins Netz gelangen und deren IPv6-Präfix per Hand fest vorgegeben wird. An nativen IPv6-DSL-Zugängen erhält der Router das Netzwerk-Präfix jedoch über DHCPv6 vom Provider zugewiesen, sodass man es im Skript ermitteln muss.

Peter Bieringers neues Skript mkprefix2ng.awk erkennt, ob OpenWRT per Sixxs-Tunnel oder DSL-Zugangs ins IPv6-Internet gelangt, extrahiert das aktuelle Präfix und wählt automatisch passende Parameter. Mit anderen Tunnel-Verfahren wie Gogo6 arbeitet es bislang (noch) nicht zusammen. Auf der LAN-Seite bedient es hingegen auch mehrere Schnittstellen, sodass man auch ein Gastnetz mit einem wechselnden Präfix versorgen kann. Da das Skript noch in mitten in der Testphase steckt, lohnt ein Blick auf seine Parameter, die vollständig im Quelltext dokumentiert sind: Sollte die Zugangserkennung scheitern, wählt man mit dem Parameter -v access=dhcp6c|sixxs die Art des IPv6-Zugangs und mit -v interface=NAME das jeweilige LAN-Interface per Hand.

Mittlerweile hat es durch diese Erweiterungen eine stattliche Größe von 25 KByte erreicht: Dafür versorgt es den IPv6-Administrator auch mit reichlich Informationen über seine Tätigkeit und kennt mehrere Kommandozeilen-Schalter, mit denen sich verschiedene Vorgaben erzwingen lassen oder die die ansonsten üppigen Log-Meldungen unterdrücken. Wie auch die Ausgangsfassung stößt die Job-Steuerung Cron den überarbeiteten Präfix-Würfel an.

Peter Bieringers und die ursprüngliche, nur mit statischen Präfixen funktionierende Fassung mkprefix-static.awk finden sich inzwischen in einem Online-Software-Repository [20], das sich per Mercurial, Git oder Webbrowser auslesen lässt. Dort liegt auch die Datei INSTALL, die knapp die Einrichtung beschreibt. (rek [21])


URL dieses Artikels:
https://www.heise.de/-1445607

Links in diesem Artikel:
[1] https://www.heise.de/ratgeber/IPv6-Privacy-Extensions-einschalten-1204783.html
[2] https://www.heise.de/news/Deutsche-Telekom-stellt-Datenschutztechnik-fuer-IPv6-vor-1383772.html
[3] https://openwrt.org/
[4] http://www.heise.de/netze/rfc/rfcs/rfc3484.shtml
[5] http://www.heise.de/netze/rfc/rfcs/rfc3542.shtml
[6] http://www.heise.de/netze/rfc/rfcs/rfc4862.shtml
[7] http://www.heise.de/netze/rfc/rfcs/rfc4862.shtml
[8] http://home.regit.org/2011/04/ipv6-privacy/
[9] http://www.heise.de/netze/rfc/rfcs/rfc4862.shtml
[10] https://www.heise.de/ratgeber/IPv6-Zugang-fuers-LAN-nachruesten-1260260.html
[11] https://www.heise.de/ratgeber/Taschenrouter-als-IPv6-Verteiler-1440851.html
[12] ftp://ftp.heise.de/pub/ct/listings/1203-160.zip
[13] http://de.wikipedia.org/wiki/Awk
[14] http://wiki.openwrt.org/doc/uci
[15] http://wiki.openwrt.org/toh/d-link/dir-300revb
[16] https://www.sixxs.net/
[17] https://dev.openwrt.org/wiki/GetSource
[18] http://www.litech.org/radvd/#OlderUpdateInformation
[19] http://mirrors.bieringer.de/Linux%2BIPv6-HOWTO-de/
[20] https://bitbucket.org/reik/ipv6randomizer/src
[21] mailto:rek@ct.de