IPv6
IPv6 ist die Weiterentwicklung und der Nachfolger des Internet Protokolls IPv4. Für die Nutzung von IPv6 ist die Unterstützung seitens des Internet Service Providers (ISP) und des Betriebssystems erforderlich. Sollte der ISP noch kein IPv6 unterstützen, so bietet sich eine "sanfte" Migration per "IPv6 durch IPv4"-Tunnel an. Ein solcher IPv6-Tunnel-Provider war z.B. SixXS, für den exemplarisch das Setup vorgestellt wird. Alternativ bietet sich seit Abschalten von SixXS der Provider Hurricane Electric an. Der Client läuft dann in der Regel in einem Dual-Stack Modus, bei dem IPv4 und IPv6 gleichzeitig unterstützt werden.
Grundlagen
Allgemeine Infos
- Wikipedia (de)
- Status-Reports
- IPv6 im Heimnetz, siehe c't 12/07 S.134
- kleine IPv6 FAQ: siehe c't 25/10 S.182 und siehe c't 12/19 S.178, http://ct.de/ydde
- Privatsphäre mit IPv6: siehe c't 03/11 S.146
- IPv6-Zugang im LAN per Tunnel-Provider: siehe c't 08/11 S.190 bzw. IPv6-Zugang fürs LAN nachrüsten (Heise)
- IPv6 für kleine Netze (Heise)
- Mit IPv6 ins Internet, siehe c't 06/08 S.214, Soft-Link 0806214, Listings
- IPv6-Adressbereiche (Heise)
- Aspekte der und Argumente für die IPv6-Einführung, siehe iX 09/09 S.40 und S.48
- IPv6 und IPv4 im Zusammenspiel
- Dual-Stack, Dual-Stack Lite, NAT64, DNS64: siehe LM 08/11 S.26
- Verzögerungen bei der Adress-Auflösung (Happy Eyeball) und Auswahl des Protokolls: siehe c't 13/16 S.182, http://ct.de/yu5e
- IPv6 im Mobilfunk, siehe c't 05/12 S.180
- DS-Lite (z.B. bei Unitymedia)
- siehe c't 06/13 S.178 (Schleuserdienste und Tunnel für IPv4-Zugriff, Pagekite, SSH-Tunnel)
- Port Control Protocol
- Gateway Dienste (z.B. von Cosimo): siehe c't 08/15 S.150
- UDP Brücke UdpPipe: siehe c't 06/18 S.152
- Heimserver hinter DS-Lite bzw. CG-NAT erreichbar machen (Root-Server als Proxy + SSH Tunnel): siehe c't 02/18 S.138,ct:y14q
- Feste IPv4 Adresse über Tunnel: http://fest-ip.net , ct:ytyc
- IPv6 Crash Course For Linux (linux.com)
- Simple IPv6 HOWTO
- Understanding IP Addressing (ripe.net)
- IPv6 Address Allocation and Assignment Policy (ripe.net)
- IPv6-Einführung, siehe LU 01/10 S.84 (Grundlagen) und LU 02/10 S.80 (SixXS)
- IPv6 Präsentation vom CCC
- Liste der nativen IPv6-Provider in Deutschland (sixxs.net)
- ipv6-ops Mailingliste
- 6DISS E-Learning (Videos) , 6DISS Tutorials (PDF)
- 6DEPLOY Tutorials (PDF)
- IPv6 Migrationsleitfaden für die öffentliche Verwaltung (BMI und BVA) mit Begleitdokument, IPv6 Best Practice
- siehe c't 15/13 S.156
- IPv6 Tipps für den Start: siehe c't 02/13 S.124
- IPv6-Netzwerke erkunden (ICMPv6, Neighbor Discovery, Neighbor Solicitation, Neighbor Advertisements): siehe c't 19/13 S.150
- IPv6 im Heimnetz mit Routerkaskaden, Subnetting, Dienstfreigaben/Firewall und DynDNS am Beispiel einer Fritz!BOX: siehe c't 03/14 S.168
- IPv6-Konfiguration eines Linux-DSL-Gateways - Pro-Linux
- IPv6 bei Teltarif
- Introduction to IPv6
- LISP kann IPv4 ans IPv6 Netzwerk anbinden: siehe c't 03/17 S.136
- Report IPv6: siehe iX 10/19 S.84
- http://whynoipv6.com - Große Webseiten ohne IPv6
- IPv6 Gundlagen, Netzwerk, VPN mit IPv6 (Fritzbox, Wireguard): siehe c't 07/22 S.56 ff, ct:ymga, ct:ytyc, ct:
Literatur
- iX Kompakt IPv6-Leitfaden (Okt. 2013)
Neighbor Discovery und Autoconfiguration
- Neighbor Discovery Protocol (NDP) (Wikipedia)
- Autokonfiguration (Wikipedia)
- RFC 2461
- IPv6: Stateless Address Autoconfiguration mit Router Advertisement Daemon (radvd) (it-academy.cc)
- EUI/MAC
- EUI48 (ieee.org)
- EUI64 (ieee.org)
- IPv6 Autoconfiguration (cisco.com)
Beispiel für Erstellung des Local Identifiers, siehe cisco.com:
- MAC Adresse: 00-0C-29-C2-52-FF
- Konvertiert zu EUI-64: 00-0C-29-FF-FE-C2-52-FF (FF-FE wird dazwischen geschoben)
- In IPv6 Notation: 000c:29ff:fec2:52ff
- Dann wird gemäß RFC 3513,de das Universal Bit ("u" bit) auf der 7. Position des 1. Octets auf 1 gesetzt.
- Ergebnis: 020c:29ff:fec2:52ff (aus 00h (binär 00000000) wird 02h (binär 00000010))
DHCP
In IPv6-Netzen wird man wohl folgende Szenarien antreffen, um IPv6-Adressen und andere Parameter den Clients zuzuteilen:
- Autoconfiguration: IPv6-Adresse und Default-Gateway + DNS-Server gemäß RFC 5006)
- Vorteil: kein DHCP-Server nötig, daher weniger fehleranfällig
- Nachteil: keine anderen optionalen Parameter möglich (wie NTP- oder WINS-Server)
- Autoconfiguration für IPv6-Adresse und Default-Gateway + Stateless DHCP für alle anderen Parameter wie DNS- oder NTP-Server
- OtherConfig im Router Advertisement sollte gesetzt sein
- Vorteil: alle DHCP-Parameter möglich
- Nachteil: DHCP-Server kann keine dynamischen DNS-Einträge vornehmen, da er die IPv6-Adresse nicht kennt
- Stateful DHCP für IPv6-Adresse und andere Parameter
- ManagedFlag im Router Advertisement sollte gesetzt sein
Sicherheit und Datenschutz
- Firewall
- RFC 4890 - Recommendations for Filtering ICMPv6 Messages in Firewalls
- Auf der Firewall selbst sind Input/Output-Regeln zumindest für ICMPv6 nötig, damit Firewall am IPv6-Netz teilnehmen kann (z.B. für Neighbor Discovery)
- ip6tables
- Introduction to IPv6 and Firewalls with Linux and iptables (PDF)
- IPv6-Firewall - Tipps zur Einrichtung und Funktion testen: siehe c't 11/13 S.162 und S.168
- Sicherheitsaspekte des Routing-Headers: siehe iX 08/07 S.114 und Schwachstelle im IPv6-Routing
- Sicherer als IPv4, aber nicht sicher genug – IPv6 braucht Filter
- IPv6 ist weit sicherer als IPv4 (silicon.de)
- Neues Internet-Protokoll erschwert anonymes Surfen (spiegel.de)
- Sicherheitstechnische Betrachtung von ICMPv6, NDP, Privatsphäre, Firewall, Stateless Autoconfiguration, Stateful/Stateless-DHCP: siehe LM 08/11 S.36
- siehe iX 07/11 S.56
- Präfix beim Router Advertisement (radvd) automatisch wechseln am Beispiel von OpenWRT: siehe c't 03/12 S.160
- IPv6: Sechs Richtlinien für den Schutz der Privatsphäre (Heise), Leitlinien IPv6 und Datenschutz (ipv6council.de)
- Kommentar: IPv6 und der Datenschutz (heise.de)
- Datenschutztheater: dynamische IPv6 Adressen (blog.koehntopp.de)
- Workshop "Aufspüren von Sicherheitslücken bei IPv6": siehe LM 10/12 S.38
- Projekt: IPv6 Intrusion Detection System, Workshop mit Ergebnissen + Testsuite entwickelt, siehe c't 15/13 S.36
- IPv6 und Privatsphäre: siehe iX 03/15 S.90
- IPv6 security myths
- Aktive Systeme in IPv6-Netzen aufspüren: siehe iX 06/17 S.92 (u.a. mit Eigenheiten bei der Adressvergabe z.B. von virtuellen Systemen, DNS, Toolhandling THC-IPv6 Toolkit)
passive_discovery eth0 scan6 -i eth0 -L -v -e nmap -script dns-ip6-arpa-scan -script-args='prefix=2001:0DB8:1ab:/48'
Programmieren mit IPv6
Kernel-Parameter und Socket Optionen: http://www.kernel.org/doc/man-pages/online/pages/man7/ipv6.7.html , zum Beispiel
sysctl net.ipv6.bindv6only=1
IPv6 Adressen
Link Local Prefix:
fe80::/10
Multicast Prefix:
ff00::/8
Unique Local Adress Prefix:
fc00::/7
Dokumentations-Prefix:
2001:db8::/32
Teredo Prefix:
2001:0000::/32
6to4 Prefix:
2002::/16
IPv4 und IPv6 im Übergang: http://www.rdfnuernberg.de/iav1a/theorie/adresskonzepte3_2.html
Host Identifier:
ip token list ip -6 a ip token set ::27 dev eth0
Kurze Adressen zum Testen
- DNS-Provider:
ping 2600::1
Routing
Tools
- Basic-Tools und Einstellungen siehe c't 13/11 S.162
- Connectivity
- test-ipv6.com - Test your IPv6 connectivity
- http://ipv6-test.com
- https://ct.de/ip
- http://ipv6-test.com/validate.php - validiert IPv6, auch Websites
- Online Port Scanner IPv6 (subnetonline.com)
- Online Ping IPv6 (subnetonline.com)
- IPv6 Subnet Calculator
- Online web IPv4 and IPv6 IP subnet Calculator
- IPv6 Subnet Prefix Reference Chart (CIDR)
- Ping
- TAHI Project - Test and Verification for IPv6
- KabelBW - Asugabe der eigenen IPv4 und IPv6 Adresse
- SI6 Networks IPv6 Toolkit, u.a. mit
- IPv6 address analysis and manipulation tool
- IPv6 address scanning tool
- diverse Tools zum Testen der Sicherheit
- siehe c't 19/13 S.150
- Alle IPv6 Adressen mit MAC-Adressen (-e) im lokalen Subnetz (-L) erkunden:
scan6 -i eth0 -L -e -v
- Test-Tools (IPv6 privacy extensions, IPv6 connectivity) : https://en.internet.nl
- Nmap
- Host scannen
nmap -6 -sT -PN fe80::7271:bcff:1234:5678
- Wireshark Filter
- Neighbor Advertisements (136) und Neighbor Solicitations (135)
icmpv6.type==136 || icmpv6.type==135
- Router Advertisements (134)
icmpv6.type==134
- Echo Request 128, Reply 129
- tcpdump
tcpdump -i eno1 "icmp6" tcpdump -i eno1 "icmp6[0] == 134" tcpdump -i eno1 "icmp6 && ip6[40] == 134"
- Ping
- Alle Rechner per Multicast anpingen
ping6 -c 5 -I eth0 ff02::1
Anzahl der Adressen als Beispielrechnung im Heise-Forum
System- und Diagnosetools
- siehe iX 04/11 S.148
- EtherApe - grafischer Netzwerkmonitor
- NDisc6-Sammlung
- ndisc6 - Neighbor Discovery Tool
- rdisc6 - Router Discovery Tool
- tcptraceroute6, traceroute6, rdnssd
- oping
- nc6 (netcat Klon)
- tcpdump (siehe auch [1])
tcpdump -i eth0 host 2a01:198:abcd:1234:95ee:6584:4a02:6842 and port 80 tcpdump -i eth0 ip6 host 2a01:198:abcd:1234:95ee:6584:4a02:6842 and port 80
Widgets
IPv6 unter Linux
Autoconfiguration unter Linux
Autoconfiguration (SLAAC) unter Linux ausschalten (z.B. wenn man statische Adressen vergeben will):
sysctl -w net.ipv6.conf.eth0.autoconf=0 sysctl -w net.ipv6.conf.default.autoconf=0
Oder Eintrag in /etc/sysctl.conf:
net.ipv6.conf.eth0.autoconf = 0
Hinweis: Obwohl Autoconfiguration mit der IPv6 Prefix nun ausgeschaltet ist, setzt der Rechner noch das Default Gateway auf den Router.
Das Setzen des Default Gateways deaktivieren:
net.ipv6.conf.eth0.accept_ra = 0 net.ipv6.conf.default.accept_ra = 0
Hinweis: Dabei werden aber auch Router Advertisements deaktiviert, z.B. auf eth0.
Siehe auch
Autoconfiguration bei Containern im System
Falls IPv6 Forwarding eingeschaltet ist, muss "accept_ra" auf 2 gesetzt werden.
net.ipv6.conf.eno1.accept_ra = 2
Siehe:
- ip-sysctl.txt
- https://forums.gentoo.org/viewtopic-p-8696235.html?sid=e0ec9c07c00ca9f2dbaacbcf4af4a80c
- https://yinqingwang.wordpress.com/tag/accept_ra/
Privacy Extensions
Weblinks
- Heise bzw. c't 22/10 S.169
- IPv6 Tipps unter Linux
- IPv6 Auto-Configuration
- Linux IPv6
Bedingungen
- Autoconfiguration muss aktiviert sein (autoconf=1), zu prüfen mittels
sysctl net.ipv6.conf.default.autoconf sysctl net.ipv6.conf.eth0.autoconf
bzw. für alle Interfaces mittels
sysctl -A | grep autoconf
Konfiguration
Um die Privacy Extensions zu aktivieren, muss man bestimmte Kernel-Parameter setzen, was auch im laufenden Betrieb funktioniert, jedoch bootfest gemacht werden sollte.
Folgende Einstellungen sind in /etc/sysctl.conf zu machen, wobei die Lifetimes der Adressen den Wünschen entsprechend angepasst werden können:
net.ipv6.conf.all.use_tempaddr = 2 net.ipv6.conf.all.temp_valid_lft = 604800 net.ipv6.conf.all.temp_prefered_lft = 86400 net.ipv6.conf.default.use_tempaddr = 2 net.ipv6.conf.default.temp_valid_lft = 604800 net.ipv6.conf.default.temp_prefered_lft = 86400 net.ipv6.conf.eth0.use_tempaddr = 2 net.ipv6.conf.eth0.temp_valid_lft = 604800 net.ipv6.conf.eth0.temp_prefered_lft = 86400 net.ipv6.conf.wlan0.use_tempaddr = 2 net.ipv6.conf.wlan0.temp_valid_lft = 604800 net.ipv6.conf.wlan0.temp_prefered_lft = 86400
Die tatsächlich vorhandenen Interfaces (eth0, wlan0, etc.) müssen angegeben werden. Eigentlich sollte es sogar reichen, nur die default Parameter zu setzen, wenn nämlich die Netzwerkschnittstellen erst nach dem Setzen der Kernel-Parameter eingerichtet werden.
Manuelles Aktivieren dieser Parameter im laufenden System:
sysctl -e -q -p /etc/sysctl.conf
Alternativ kann man auch die o.g. Parameter im /proc Filesystem setzen, z.B. mittels
echo 2 > /proc/sys/net/ipv6/conf/default/use_tempaddr echo 2 > /proc/sys/net/ipv6/conf/eth0/use_tempaddr
Als weitere Alternative funktioniert auch sysctl einzeln aufzurufen, z.B.
sysctl -w net.ipv6.conf.eth0.use_tempaddr=2 sysctl -w net.ipv6.conf.eth0.use_tempaddr=2
Bedeutung der Parameter:
- use_tempaddr = 2 aktiviert die Privacy Extensions für eingehende und ausgehende Verbindungen. Mit "1" würden ausgehende Verbindungen die auf der MAC basierende IP Adresse verwenden, die "Privacy"-Adresse gilt dann nur für eingehende Verbindungen.
- temp_prefered_lft [sec]: nach dieser Zeit wird eine neue IPv6-Adresse erzeugt und zugewiesen und für neue ausgehende Verbindungen genutzt.
- temp_valid_lft [sec]: die IPv6-Adresse bleibt so lange gültig (wichtig für bestehende Verbindungen und eingehende Verbindungen auf die alte Adresse)
- Die Einträge oben bedeuten also: Alle 24h (86400 sec) wird eine neue IPv6 Adresse zugewiesen, die dann 7 Tage (604800 sec) gültig ist. Das Interface hat also nach 7 Tagen mindestens 7 IPv6-Adressen, wobei immer die zuletzt erzeugte und alle 24h wechselnde Adresse für ausgehende Verbindungen genutzt wird.
Weitere Hinweise:
- Die "default" Parameter sollten auf jeden Fall gesetzt werden, da diese angewandt werden, wenn ein Interface neu initialisiert wird (z.B. mittels "rcnetwork restart") bzw. dynamisch neue Interfaces erzeugt werden.
- "use_tempaddr = 1" bewirkt zwar auch das Erzeugen einer temporären IPv6-Adresse, als Source-IP wird aber dann die EUI-64-basierte Adresse verwendet. Nur bei "use_tempaddr = 2" wird die temporäre Adresse auch in ausgehenden Paketen genutzt.
- Die aktuellen Lifetime der IPv6-Adressen kann mittels "ip -6 addr" angesehen werden.
Anscheinend gibt es einen Bug beim Erzeugen einer neuen temporären IPv6-Adresse, wenn die Lifetime abgelaufen ist und der vorgegebene Wert geringer als das Router Advertisement Retransmission Interval ist, siehe Google Group. Es wird nach Ablauf der Lifetime keine neue temporäre Adresse mehr erzeugt. Nach Tests habe ich herausgefunden, dass selbst mit Lifetime=900 keine neue temporäre Adresse erzeugt wird. Bug? Ggf. ist das aber auch so "per Design", da eine temporäre Adresse nur erzeugt wird, wenn die die "Hauptadresse" erzeugt wird. Also müsste man immer das Interface neu starten, um eine neue temporäre Adresse zu bekommen. Nachtrag: Man sollte beachten, dass auch temp_prefered_lft entsprechend zu setzen ist. Das hatte ich bei meinen Tests nicht gemacht.
Unter openSUSE
Die IPv6 Privacy Extensions lassen sich unter openSUSE bis Version 11.4 zentral in /etc/sysconfig/sysctl aktivieren:
IPV6_PRIVACY=yes
Hinweise:
- Die eigentliche Konfiguration der Kernel-Parameter wird beim Booten in /etc/init.d/boot.ipconfig vorgenommen.
- Bis openSUSE 11.3 wird dort jedoch nur der "all" Parameter gesetzt mit use_tempaddr=1.
echo -n "Enabling IPv6 privacy" echo "1" > /proc/sys/net/ipv6/conf/all/use_tempaddr
Das ist schlecht, man muss also die dedizierten Parameter in /etc/sysctl.conf setzen.
- In openSUSE 11.4 ist es besser gelöst und sollte auch ohne Einträge in /etc/sysconfig/sysctl funktionieren. Wenn IPV6_PRIVACY=yes definiert ist, wird /proc/sys/net/ipv6/conf/default/use_tempaddr auf 2 gesetzt:
[ $IPV6_PRIVACY = yes ] && IPV6_PRIVACY=2 ... echo "$IPV6_PRIVACY" > /proc/sys/net/ipv6/conf/default/use_tempaddr
Damit sollten dann alle im Bootprozess oder im laufenden System neu generierten Netzwerkschnittstellen erfolgreich konfiguriert werden.
Unter openSUSE 12.1 sind Privacy Extensions per default eingeschaltet. Anpassungen sind - wie oben beschrieben - nur über sysctl-Kernelparameter möglich, da die Datei /etc/sysconfig/sysctl nicht mehr existiert.
Unter Android
Siehe Android.
DNS bei IPv6
Unter Linux kann es vorkommen, dass es Probleme mit dem DNS-Resolver bei aktiviertem oder auch deaktiviertem IPv6 gibt. Diese Probleme betreffen das Auflösen von Namen in IPv4-Adressen, wenn man ein IPv4-Netz betreibt. Es kommt dann zu Verzögerungen bei der Namensauflösung (am besten zu sehen im Browser), da standardmäßig A und AAAA Records parallel abgefragt werden. Viele DNS-Server vertragen das wohl nicht und es kommt zu mehreren 5-Sekunden-Timeouts. Um das zu verhindern, kann man auf neueren Linux-Systemen (z.B. ab openSUSE 11.2) den folgenden Parameter in /etc/resolv.conf setzen:
options single-request
Mehr Infos zu DNS-Problemen:
Siehe auch:
- IPv6 DNS Setup Information Hinweis: Reverse-Zone ist ip6.arpa, nicht mehr ip6.int.
- How do I setup a reverse DNS? (sixxs.net)
DNS-Abfragen
Normales Lookup:
nslookup -type=AAAA sixxs.net dig sixxs.net AAAA dig a sixxs.net dig aaaa sixxs.net
Reverse Lookup:
nslookup 2001:960:800::2 dig -x 2001:960:800::2
DynDNS
Anbieter für IPv6 DynDNS:
- https://dynv6.com (inkl. Hook für tunnelbroker.net)
- http://freedns.afraid.org
Wichtige Befehle und Syntax
ip -6 addr show netstat -A inet6 -a ss -ap ping6 -I eth0 <IP-Adresse> ping6 -c 5 -I eth0 ff02::1 ("Broadcast" Ping bei IPv6 auf Multicast) route -A inet6 ip -6 route
Hinweis: netstat zeigt nicht die komplette IPv6-Adresse an, daher ss verwenden.
IPv6 Dienste finden
lsof -i6 | grep "LISTEN" lsof -i6 -n -P | grep "LISTEN" lsof -i6 | grep "UDP \*" netstat -6at | grep "LISTEN"
Neighbors finden
ping6 -c4 -I eth0 ff02::1 ip -6 neigh show
IP Adresse löschen
ip -6 addr del 2001:8dc8:86a9::1/64 dev eth0
IPv6 in Linux deaktivieren
Drei Möglichkeiten:
a) Eintrag in /etc/sysctl.conf
net.ipv6.conf.all.disable_ipv6 = 1
b) Proc Dateisystem
echo 1 >/proc/sys/net/ipv6/conf/all/disable_ipv6
c) Kernel-Parameter beim Booten setzen (grub)
ipv6.disable=1
Siehe [2].
URL Syntax
IPv6-Adressen in URLs müssen in eckige Klammern [] gesetzt werden:
http://[2a01:1234:5678:2:585c:6552:1e40:ab1f]/path/to/page/ http://[2a01:1234:5678:2:585c:6552:1e40:ab1f]:8000/path/to/page/
Weblinks
- Linux IPv6 HOWTO (en)
- IPv6 with Debian
- Linux IPv6
- IPv6 Tipps unter Linux
- Linux IPv6
- IPv6 Support bei openSUSE
- IPv6-basiertes Heim-Netzwerk DNS, DHCPv6 (pro-linux.de)
Tunnel-Provider
SixXS
SixXS stellt im Juni 2017 seinen Dienst ein.
Siehe Beispiel mit SixXS unten.
Konfiguration
- IPv6 Heimnetzwerk
- Heise-Artikel
- siehe LU 02/10 S.80
- openSUSE 11.1 Anleitung
ULA
Hurricane Electric
- 6to4
- Hurricane Electric
- https://www.techgrube.de/tutorials/tunnelbroker-net-tunnel-in-der-fritzbox-einrichten
- https://schhsc.de/hurricane-electric-ipv6-tunnelbroker-und-dynamische-ips/
- Praxis-Beispiel siehe c't 20/22 S.172 (Raspi, radvd)
Andere
- http://gogonet.gogo6.com
- Miredo: getipv6.info, remlab.net
- Teredo
- siehe auch LM 11/09 S.75
- https://de.wikipedia.org/wiki/Liste_von_IPv6-Tunnelbrokern
IPv6 Heimnetzwerk
Im folgenden wird das Einrichten eines öffentlich zugänglichen IPv6-Heimnetzwerks über einen SixXS-Tunnel beschrieben. Als IPv6-Router dient ein Linux-PC, auf dem der IPv6-Tunnel endet. Dieser IPv6-Router steht seinerseits hinter einem IPv4-Router, der per NAT die Internet-Verbindung für die PCs zum IPv4-ISP herstellt. Am LAN-Port (eth1) des IPv6-Routers hängen weitere PCs und Geräte, die mittels eines zusätzlichen IPv6-Subnetzes, dass von SixXS zum Tunnel-Endpunkt geroutet wird, ans IPv6-Netz angeschlossen werden sollen. Als Linux-Distribution wird in diesem Beispiel openSUSE verwendet. Weitere Infos zu Einrichtung siehe SixXS.
Hinweis: Die IPv6-Adressen in den Beispielen sind abgeändert und daher fiktiv. ToDo: Für Dokuzwecke reservierte IP-Adressen verwenden.
Die gleiche Funktionalität mit AICUU und RADVD kann auch mittels eines Routers wie dem Draytek Vigor2130 oder einer FRITZ!Box abgebildet werden.
SixXS Account und IPv6-Tunnel
- SixXS Account beantragen vom Typ Dynamic (ayiya)
- SixXS Tunnel auf dem IPv6-Router (Linux-PC) einrichten mittels AICUU. Dazu das aiccu Paket installieren und bootfest machen:
zypper in aiccu insserv aiccu
- Die Datei /etc/aiccu.conf sieht dann wie folgt aus:
username MYUSERNAME password MYPASSWORD protocol tic server tic.sixxs.net ipv6_interface sixxs tunnel_id MYTUNNELID verbose true daemonize true automatic true requiretls false behindnat true
- Das Bootscript von aiccu bedarf eines Fixes in der start Sektion:
start) echo -n "Starting aiccu " startproc /usr/sbin/aiccu start /etc/aiccu.conf
- aiccu starten
/etc/init.d/aiccu start
- Die Interfaces und das Routing sehen dann z.B. wie folgt aus:
ifconfig eth1:
eth1 Link encap:Ethernet HWaddr 00:01:80:5F:66:E5 inet addr:192.168.1.3 Bcast:192.168.1.255 Mask:255.255.255.0 inet6 addr: fe80::201:80ff:fe5f:2222/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:9875101 errors:0 dropped:0 overruns:0 frame:0 TX packets:5990546 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:4222558594 (4026.9 Mb) TX bytes:1830703552 (1745.8 Mb) Interrupt:21 Base address:0x8000
ifconfig sixxs:
sixxs Link encap:UNSPEC HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00 inet6 addr: 2a01:789:123:5d4::2/64 Scope:Global inet6 addr: fe80::89:123:5d4:2/64 Scope:Link UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1280 Metric:1 RX packets:7721 errors:0 dropped:0 overruns:0 frame:0 TX packets:7794 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:500 RX bytes:1722303 (1.6 Mb) TX bytes:905774 (884.5 Kb)
ip -6 route:
::/96 via :: dev sit0 metric 256 mtu 1480 advmss 1420 hoplimit 0 2a01:789:123:5d4::/64 dev sixxs proto kernel metric 256 mtu 1280 advmss 1220 hoplimit 0 fe80::/64 dev sixxs proto kernel metric 256 mtu 1280 advmss 1220 hoplimit 0 fe80::/64 dev eth1 proto kernel metric 256 mtu 1500 advmss 1440 hoplimit 0 fe80::/64 dev eth0 proto kernel metric 256 mtu 1500 advmss 1440 hoplimit 0 default via 2a01:789:123:5d4::1 dev sixxs metric 1024 mtu 1280 advmss 1220 hoplimit 0
- IPv6 Verbindung vom IPv6-Router testen mittels
ping6 ipv6.google.com
oder im Browser
http://ipv6.google.com http://ipv6.whatismyv6.com
- Damit ist der IPv6-Tunnel fertig. Der Router kann als Tunnel-Endpunkt mit dem öffentlichen IPv6-Netz kommunizieren und auch von außerhalb erreicht werden.
Firewall
- Firewall-Einstellungen für VPNs mit IPV6: siehe c't 18/18 S.160, http://ct.de/y38h
Auf dem IPv6-Router sollte eine Firewall laufen, da nun alle offenen Ports transparent im IPv6-Netz "zu sehen" sind. Denn der NAT-IPv4-Router ist aus der IPv6-Kommunikation komplett herausgenommen.
Unter openSUSE bietet SuSEfirewall2 IPv6-Unterstützung. Alle IPv4-Regeln werden dabei auch für IPv6 eingerichtet. Einige Default-Einstellungen in /etc/sysconfig/SuSEfirewall2:
# Leave empty to automatically detect whether your kernel supports stateful matching. FW_IPv6="" # Defaults to "yes" if not set # FW_IPv6_REJECT_OUTGOING=""
IPv6-Subnet
Nach einer Woche Laufzeit des SixXS Tunnels kann man ein /48-Subnet bei SixXS bestellen, welches dann zum Tunnel-Endpunkt (also zum Linux-PC als IPv6-Router) geroutet wird. Alternativ kann man auch das /64-Subnet "Routed /64 Subnet" verwenden, das seit neustem jedem Tunnel zugewiesen und auch geroutet wird.
Die Schritte mit dem /48-Subnet sind:
- SixXS Subnet beantragen
- IPv6-Forwarding auf dem IPv6-Router einrichten manuell mittels
echo "1" > /proc/sys/net/ipv6/conf/all/forwarding
bzw. bootfest mittels Eintrag in /etc/sysconfig/sysctl
IPV6_FORWARD="yes"
bzw. bootfest als Eintrag in /etc/sysctl.conf (in openSUSE 12.1 gibt es /etc/sysconfig/sysctl nicht mehr):
net.ipv6.conf.all.forwarding = 1
Prüfen kann man das Ergebnis mittels
sysctl -a|grep "v6.*\.forw"
- Für das LAN verwenden wir nur ein /64-Subnetz aus dem zugeteilten /48-Subnet. Insgesamt könnten so 65535 Subnetze gebildet werde. Dem IPv6-Router muss nun eine Adresse fest zu gewiesen werden, in unserem Beispiel die 2a01:123:456::1/64. Das geht am besten mittels yast2. Dort einfach eine weitere Adresse dem LAN-Interface (eth1) zuteilen in den IPv4-Feldern:
IP Address: 2a01:123:456::1 Netmask: /64
oder als Eintrag in /etc/sysconfig/network/ifcfg-eth1:
IPADDR_0='2a01:123:456::1/64'
- Netzwerk neu starten (falls manuelle Konfiguration ohne yast2):
rcnetwork restart
- RADVD (Router ADVertisement Daemon) auf dem IPv6-Router installieren, damit sich Clients im LAN automatisch konfigurieren können. Mindestens Version 1.5 sollte verwendet werden wegen eines Bugs in 1.3 hinsichtlich Interface-Handling. Siehe auch HOWTO und sixxs.net.
zypper in radvd insserv radvd
- RADVD konfigurieren in /etc/radvd.conf:
interface eth1 { AdvSendAdvert on; MinRtrAdvInterval 10; MaxRtrAdvInterval 30; AdvDefaultPreference medium; AdvHomeAgentFlag off; prefix 2a01:123:456::/64 { AdvOnLink on; AdvAutonomous on; AdvRouterAddr off; }; };
- RADVD starten
/etc/init.d/radvd start
- Die Interfaces und das Routing auf dem IPv6-Router sehen dann wie folgt aus:
ifconfig eth1:
eth1 Link encap:Ethernet HWaddr 00:01:80:5F:66:E5 inet addr:192.168.1.3 Bcast:192.168.1.255 Mask:255.255.255.0 inet6 addr: 2a01:123:456::1/64 Scope:Global inet6 addr: fe80::201:80ff:fe5f:2222/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:9888395 errors:0 dropped:0 overruns:0 frame:0 TX packets:6003962 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:4224522107 (4028.8 Mb) TX bytes:1838849772 (1753.6 Mb) Interrupt:21 Base address:0x8000
ip -6 route:
::/96 via :: dev sit0 metric 256 mtu 1480 advmss 1420 hoplimit 0 2a01:789:123:5d4::/64 dev sixxs proto kernel metric 256 mtu 1280 advmss 1220 hoplimit 0 2a01:123:456::/64 dev eth1 proto kernel metric 256 mtu 1500 advmss 1440 hoplimit 0 fe80::/64 dev sixxs proto kernel metric 256 mtu 1280 advmss 1220 hoplimit 0 fe80::/64 dev eth1 proto kernel metric 256 mtu 1500 advmss 1440 hoplimit 0 fe80::/64 dev eth0 proto kernel metric 256 mtu 1500 advmss 1440 hoplimit 0 default via 2a01:789:123:5d4::1 dev sixxs metric 1024 mtu 1280 advmss 1220 hoplimit 0
Firewall und Routing auf dem IPv6-Router für das Subnetz
Damit die Firewall auf dem IPv6-Router die IPv6-Pakete von den LAN-Clients ins Internet weiterleitet, muss der folgende Eintrag auf dem IPv6-Router in /etc/sysconfig/SuSEfirewall2 gemacht werden:
# - "fd76:9dbb:91a3:1::/64,fd76:9dbb:91a3:4::/64,tcp,ssh" # allow ssh from one IPv6 network to another FW_FORWARD="2a01:123:456::/64,0/0"
Damit werden alle IPv6-Pakete vom IPv6-Subnetz zu allen Destinations und Ports weitergeleitet. Eingehende Pakete für neue Verbindungen zum IPv6-Subnetz werden jedoch verworfen, so dass erst mal keine eingehenden Verbindungen durch den Tunnel nach 2a01:123:456::/64 möglich sind. Diese ermöglicht man durch einen Zusatz für die andere Richtung:
FW_FORWARD="2a01:123:456::/64,0/0 0/0,2a01:123:456::/64"
Danach die Firewall neu starten:
rcSuSEfirewall2 restart
ACHTUNG - NEU in openSUSE 11.4:
Die o.g. Forward-Regel FW_FORWARD="2a01:123:456::/64,0/0" reicht leider nicht mehr für ausgehende Verbindungen aus. Eingehende Pakete auf SYN-Requests werden nun geblockt. Daher müssen nun auch die eingehenden Verbindungen erlaubt werden. Mir ist unklar, ob dieses Verhalten ein Bug in der openSUSE Firewall ist oder einer Änderung im Kernel oder in iptables geschuldet ist. Denn es sollte doch hoffentlich weiterhin möglich sein, das Forwarding für eingehende Pakete als Antwort zu Verbindungsaufbauten (SYN,ACK) und bereits bestehende Verbindungen zu erlauben, ohne das ganze Netz für eingehende Verbindungen zu öffnen. Aber wie?
Update zu openSUSE 11.4: Das o.g. Verhalten war ein Bug in der openSUSE Firewall. Ein Update auf SuSEfirewall2-3.6.261-3.4.1 aus dem Update-Repository behebt das Problem. Es ist also nicht mehr nötig, auch eingehende Verbindungen zu erlauben. Vielen Dank an Thomas Schulte für diesen Hinweis.
Hinweise zu openSUSE 12.1:
- Die SuSEfirewall2 loggt ein "SFW2-FWD-ILL-ROUTING" für eingehende Pakete bei ausgehenden Verbindungen über den IPv6-Router. Ein Neustart der FW bringt Abhilfe.
- Insgesamt scheint das IPv6-Handling in openSUSE noch ein wenig buggy. Manchmal hilft noch nicht einmal ein Neustart der FW für korrektes IPv6 Forwarding. Auch ohne aktivierte FW geht Forwarding dann nicht mehr.
- IPv6 muss nun manuell konfiguriert werden (keine System-Variablen mehr), z.B. für das Forwarding.
IPv6 auf den LAN-Clients
Nach Starten des RADVD sollten nun alle IPv6-fähigen Clients im LAN eine IPv6-Adressen aus dem Subnetz 2a01:123:456::/64 automatisch konfiguriert haben. Dabei wird i.d.R. die MAC-Adresse verwendet, um die IPv6-Adresse zu vervollständigen. Auch eine Default Route sollte eingerichtet worden sein.
Die Interfaces und das Routing auf dem IPv6-Client-PC sehen dann wie folgt aus:
ifconfig eth0:
eth0 Link encap:Ethernet HWaddr 00:26:18:83:0A:DF inet addr:192.168.1.2 Bcast:192.168.1.255 Mask:255.255.255.0 inet6 addr: 2a01:123:456:0:226:18ff:fe83:adf/64 Scope:Global inet6 addr: fe80::226:18ff:fe83:adf/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:25705 errors:0 dropped:0 overruns:0 frame:0 TX packets:27673 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:10179904 (9.7 Mb) TX bytes:4060206 (3.8 Mb) Interrupt:26 Base address:0x6000
ip -6 route:
2a01:123:456::/64 dev eth0 proto kernel metric 256 expires 86382sec mtu 1500 advmss 1440 hoplimit 4294967295 fe80::/64 dev eth0 proto kernel metric 256 mtu 1500 advmss 1440 hoplimit 4294967295 default via fe80::201:80ff:fe5f:2222 dev eth0 proto kernel metric 1024 expires 85sec mtu 1500 advmss 1440 hoplimit 64
Die zugewiesene Default Route entspricht der Link Local Adresse des IPv6-Router als Source Adresse der Router Advertisements, siehe IPv6 Router Advertisement Problem Statement,ICMPv6.
Die IPv6 Verbindung vom IPv6-LAN-Client kann getestet werden mittels
ping6 ipv6.google.com
oder im Browser
http://ipv6.whatismyv6.com
Firewall für die IPv6-Clients im LAN
Alle Geräte im IPv6-Subnetz sind nun auch aus dem IPv6-Netz weltweit erreichbar, wenn das IP-Forwarding für eingehenden Verkehr in der Firewall eingerichtet wurde. Dann sollte unbedingt eine Firewall für die IPv6-Clients eingerichtet werden. Entweder geschieht das zentral auf dem IPv6-Router oder auf jedem Client selbst. Da mein Client ebenfalls ein Linux-PC ist, bietet sich die lokale SuSEfirewall2-Firewall auf dem Client an. Diese muss so eingerichtet werden, dass nur Ports geöffnet werden, die im IPv6 erreichbar sein sollen, ggf. unter Angabe von Source und Destination IP-Adressen.
Per nmap kann man offene Ports im IPv6 Netz erkunden:
nmap -6 -PN 2a01:123:456:0:226:18ff:fe83:adf
Ein zweites Subnetz aufmachen
Aus dem zugeteilten /48-Subnetz kann man 65535 /64-Subnetze (64-48=16, 2 hoch 16 = 65535) ableiten mit jeweils 18446744073709551616 (1.845e19 bzw. ca. 18 Trillionen) Hosts (2 hoch 64). Siehe CIDR6.
Bisher haben wir nur ein /64-Subnetz (2a01:123:456::/64) erstellt. Wenn der IPv6-Router ein zweites (ggf. virtuelles) Ethernet-Interface hat, kann man ein zweites /64-Subnetz 2a01:123:456:1::/64 aufmachen.
Erweiterung des RADVD (/etc/radvd.conf) für eth0:
interface eth1 { AdvSendAdvert on; MinRtrAdvInterval 10; MaxRtrAdvInterval 30; AdvDefaultPreference medium; AdvHomeAgentFlag off; prefix 2a01:123:456::/64 { AdvOnLink on; AdvAutonomous on; AdvRouterAddr off; }; }; interface eth0 { AdvSendAdvert on; MinRtrAdvInterval 10; MaxRtrAdvInterval 30; AdvDefaultPreference medium; AdvHomeAgentFlag off; prefix 2a01:123:456:1::/64 { AdvOnLink on; AdvAutonomous on; AdvRouterAddr off; }; };
Erweiterung der Firewall (/etc/sysconfig/SuSEfirewall2), siehe auch Hinweis zu Firewall-Update in openSUSE 11.4 oben:
# Nur ausgehende Verbindungen vom gesamten /48-Subnetz erlauben FW_FORWARD="2a01:123:456::/48,0/0" # auch eingehende Verbindungen aus dem Inet zum /48-Subnetz erlauben: #FW_FORWARD="2a01:123:456::/48,0/0 0/0,2a01:123:456::/48" # auch eingehende Verbindungen aus dem Inet nur zum ersten /64-Subnetz erlauben: #FW_FORWARD="2a01:123:456::/48,0/0 0/0,2a01:123:456::/64" # auch eingehende Verbindungen aus dem Inet nur zum zweiten /64-Subnetz erlauben: #FW_FORWARD="2a01:123:456::/48,0/0 0/0,2a01:123:456:1::/64"
Damit haben wir ausgehende Verbindungen für das gesamte /48-Subnetz erlaubt. Eingehende Verbindungen kann man nun nach Subnetzen trennen.
Ausgabe der Interfaces und Routen:
ifconfig eth0:
eth0 Link encap:Ethernet HWaddr 00:11:95:D9:E6:B4 inet addr:10.1.1.3 Bcast:10.1.1.255 Mask:255.255.255.0 inet6 addr: 2a01:123:456:1::1/64 Scope:Global inet6 addr: fe80::211:95ff:fed9:1111/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:784 errors:0 dropped:0 overruns:0 frame:0 TX packets:765 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:92036 (89.8 Kb) TX bytes:92262 (90.0 Kb) Interrupt:18
ip -6 route
::/96 via :: dev sit0 metric 256 mtu 1480 advmss 1420 hoplimit 0 2a01:789:123:5d4::/64 dev sixxs proto kernel metric 256 mtu 1280 advmss 1220 hoplimit 0 2a01:123:456::/64 dev eth1 proto kernel metric 256 mtu 1500 advmss 1440 hoplimit 0 2a01:123:456:1::/64 dev eth0 proto kernel metric 256 mtu 1500 advmss 1440 hoplimit 0 fe80::/64 dev sixxs proto kernel metric 256 mtu 1280 advmss 1220 hoplimit 0 fe80::/64 dev eth0 proto kernel metric 256 mtu 1500 advmss 1440 hoplimit 0 fe80::/64 dev eth1 proto kernel metric 256 mtu 1500 advmss 1440 hoplimit 0 default via 2a01:789:123:5d4::1 dev sixxs metric 1024 mtu 1280 advmss 1220 hoplimit 0
Server-Dienste
- siehe auch LM 08/11 S.30 (Server fit für IPv6 machen)
- Sicherer IPv6-Webserver unter Linux: siehe c't 16/11 S.160
- Web- und Email-Server mit IPv6: siehe iX 07/11 S.48 und S.52
- Dovecot, Postfix, SpamAssassin und fetchmail per IPv6 anbinden (am Beispiel Mac OS X): siehe c't 26/11 S.180
- Serverbetrieb mit dynamischen IPv6-Adressen: siehe c't 19/18 S.156, http://ct.de/y4mx
Apache Webserver auf dem IPv6-Router
SixXS vergibt für die IPv6-Adresse des Tunnel-Endpunkts einen DNS-Namen, den man auf für einen lokalen Webserver verwenden kann. Die Apache-Konfiguration sieht dann z.B. so aus:
# IPv6 SixXS, myname.dus-01.de.sixxs.net has AAAA address 2a01:789:123:5d4::2
<VirtualHost *:80>
ServerName myname.dus-01.de.sixxs.net
ServerAdmin webmaster@example.com
DocumentRoot /srv/www/htdocs
ErrorLog /var/log/apache2/error_log
CustomLog /var/log/apache2/access_log combined
HostnameLookups Off
UseCanonicalName Off
ServerSignature On
Redirect /index.html http://myname.dus-01.de.sixxs.net/wiki/
</VirtualHost>
SSH Server
Für IPv6 muss der Daemon wie folgt konfiguriert werden (was dem Default entspricht):
AddressFamily any
Nur IPv4:
AddressFamily inet
Nur IPv6:
AddressFamily inet6
Postfix
Allgemeine Hinweise zu Postfix und IPv6 siehe Postfix IPv6 Support.
Beispiel Konfiguration main.cf:
# inet_interfaces = 192.168.10.1 127.0.0.1 ::1 2a01:123:456::1 inet_interfaces = all mynetworks = 192.168.1.0/24, 127.0.0.0/8, [::1]/128, [fe80::]/10, [2a01:123:456::]/64, [2a01:123:456:1::]/64
Hinweis: Falls das IPv6-Interface beim Starten von Postfix noch nicht konfiguriert ist, startet Postfix nicht. Daher ist inet_interfaces = all eine gute Wahl.
Tipps und Tricks
- TCP-Verbindungen zu IPv4 zwingen: TCP-Verbindungen zu bestimmten Ports über IPv6 werden mit dem folgenden beispielhaften ip6tables-Kommando zurückgesetzt. Der Client wird dann i.d.R. eine IPv4-Verbindung aufbauen.
ip6tables -A INPUT -j REJECT -p tcp -dport 80 --reject-with tcp-reset
- IPv6-Tunnel einrichten: siehe c't 15/20 S.176
ip tunnel ...
Weitere Weblinks
- IPv6.com, IPv6 - The History and Timeline
- Understanding IP Addressing (ripe.net)
- IPv6 Address Allocation and Assignment Policy (ripe.net)
- IPv6 Adressen in Europa
- IPv6 Überblick
- getipv6.info - ARIN IPv6 Wiki, Educating Yourself about IPv6
- IPv6 bei Cisco
- IPv6-Rat verabschiedet "Nationalen Aktionsplan" für Web-Zugang
- ipv6actnow.org: IPv6 Howto - Richtlinien vom RIPE NCC
- Hurricane Electric Free IPv6 Certification
- RFCs
- RFC 3513 - Internet Protocol Version 6 (IPv6) Addressing Architecture
- RFC 3531 - A Flexible Method for Managing the Assignment of Bits of an IPv6 Address Block
- RFC 3769 - Requirements for IPv6 Prefix Delegation
- RFC 3177 - Address Delegation Recommendations
- IPv6 Rapid Deployment in IPv4 Infrastructures" (6RD) (Heise), http://tools.ietf.org/html/rfc5569
- IPv6 Forum (ipv6-forum.com)
- unitymediaforum.de
- DOCSIS 3.0 Requirements for IPv6 support
- Der Deutsche IPv6 Rat (ipv6council.de)
- IPv6-Kongress, Heise
Tunnel-Mechanismen
- Teredo, Miredo Linux Tool, getipv6.info, siehe auch LM 11/09 S.75
Unique Local Adressen ("private Adressen" bei IPv6)
NAT
IPv6-enabled Sites: