Benutzer-Werkzeuge

Webseiten-Werkzeuge


Seitenleiste

Schnelleinstieg:

wiki:6rd

6rd

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.

Einsatz von 6rd

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.

Zusammensetzung des eigenen Präfix

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.

Beispiel aus dem DG-Netz

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.

ISP-Daten

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
Deutsche Glasfaser 2a00:61e0::/32 2 3 4 /56 100.127.0.1 Beispiel

Kompatible Systeme

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

Einrichtung auf der Sophos UTM

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

Einrichtung auf Mikrotik Routern

Manuelle Einrichtung

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.

  1. 6to4 Interface erstellen; Local-Address ist die WAN-IPv4, Remote-Address die vom Relay des ISP.
  2. IPv6 Adressen anlegen, eine (/128) Adresse auf dem neuen Tunnelinterface, und ein Subnetz auf dem LAN Interface. Dieses per Advertise im Netz verteilen, zwecks SLAAC.
  3. IPv6 Route anlegen: 2000::/3 (IPv6 Internet) über den Tunnel
  4. Die Firewallregeln nicht vergessen!

Automatische Einrichtung

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.

Einrichtungsskript

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!

Aktualisierungsskript

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

Geben Sie Ihren Kommentar ein. Wiki-Syntax ist zugelassen:
 
wiki/6rd.txt · Zuletzt geändert: 2020/05/24 17:50 (Externe Bearbeitung)