Verhinderung von IPv6-Lecks
In unseren Experimenten verwenden wir globale IPv6-Adressen aus dem für die Nutzung im Internet vorgesehenen Adressbereich. Da Provider heute ihren Kunden keine IPv6-Adressen bereitstellen oder ausgeben, sollten solche Experimente keine Probleme verursachen. Der Sicherheit halber sollten Sie dennoch auf Ihrem Router das Weiterleiten von IPv6-Paketen nach außen blockieren. Wenn Ihr Router unter Linux läuft, können Sie den gesamten IPv6-Verkehr mit den folgenden Befehlen blockieren:
1
2
3
# ip6tables -P OUTPUT DROP
# ip6tables -p INPUT DROP
# ip6tables -p FORWARD DROP
Zuweisung globaler IPv6-Adressen
Die Link-Local-Adressen, die wir im ersten Artikel verwendet haben, sind in ihrer Anwendung recht eingeschränkt. Im echten Leben benötigen wir globale Unicast-Adressen. Solche Adressen stammen aus dem Bereich 2000::/3. Wissbegierige Personen wissen möglicherweise, dass Adressen aus dem Bereich 2001:0DB8::/32 für Experimente vorgesehen sind, daher werden wir genau diese verwenden. Weisen wir nun eine echte IPv6-Adresse dem Netzwerkinterface eth0 zu:
1
# ip -6 addr add 2001:0db8::1/64 dev eth0
Beachten Sie: /64 ist keine CIDR-Notation, sondern gibt die Anzahl der Bits des Präfixes an. Die folgende Grafik hilft, dies zu verstehen:
1
2
3
2001:db8:0000:0000:0000:0000:0000:0001
_____________|____|___________________
Network ID Subnet Interface ID
Die Network ID wird vom Provider festgelegt, wenn er einen Block von IPv6-Adressen vergibt. Sie können den Wert für Subnet und Interface ID selbst verwalten. In unserem Fall sind also 64 Bits für Network ID + Subnet und 64 Bits für die Interface ID reserviert. Denken Sie daran, dass in IPv4 insgesamt 32 Bits für eine Adresse vorgesehen waren, sodass Ihnen ein solcher Adressblock sehr lange reichen wird!
Nun können Sie das Interface innerhalb des lokalen Systems über die zugewiesene IPv6-Adresse anpingen. Hier gebe ich der Übersicht halber die lange IPv6-Adresse im vollständigen Format ein, damit Sie sehen können, wie das Programm ping6 diese automatisch verkürzt:
1
2
3
$ ping6 2001:db8:0:0:0:0:0:1
PING 2001:db8:0:0:0:0:0:1(2001:db8::1) 56 data bytes
64 bytes from 2001:db8::1: icmp_seq=1 ttl=64 time=0.043 ms
Ein Ping von einem anderen Host aus wird jedoch nicht funktionieren, da wir dafür – ähnlich wie bei IPv4 – einen Router benötigen.
Hinzufügen von Adressen
Sie können Ihren System-Interfaces beliebig viele Adressen hinzufügen. Zählen Sie einfach hexadezimal fort: 1, 2, 3, 4, 5, 6, 7, 8, 9, a, b, c, d, e, f, 10, 11 usw., wodurch Sie neue Adressen erhalten:
1
2
3
4
5
6
7
8
2001:db8::1
2001:db8::2
2001:db8::3
...
2001:db8::18
2001:db8::19
2001:db8::1a
2001:db8::1b
Routing
Offensichtlich muss Ihr Router IPv6 unterstützen. Wenn Ihr Router ein Linux-System ist, können Sie das Routing mit dem folgenden Befehl aktivieren:
1
# sysctl -w net.ipv6.conf.all.forwarding=1
Um zu überprüfen, ob das IPv6-Routing aktiviert ist, führen Sie den folgenden Befehl aus:
1
2
# cat /proc/sys/net/ipv6/conf/eth0/forwarding
1
Eine „1“ bedeutet, dass alles in Ordnung ist und die Routing-Funktion für IP-Version 6 auf Ihrem Gerät aktiviert ist. Installieren Sie nun radvd – den Router Advertiser Daemon – und fügen Sie in seiner Konfigurationsdatei /etc/radvd.conf Folgendes ein, wobei Sie den Interface-Namen eth0 bei Bedarf ändern:
1
2
3
4
5
6
7
interface eth0
{
AdvSendAdvert on;
prefix 2001:db8::/64
{
};
};
Nun fügen Sie Ihrem Router-Interface eine IPv6-Adresse hinzu:
1
# ip address add 2001:db8::1a/64 dev eth0
Überprüfen Sie, ob alles korrekt konfiguriert wurde, mit den folgenden Befehlen:
1
2
3
$ ifconfig eth0 | grep inet6
inet6 addr: 2001:db8::1a/64 Scope:Global
inet6 addr: fe80::20e:2eff:feb9:cbad/64 Scope:Link
1
2
3
$ ip -6 route show
2001:db8::/64 dev eth0 metric 1024 mtu 1500 advmss 1440 hoplimit 0
fe80::/64 dev eth0 proto kernel metric 256 mtu 1500 advmss 1440 hoplimit 0
Und nun können Sie radvd starten:
1
# /etc/init.d/radvd start
Nun sollten Sie das Interface Ihres Routers ohne Probleme pinguen können. Beachten Sie, dass Sie bei einer globalen Adresse im Gegensatz zu einer Link-Local-Adresse keinen Interface-Namen angeben müssen:
1
2
3
$ ping6 2001:0db8::1a
PING 2001:db8::1a(2001:db8::1a) 56 data bytes
64 bytes from 2001:db8::1a: icmp_seq=1 ttl=64 time=1.73 ms
Alle Computer, die sich im selben Switch wie der Router befinden, sollten nun automatisch Adressen aus dem Bereich 2001:0db8::/64 erhalten. Um den Router als Standard-Gateway in die Routing-Tabelle Ihrer Hosts hinzuzufügen, verwenden Sie den folgenden Befehl:
1
# ip -6 route add default via 2001:db8::1a
Sie können die manuelle Eingabe dieses Eintrags in die Routing-Tabellen der Hosts vermeiden, indem Sie die Konfiguration Ihres radvd leicht erweitern:
1
2
3
4
5
6
7
8
9
10
11
12
13
interface eth0
{
AdvSendAdvert on;
prefix 2001:db8::/64
{
AdvOnLink on;
AdvAutonomous on;
};
route ::/0
{
};
}
In den IPv6-Routing-Tabellen Ihrer Hosts sehen Sie nun Folgendes:
1
2
3
4
$ ip -6 route show
...
default via 2001:db8::1a dev eth0 metric 1024 mtu 1500 advmss 1440 hoplimit 0
...
Was tun, wenn Sie nicht möchten, dass radvd IPv6-Adressen an alle in Ihrem Netzwerk verteilt? Listen Sie in der Konfigurationsdatei des Daemons die Link-Local-Adressen der Stationen auf, denen Sie eine Adresse zuweisen möchten. Anfragen von anderen werden einfach ignoriert:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
interface eth0
{
AdvSendAdvert on;
prefix 2001:db8::/64
{
AdvOnLink on;
AdvAutonomous on;
};
route ::/0
{
};
clients
{
fe80::20d:b9ff:fe05:25b4;
fe80::20b:6aff:feef:7e8d;
fe80::221:97ff:feed:ef01;
};
};
IPv6-Adressrechner
Das Verständnis der binären Arithmetik ist sehr wichtig für das Verständnis der Adressierungsprinzipien in IP. Die manuelle Berechnung von Adressen kann ziemlich mühsam sein und führt häufig zu Fehlern. Warum sollten Sie diese Berechnungen nicht dem Computer überlassen? Es gibt viele Online-Tools dafür, wählen Sie einfach eines aus! In den meisten Distributionen finden Sie außerdem das Utility ipv6calc in den Repositories, das sich für den lokalen Gebrauch eignet.
Dienste zur Namensauflösung
Im Allgemeinen ist die Konfiguration von DNS für IPv6 ein Thema, das den Umfang eines längeren Artikels rechtfertigt, doch ich hoffe, dass die hier beschriebenen Aspekte Ihnen die richtige Richtung weisen.
Die Idee hinter der automatischen Konfiguration von IPv6-Netzwerkschnittstellen (Link-Local-Adressen und Router Advertisements) besteht darin, die Notwendigkeit eines DHCP-Servers zu eliminieren. Dennoch müssen Sie weiterhin einen DNS-Server betreiben, damit Hosts Namen in IP-Adressen und umgekehrt auflösen können. BIND9 unterstützt bereits IPv6, aber wie immer im Fall von BIND müssen Sie einige Konfigurationsdateien, die an verschiedenen Orten liegen, sorgfältig bearbeiten. Bei anderen DNS-Daemons wäre weniger Aufwand erforderlich, jedoch unterstützt bisher keiner von ihnen IPv6 vollständig. Wenn Sie sich für die Konfiguration von IPv6 in BIND interessieren, können Sie sich an die BIND-Dokumentation wenden.
In einem früheren Artikel haben wir die Verwendung der bewährten /etc/hosts-Datei betrachtet. Alternativ können Sie Dnsmasq verwenden, das mein bevorzugtes Werkzeug zur Organisation von DNS in lokalen Netzwerken ist. Es unterstützt IPv6-DNS und TFTP, hat jedoch keinen DHCP, was es zu keiner universellen Lösung macht. Dnsmasq macht den Inhalt der /etc/hosts-Datei über das DNS-Protokoll im Netzwerk verfügbar. Konfigurieren Sie zunächst die IPv6-Schnittstellen Ihrer Hosts für die Verwendung statischer Adressen, und fügen Sie dann die Zuordnung von Adressen zu Namen in die /etc/hosts-Datei Ihres Dnsmasq-Servers ein. Starten Sie den Dnsmasq-Daemon neu. Installieren Sie anschließend rdnssd – den Daemon zur Erkennung rekursiver DNS-Server – auf demselben Host, auf dem auch radvd installiert ist, und fügen Sie dann in die Konfigurationsdatei /etc/radvd.conf eine Zeile hinzu, die die Adresse Ihres Dnsmasq-Servers angibt:
1
RDNSS 2001:0db8::1b
Starten Sie radvd neu. Die Projekte radvd und rdnssd befinden sich noch in der Entwicklungsphase, daher ist es möglich, dass Sie auf einige Probleme stoßen könnten, obwohl sie auf meinen Debian-Systemen einwandfrei funktionieren.
