Nachdem die öffentlichen IPv4-Adressen nun ja wie bekannt mehr oder weniger aufgebraucht sind, wird es langsam Zeit, sich über die Anbindung von IPv6-only Geräten gedanken zu machen. Eine praxistaugliche Variante dafür ist der ISC DHCPv6 Server.
Im FeM-Net verteilt der Router in allen Block-VLANs sogenannte Router Advertisments. Das ist IPv6-ICMP-Pakete, die mittels Broadcast verteilt werden, und den angeschlossenen Geräten die Link-Local-Adresse des Gateways mitteilen. Bei uns ist außerdem IPv6-autoconf aktiviert, d.h. die Geräte wählen aus dem angegebenen Prefix selbstständig eine freie Adresse und können diese, nachdem sichergestellt ist, dass diese frei ist, auch verwenden.
Damit der Nutzer nun ohne IPv4 surfen kann, fehlt es neben IPv6-fähigen Diensten (wovon es immer mehr gibt) zunächsteinmal an der Konfiguration eines IPv6-fähigen DNS Servers. In diese Lücke springt DHCPv6. Es verteilt wie DHCP für IPv4 weitere Optionen, darunter DNS- und NTP-Server-Adressen an die Clienten. Es kann außerdem u.a. auch statische, dynamische und temporäre Adressen an die Geräte verteilen. Im Gegensatz zu DHCP für IPv4 verteilt DHCPv6 keine Gateway-Adresse. Ein weiterer Unterschied besteht darin, dass der Client bei DHCPv6 nicht mehr notwendiger Weise die MAC-Adresse in den Payload schreibt - sondern stattdessen die allgemeinere DUID übertragen wird. Die DUID wird vom Gerät beim ersten Start erzeugt und dann weiter verwendet. Gerade in Kombination mit DHCP-Relaying führt dies dazu, dass der DHCPv6 Server eventuell keine dauerhafte und vorhersagbare Information über die Identität des Clienten hat, da die DUID je nach gebootetem Betriebssystem unterschiedlich ist. Auch hat der unter Linux verbreitete Network-Manager zwischenzeitlich die DUID regelmäßig gelöscht. In der Praxis scheinen im FeM-Net jedoch nur die DUID Varianten LL und LLT zum Einsatz zu kommen. Beide verwenden die Geräte-MAC-Adresse als DUID, bei LLT ergänzt um einen Zeitstempel.
Ein Gerät erfährt, dass es DHCPv6 nutzen soll, entweder durch manuelle Konfiguration des Nutzers oder wenn dies im RouterAdvertisment angegeben ist. Dort können die Flags "Managed Configuration" und "Other Configuration" gesetzt werden. Ersteres bedeutet, dass der Client beim DHCP Server nach einer Adresse für sich selbst fragen soll (statefull DHCPv6). Zweiteres bedeutet, dass der Client nur nach weiteren Optionen fragen soll (stateless DHCPv6).
Beides funktioniert mit einem aktuellen Windows 7 sowie Debian Wheezy problemlos.
Ein in der FeM verwendeter DHCPv6-Server ist der ISC DHCP Server. Er unterstützt sowohl DHCPv4 als auch DHCPv6. Debian bringt standardmäßig nur ein Init-Script für DHCPv4 mit. Startet man das dhcpd-Executable mit der Option "-6", so wird ein DHCPv6-Server gestartet. Ein für DHCPv6 angepasstes Init-Script findet sich hier:
http://subversion.fem.tu-ilmenau.de/websvn/wsvn/admindb/trunk/backend/script/dhcp/isc-dhcp-server6 .
Sollen nun wie in der FeM üblich statische IP-Adressen anhand der MAC-Adresse verteilt werden, so ist dies mit dem ISC DHCPv6 Server auch weiterhin möglich, da dieser die MAC aus der DUID ermittelt, sofern diese vom Typ LL oder LLT ist. Die im Beispiel verwendeten Hooks erklärt ein anderer Blog-Eintrag, sie sind jedoch völlig optional.
Beispiel:
log-facility local1;
ddns-update-style none;
default-lease-time 2592000;
preferred-lifetime 604800;
option dhcp-renewal-time 3600;
option dhcp-rebinding-time 7200;
option dhcp6.info-refresh-time 21600;
option dhcp6.rapid-commit;
authoritative;
# Enable RFC 5007 support (same than for DHCPv4)
allow leasequery;
group {
# gateway cannot be configured with DHCPv6 -> need RA for this
option dhcp6.domain-search "example.org", "test.example.org";
option dhcp6.name-servers 2001:4860:4860::8888, 001:4860:4860::8844; # google
option dhcp6.sntp-servers 2a01:1e8:e100:8296::123; # from pool.ntp.org
subnet6 fd00::/64 {
range6 fd00::/80 temporary;
range6 fd00:: fd00::ffff;
on commit {
set clip = binary-to-ascii(16, 16, ":", leased-address6);
set clhw = binary-to-ascii(16, 8, ":", suffix(option dhcp6.client-id, 6));
set cltm = binary-to-ascii(10, 32, ".", encode-int(lease-time, 32));
execute("/usr/sbin/dhcpevent", "add", clip, clhw, cltm);
}
on release {
set clip = binary-to-ascii(16, 16, ":", leased-address6);
set clhw = binary-to-ascii(16, 8, ":", suffix(option dhcp6.client-id, 6));
execute("/usr/sbin/dhcpevent", "remove", clip, clhw, "");
}
on expiry {
set clhw = "";
set clip = binary-to-ascii(16, 16, ":", leased-address6);
execute("/usr/sbin/dhcpevent", "remove", clip, clhw, "");
}
}
host test.example.org {
option dhcp6.fqdn "test.example.org";
hardware ethernet 00:01:02:03:04:05;
fixed-address6 fd00::ff;
}
}
Trackbacks