IPv6

aus PUG, der Penguin User Group
Wechseln zu: Navigation, Suche

IPv6

Voraussetzung für den IPv6 Betrieb unter Linux ist zunächst ein IPv6 fähiger Kernel. Bei den meisten Distributionen ist so ein Kernel standardmäßig vorhanden. Die Option

CONFIG_IPV6=m

muss in der .config gesetzt sein. Ein

modprobe ipv6

sollte nun alle Interfaces IPv6 fähig machen.

Probelauf

Für einen ersten Test ist keine weitere Konfiguration notwendig. Ein ifconfig sollte dann in etwa folgendes zeigen:

eth0     Protokoll:Ethernet  Hardware Adresse 00:11:22:33:44:55
         inet Adresse:192.168.0.2  Bcast:192.168.0.15  Maske:255.255.255.240
         inet6 Adresse: fe80::222:33ff:fe:4455/64 Gültigkeitsbereich:Verbindung
         UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
         RX packets:127268571 errors:0 dropped:0 overruns:0 frame:0
         TX packets:103505784 errors:0 dropped:0 overruns:0 carrier:0
         Kollisionen:0 Sendewarteschlangenlänge:1000
         RX bytes:145419939482 (135.4 GiB)  TX bytes:76265616204 (71.0 GiB)
         Basisadresse:0xbf00 Speicher:fd8e0000-fd900000

Mit ping6 -I eth0 fe80::222:33ff:fe:4455 kann man sehen, dass IPv6 lokal funktioniert. Auf einem zweiten PC sollte das Interface ähnlich aussehen, mit ping6 -I eth0 <inet6 Addresse> sollte man auch den zweiten PC erreichen können. <inet6 Addresse> ist hier die unter inet6 angegebene Adresse des zweiten PCs.

Das lokale IPv6 Netz

Jetzt erhalten beide PCs eine sog. Site Local Address, das ist das Gegenstück zu einer IPv4 RFC-1918 Adresse, das Netz wird im Internet also nicht geroutet. Auf den beiden PCs wird das nun wie folgt konfiguriert:

ip -6 addr add fec0::1/64 dev eth0
ip -6 addr add fec0::2/64 dev eth0

Das kann man sich auch besser merken als z.B. fe80::222:33ff:fe:4455. Diesmal geht ping6 auch ohne Angabe des Interfaces.

Site local Adressen sollten jedoch für den produktiven Einsatz nicht mehr verwendet werden, nach RFC 3879 sollten diese Adressen für Neuinstallationen nicht mehr verwendet werden. Diese RFC ist allerdings nicht ganz unumstritten, so ist zumindest vorgesehen, dass alte Installation erst migriert werden sollen, wenn "es eine bessere Lösung" gibt.

Services

Man wird jetzt auch schon einige Services finden:

# lsof -i -P -n|grep IPv6
ntpd       3238      ntp   17u  IPv6   5706       UDP *:123
httpd     19976     root    6u  IPv6 495513       TCP [fec0::1]:80 (LISTEN)
named     21071     bind   20u  IPv6 510211       UDP *:53
named     21071     bind   21u  IPv6 510212       TCP *:53 (LISTEN)
sshd      23940     root    3u  IPv6 458057       TCP *:22 (LISTEN)

Diese sollten bereits unter IPv6 erreichbar sein.

Nameserver

Ein ordentlich aufgebautes Netzwerk verfügt natürlich über einen Nameserver, der auch Reverse-DNS unterstützt. Das gilt auch für IPv6, daher vor der weiteren Konfiguration ein kleiner Ausflug zum Bind9.

Ein DNS-Eintrag für einen Host sieht so aus:

www IN AAAA fec0::1

Ein ping6 www.local (wenn der Eintrag in der Zone local steht) sollte danach ebenfalls erfolgreich sein. Reverse DNS ist da nicht so angenehm:

1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa. 3600 IN PTR www.local.

Ein dig -x fec0::1 sollte dann zu www.local führen. Der Zoneneintrag für Reverse DNS muss so aussehen:

zone "0.0.0.0.0.0.0.0.0.0.0.0.0.c.e.f.ip6.arpa" {
       type master;
       file "/etc/bind/db.fec0.ip6.arpa";
};

Eine einfache Regel hilft da sicherlich: Anzahl Hex-Ziffern in der Zonendeklaration + Anzahl Hex-Ziffern im Zoneneintrag muss 32 ergeben.

Provider

Bislang gibt es nur eine Handvoll Provider, die IPv6 können: In IPv6 Providerliste kann man auch sehen, wie die Verfügbarkeit von IPv6 ist. Das lässt auch Rückschlüsse darauf zu, wie gut ein Provider sein Netz im Griff hat.

