IPv6

aus www.kruedewagen.de, Homepage von Ralf und Judith Krüdewagen (Kruedewagen)
Zur Navigation springen Zur Suche springen

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 (was derzeit noch die Regel ist), so bietet sich eine "sanfte" Migration per "IPv6 durch IPv4"-Tunnel an. Ein solcher IPv6-Tunnel-Provider ist z.B. SixXS, für den exemplarisch das Setup vorgestellt wird. 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
    • siehe c't 3/07, S.180
    • siehe c't 14/09 S.118
    • siehe iX 07/11 S.44 ff
    • siehe iX 09/15 S.100 (RFCs)
  • IPv6 im Heimnetz, siehe c't 12/07 S.134
  • kleine IPv6 FAQ: siehe c't 25/10 S.182
  • 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

Literatur

Neighbor Discovery und Autoconfiguration

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

Programmieren mit IPv6

  • IPv6-Sockets: siehe c't 19/10 S.160
  • siehe LM 08/11 S.42

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

Routing

Tools

  • 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
  • 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
  • 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 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

Privacy Extensions

Weblinks

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:

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:

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.

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

Tunnel-Provider

SixXS

SixXS stellt im Juni 2017 seinen Dienst ein.

Siehe Beispiel mit SixXS unten.

Konfiguration

ULA

Hurricane Electric

Andere

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

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

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

Weitere Weblinks


Tunnel-Mechanismen

Unique Local Adressen ("private Adressen" bei IPv6)

NAT

IPv6-enabled Sites:

Siehe auch