Aktuelle Info zur Deutschen Glasfaser: Es scheint so, dass die DG nun flächendeckend nativ IPv6 per PD anbietet! Bei drei Anschlüssen läuft das bereits sehr gut!
6rd ist eine Übergangslösung, um IPv6 Zugänge über eine IPv4 Infrastruktur zu tunneln. Technisch ist 6rd ein 6to4-Tunnel. Der Unterschied besteht lediglich in der Nutzung von providereigenen IPv6-Präfixen und Relays.
6rd wird von einigen (wenigen) Providern eingesetzt, um den Kunden öffentlich erreichbare IPv6-Bereiche zu bieten. Ein prominenter ISP, der diese Technik einsetzt ist die Deutsche Glasfaser (DG).
6rd wird extrem oft mit einem DS-Lite-Anschluss verwechselt. Das beste Beispiel sind zahlreiche Forenbeiträge bezüglich der DG, wenn es um die Nutzung des eigenen IPV6-Bereichs mit eigenen Routern geht, welche keine FritzBox sind. Das Problem ist die relativ geringe Verbreitung der Technik. Viele Router kommen mit 6rd nicht klar, erst recht nicht mit der automatischen Konfiguration. Die nötigen Daten für 6rd werden mittels der DHCP-Option 212 geliefert.
Die Schwierigkeit ist, die notwendigen Daten, wie Relayserver, Präfix vom ISP und die Größe der vergebenen Netze rauszufinden. Eine Möglichkeit wäre, die DHCP-Option auszulesen, danach im Netz zu suchen, oder aber die Möglichkeit für Faule: Den ISP fragen .
Die „öffentlichen“ Adressen im Bereich 100.64.0.0/10 sind CGNAT Adressen.
Das eigene IPv6 Subnetz ist abhängig von der IPv4-Adresse im Providernetz, den daraus wird der eigene Präfix errechnet. Der eigene Präfix beginnt mit dem Präfix des ISP, gefolgt von mehreren oder allen - in das hexadezimale Zahlensystem - Oktetten der eigenen IPv4-Adresse im Providernetz.
Die DG hat das Prefix 2a00:61e0::/32. Ich habe die CGNAT-IP 100.65.95.150 (geändert).
Bei der DG werden die Oktetten 2-4 genutzt (65; 95; 150). Diese werden in das hexadezimale Zahlensystem umgewandelt:
Dezimal | Hexadezimal |
---|---|
65 | 41 |
95 | 5F |
150 | 96 |
Nun hängen wir diese Werte der Reihe nach an den DG-Präfix:
2a00:61e0:415f:9600::/56
Das ist nun unser eigenes IPv6-Netz.
Hier soll eine Sammlung bekannter ISP-Daten für 6rd entstehen. Bekannte Daten gerne unten in die Diskussion schreiben.
Oktettennutzung: 100.65.95.150
1. 100; 2. 65; 3. 95, 4.150
Die Reihenfolge in der Tabelle gibt die Reihenfolge der „Hex-Oktetten“ im IPv6 Präfix an
ISP | Präfix | Oktettennutzung | Eigene Präfixlänge | Relay | Beispiel |
---|---|---|---|---|---|
| | | | | |
Folgend eine Auflistung von Systemen, und deren Unterstützung von 6rd:
System | Unterstützung |
---|---|
FritzBox | Ja, automatisch |
Sophos UTM | Eingeschränkt, manuell per Skript |
Mikrotik | Ja, halbautomatisch (ohne DHCP) per Skript |
Da ich aktuell keine UTM nutze, kann ich hierzu nicht mehr viel sagen.
6rd wird von der UTM nativ NICHT unterstützt. Wir haben damals mithilfe einer Anleitung für 6rd unter Linux-Systemen etwas gebastelt, was die Nutzung zumindest in Teilen - aber nicht zufriedenstellend - ermöglicht.
Die Sophos kann unbeschränkt viele Adressen aus dem eigenen Präfix nutzen (via Additional Addresses), allerdings kann sie 6rd Traffic nicht richtig in andere Netze routen. Interne Geräte mit einer öffentlichen IPv6 Adresse können so nicht von außerhalb erreicht werden. Die Kommunikation von intern nach extern war ebenfalls recht eingeschränkt. Ich habe die Problemlösung seinerzeit aufgegeben. Ein sehr engagierter Mitarbeiter von Sophos - mit dem wir die Thematik durchgegangen sind - sagt, dass das Problem auf jeden Fall im internen Routing der UTM liegt, hier wurde allerdings nichts weiter unternommen.
Folgend unser (quick'n'dirty ) Script, welches über die Konsole auf der Sophos abgelegt werden muss. Da die Änderungen nicht persistent sind (sie überleben einen Reboot nicht), sollte das Script mit @reboot in die /etc/crontab-static eingetragen werden. So wird das Script bei jedem Boot automatisch ausgeführt. Die Adressen müssen selbstverständlich angepasst werden, siehe Zusammensetzung des eigenen Präfix
#!/bin/bash echo "6rd Tunnel Einrichtung" #Externe IPv6 Adresse aus dem Subnetz (eth1 = ext. Interface) ip addr add 2a00:61e0:428f:f800::1/64 dev eth1 #Externe IPv4 ip tunnel add 6rd mode sit local 100.66.143.248 ttl 64 #ISP-Präfix ip tunnel 6rd dev 6rd 6rd-prefix 2a00:61e0::/32 #Eigenes IPv6 Netz ip addr add 2a00:61e0:428f:f800::/56 dev 6rd ip link set 6rd up #Relay-Host ip route add ::/0 via ::100.127.0.1 dev 6rd echo "Fertig!"
Hier noch meine crontab-static:
SHELL=/bin/sh PATH=/usr/bin:/usr/sbin:/sbin:/bin MAILTO="" @reboot root /root/make_6rd.sh */10 * * * * root ping6 -c 4 www.heise.de > /dev/null
Der Ping war nötig, da sonst teils der Tunnel von außen nicht erreichbar war (Keepalive vermutlich).
Folgend noch ein paar Bilder aus dem WebAdmin, bezüglich nötiger Firewall-Regeln usw.
Über die WAF ist es möglich IPv6-Pakete in IPv4-Pakete zu „wandeln“. So lassen sich über die Sophos-6rd-Adressen interne Dienste bereitstellen
6rd auf Mikrotikroutern ist kein Hexenwerk und voll funktionsfähig! Das kann man manuell einrichten, oder halbautomatisch per Skript erledigen lassen. Letzteres ist sinnvoll, da das Skript automatisch auf Änderungen der IPv4-Adresse im Providernetz reagiert.
Da 6rd die selbe Technik wie 6to4 nutzt, nutzen wir einfach ein 6to4-Interface.
Um den Prozess der Einrichtung zu vereinfachen, habe ich ein Skript erstellt. Zudem gibt es ein Skript, welches bei einer Änderung der IPv4-Adresse den daraus errechneten IPv6-Präfix (und Routen) aktualisiert.
Das Skript ist auf auf vom ISP vergebene Prefixe, die /56 lang sind ausgelegt. Sollte dies abweichen, sind Änderungen nötig!
Folgendes Skript im Router unter System → Scripts anlegen:
Rechte: read, write, ftp
:local ipv4EXT; :local WANIF "WAN"; :local LANIF "Internal-Bridge"; :local octett :local startdot 0; :local enddot 0; :local ipv6 "2a00:61e0:"; :local RELAYIP 100.127.0.1; :local ipv6EXT "01::1/128"; :local ipv6INT "00:1::100/64"; :local ifname "6rd"; :global dectohex do={ :local dec [:tonum $1]; :local hex; :for i from=0 to=1 step=1 do={ :set $hex ([:pick "0123456789abcdef" (($dec>>(4*i))&0xf)].$hex); } :return $hex; } :log warning "Create 6rd Interface..."; :set $ipv4EXT [/ip address get [find interface=$WANIF] address]; :set $ipv4EXT [:pick $ipv4EXT 0 [:find $ipv4EXT "/"]]; :log info "Your WAN IP on IF $WANIF is $ipv4EXT"; :set $ipv4EXT ($ipv4EXT."./"); :set $startdot [:find $ipv4EXT "." $enddot]; :for i from=1 to=3 step=1 do={ :set $enddot [:find $ipv4EXT "." $startdot]; :set $octett [:pick $ipv4EXT ($startdot+1) $enddot]; :set $startdot $enddot; :set $ipv6 ($ipv6.[$dectohex $octett]); :if ([:pick $ipv6 ([:len $ipv6]-5)]=":") do={ :set $ipv6 ($ipv6.":"); } } :set $ipv4EXT [:pick $ipv4EXT 0 [:find $ipv4EXT "./"]]; :log info "Your IPv6 Subnet is $ipv6 00/56"; :set $ipv6EXT ($ipv6.$ipv6EXT); :set $ipv6INT ($ipv6.$ipv6INT); /file print file=wanip.txt; /file set wanip.txt contents="$ipv4EXT\n$ipv6EXT\n$ipv6INT\n"; :log info "Your IPv6 External Address is $ipv6EXT"; :log info "Your IPv6 Internal Subnet is $ipv6INT"; /interface 6to4 add name=$ifname remote-address=$RELAYIP local-address=$ipv4EXT; /ipv6 route add dst-address=2000::/3 gateway=$ifname; /ipv6 address add address=$ipv6INT advertise=yes interface=$LANIF; /ipv6 address add address=$ipv6EXT advertise=no interface=$ifname;
Folgende Dinge eintragen (:local NAME WERT;):
Name | Wert |
---|---|
WANIF | Name des WAN-Interface |
LANIF | Name des LAN-Interface |
ipv6 | Präfix des ISP mit Doppelpunkt am Ende |
RELAYIP | IP-Adresse des Relayservers |
ipv6EXT | Host-Part der gewünschten externen /56 Adresse |
ipv6int | Gewünschtes Internes Subnetz, nur Hostpart einer /56-Addresse mit Präfixlänge am Ende |
Jetzt einmal ausführen, das Interface sollte da sein und funktionieren! Gegebenenfalls Logmeldungen beachten!
Das Skript prüft (periodisch) die IPv4-Adresse. Bei einer Änderung wird der 6rd-Tunnel aktualisiert. Dazu folgendes Skript im Router unter System → Scripts anlegen:
Rechte: read, write
Die Daten müssen gleich wie im Einrichtungsskript sein!
:local ipv4EXT; :local WANIF "WAN"; :local LANIF "ether5"; :local octett :local startdot 0; :local enddot 0; :local ipv6 "2a00:61e0:"; :local ipv6EXT "02::1/128"; :local ipv6INT "03:1::100/64"; :local ifname "6rd-temp"; :local prevfile [/file get wanip.txt contents]; :local prevwanip; :local previpv6EXT; :local previpv6INT; :local newlinepos; :local newlinepos2; :global dectohex do={ :local dec [:tonum $1]; :local hex; :for i from=0 to=1 step=1 do={ :set $hex ([:pick "0123456789abcdef" (($dec>>(4*i))&0xf)].$hex); } :return $hex; } :set $newlinepos [:find $prevfile "\n"]; :set prevwanip [:pick $prevfile 0 $newlinepos]; :set $ipv4EXT [/ip address get [find interface=$WANIF] address]; :set $ipv4EXT [:pick $ipv4EXT 0 [:find $ipv4EXT "/"]]; :if ($prevwanip!=$ipv4EXT) do={ :log warning "IPv4 has changed ($ipv4EXT)! Refresh 6rd..." :set $newlinepos2 ($newlinepos+1); :set $newlinepos [:find $prevfile "\n" $newlinepos]; :set $previpv6EXT [:pick $prevfile $newlinepos2 $newlinepos]; :set $newlinepos2 ($newlinepos+1); :set $newlinepos [:find $prevfile "\n" $newlinepos]; :set $previpv6INT [:pick $prevfile $newlinepos2 $newlinepos]; :set $ipv4EXT ($ipv4EXT."./"); :set $startdot [:find $ipv4EXT "." $enddot]; :for i from=1 to=3 step=1 do={ :set $enddot [:find $ipv4EXT "." $startdot]; :set $octett [:pick $ipv4EXT ($startdot+1) $enddot]; :set $startdot $enddot; :set $ipv6 ($ipv6.[$dectohex $octett]); :if ([:pick $ipv6 ([:len $ipv6]-5)]=":") do={ :set $ipv6 ($ipv6.":"); } } :set $ipv4EXT [:pick $ipv4EXT 0 [:find $ipv4EXT "./"]]; :set $ipv6EXT ($ipv6.$ipv6EXT); :set $ipv6INT ($ipv6.$ipv6INT); :log warning "Your new IPv6 Subnet is $ipv6 00/56"; :log warning "Your new IPv6 External Address is $ipv6EXT"; :log warning "Your new IPv6 Internal Subnet is $ipv6INT"; /interface 6to4 set $ifname local-address=$ipv4EXT; /ipv6 address remove [find address=$previpv6EXT]; /ipv6 address remove [find address=$previpv6INT]; /ipv6 address add address=$ipv6INT advertise=yes interface=$LANIF; /ipv6 address add address=$ipv6EXT advertise=no interface="$ifname"; /file set wanip.txt contents="$ipv4EXT\n$ipv6EXT\n$ipv6INT\n"; }
Dann noch ein Scheduler erstellen, der das Skript periodisch startet:
Diskussion