radvd

Wer die IPv6 Adressen automatisch vergeben will, kann im einfachsten Fall RadVD verwenden. Für unser kleines Testnetz sieht die Configdatei /etc/radvd.conf dann so aus:

interface eth0
{
  AdvSendAdvert on;
  prefix fec0::/64
  {
      AdvOnLink on;
  };
};

Damit sollte jeder Teilnehmer in diesem Netzsegment dann automatisch eine IPv6 Adresse bekommen. Das ist eine sehr einfache Lösung, stateless kostet auch nicht viele Systemressourcen. Wer weitere Parameter, wie z.B. Nameserver übergeben will, muss DHCP verwenden, was dann auch Stateful ist.

RIPE IPv6 Adressen

RIPE Adressen können im (IPv6) Internet geroutet werden, das gilt natürlich auch für ARIN, AFRINIC etc., was aber für Europa weniger von Interesse ist. Die routing fähigen IPv6 Adressen sind aus dem Netz 2000::/3, ohne eine solche Adresse ist ein Zugang in der IPv6 Internet nicht möglich.

Konfiguration des Interfaces für Native IPv6

Wenn der Provider IPv6 am Interface bereitstellen kann, dann ist die Konfiguration so einfach, wie bei IPv4:

ip -6 addr add 2a01:7a0:1::16/126 dev eth0

Konfiguration des Interfaces für getunneltes IPv6

Die meisten Leute werden aber einen Tunnel benötigen. Wer SixXS verwendet, kann einfach das Tool Aiccu verwenden, ansonsten hier die manuelle Methode, wenn man z.B. verschiedene Hosts mit Tunneln miteinander "verdrahten" will:

ip tunnel add myip6 mode gre local 192.168.1.99 remote 172.16.23.99
ip link set myip6 up
ip link set myip6 mtu 1354
ip -6 addr add 2a01:7a0:1::16/126 dev myip6

Die MTU wird gesetzt, damit der Tunnel auch mit einem DSL Anschluss funktioniert.

Default Route

Bei der Default Route gibt es keine Besonderheiten:

ip -6 route add default via 2a01:7a0:1::15 mtu 1354

Die Angabe der MTU stellt sicher, dass auch korrekt fragmentiert/defragmentiert wird.

Test

Mit

ping6 -n www.sixxs.net

kann man sehen, dass alles funktioniert. Der Test für große Pakete sieht dann so aus:

ping6 -n -s 2000 -M want www.sixxs.net

Wenn das auch klappt, dann funktioniert auch die Fragmentierung/Defragmentierung. Das ist wichtig, weil es sonst sehr merkwürdige Effekte gibt, so wird dann z.B. Google angezeigt, ein Download mit FTP klappt jedoch nicht.

Firewall

Die IPv4 Firewallregeln sind unter IPv6 unwirksam. Aus diesem Grund müssen IPv6 Regeln definiert werden. Ein guter und sicherer Startpunkt sind die folgenden Regeln, die zweckmäßigerweise in der Datei /etc/iptables/active6 abgelegt werden:

# Generated by ip6tables-save v1.3.6 on Sun Aug 26 11:22:03 2007
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -s ::1/8 -j ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmpv6 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 32768:65534 -j ACCEPT
-A INPUT -j DROP
-A FORWARD -j DROP
COMMIT
# Completed on Sun Aug 26 11:22:03 2007

Aktiviert wird das mit ip6tables-restore < /etc/iptables/active6. Damit ist abgehender IPv6 Verkehr ohne Einschränkung möglich. ICMPv6 ist offen, damit ist sichergestellt, dass auch die Signalisierung zum Router funktioniert. Wer ICMPv6 einschränken will, kann sich die verfügbaren Optionen mit ip6tables -p ipv6-icmp -h anzeigen lassen.

Privacy

Damit Ihr nicht immer an Eurer Interface Adresse wiederzuerkennen seit, sollte in der /etc/sysctl.conf

net.ipv6.conf.all.use_tempaddr = 2

gesetzt werden.

ToDo

  • DHCP-Server (erst ab Version 4.0 wirklich IPv6 fähig) dhcp-4.0.0.tar.gz scheint für IPv6 noch unbrauchbar zu sein. Auch mit der Option -6 produziert der nur die Meldung subnet_number():inet.c:51: Addr/mask length mismatch. wobei die Netzangabe fec0::/64 doch eigentlich nichts Unanständiges ist...
  • ripng
  • OSPF6
  • BGP4

Christian