Konfiguracja DHCP w IPv4 to tylko jedna strona tematu. W nowoczesnych sieciach coraz częściej pojawia się również IPv6, a wraz z nim trochę inny model przydzielania adresów i parametrów sieciowych. I właśnie tutaj pojawiają się takie pojęcia jak SLAAC, Stateless DHCPv6 i Stateful DHCPv6. Na pierwszy rzut oka może to wyglądać jak kilka różnych wersji tego samego mechanizmu, ale w praktyce każdy z nich działa trochę inaczej i służy do czegoś innego.
W odróżnieniu od IPv4, gdzie DHCP bardzo często odpowiada jednocześnie za adres IP, maskę, bramę i DNS, w IPv6 role te mogą być rozdzielone. Część informacji host może uzyskać automatycznie z komunikatów Router Advertisement, część z serwera DHCPv6, a czasem cały adres jest przydzielany właśnie przez DHCPv6. To oznacza, że sama konfiguracja jest trochę bardziej rozbudowana, ale też daje więcej możliwości.
W tym artykule pokażę, jak działa DHCPv6 w Linuxie, czym różnią się SLAAC, Stateless DHCPv6 i Stateful DHCPv6, oraz jak uruchomić je krok po kroku w praktyce. W tym artykule korzystamy z tego samego środowiska co wcześniej, czyli z dwóch Debianów i dwóch klientów Windows. Skupimy się głównie na lewej stronie środowiska, czyli na relacji między Debian lnx1 i CL1.

Czym różnią się SLAAC, Stateless DHCPv6 i Stateful DHCPv6?
W IPv6 host może otrzymać konfigurację na kilka sposobów i właśnie stąd biorą się trzy najczęściej spotykane modele.
SLAAC – klient sam tworzy sobie adres
W tym modelu klient nie dostaje gotowego adresu z serwera DHCP, tylko sam buduje go na podstawie prefiksu otrzymanego z komunikatu Router Advertisement. Oznacza to, że router albo host pełniący taką rolę ogłasza sieć IPv6, a klient sam „dokleja” sobie końcówkę adresu i zaczyna z niego korzystać.
To rozwiązanie jest bardzo wygodne, bo nie wymaga klasycznego serwera DHCPv6 do samego przydzielania adresu. W wielu sieciach to wystarcza, szczególnie wtedy, gdy zależy nam po prostu na szybkim uruchomieniu adresacji IPv6 bez większej kontroli nad konkretnymi adresami przydzielanymi klientom.
Stateless DHCPv6 – adres z SLAAC, inne dane z DHCPv6
W trybie Stateless DHCPv6 klient nadal tworzy swój adres IPv6 przy pomocy SLAAC, ale dodatkowe informacje, takie jak serwer DNS pobiera już z serwera DHCPv6.
To bardzo praktyczne rozwiązanie, bo pozwala połączyć prostotę autokonfiguracji adresu z wygodą centralnego rozdawania parametrów dodatkowych. Właśnie dlatego ten model spotyka się dość często: adres host tworzy sam, ale na przykład adres serwera DNS dostaje już z jednego, kontrolowanego źródła.
Stateful DHCPv6 – pełny adres z serwera DHCPv6
W trybie Stateful DHCPv6 klient dostaje adres IPv6 bezpośrednio z serwera DHCPv6, podobnie jak ma to miejsce w klasycznym DHCP dla IPv4. Oznacza to większą kontrolę po stronie administratora, bo można centralnie decydować, jakie adresy są przydzielane, w jakim zakresie i którym hostom.
DHCPv6 i Router Advertisement – dlaczego oba są ważne?
W IPv6 bardzo ważną rolę odgrywają komunikaty Router Advertisement, czyli ogłoszenia rozsyłane przez router albo host pełniący taką funkcję. To one informują klientów:
- jaki prefiks IPv6 obowiązuje w danej sieci,
- czy mają używać SLAAC,
- czy mają skorzystać z DHCPv6,
- oraz czy DHCPv6 ma dostarczyć pełny adres, czy tylko dodatkowe informacje.
W praktyce oznacza to, że nawet jeśli chcesz korzystać z DHCPv6, bardzo często i tak potrzebujesz poprawnie działającego Router Advertisement. To właśnie dlatego w konfiguracji będziemy używać nie tylko isc-dhcp-server, ale również demona radvd.
Konfiguracja IPv6 na Debian lnx1
Zanim zaczniemy rozdawać adresy klientom, Debian lnx1 musi mieć skonfigurowany adres IPv6 w swojej sieci lokalnej. W naszym przykładzie załóżmy, że interfejs podłączony do sieci z CL1 otrzyma adres z prefiksu fc00:10::/64.
W Debianie można to ustawić w znanym już nam pliku: /etc/network/interfaces
Przykładowy wpis może wyglądać tak:
allow-hotplug enp0s9
iface enp0s9 inet6 static
address fc00:10::1
netmask 64
Po zapisaniu zmian restartujemy usługę sieciową:
systemctl restart networking.service
Potem warto sprawdzić, czy adres rzeczywiście pojawił się na interfejsie: ip -6 a

To ważny krok, bo bez poprawnie ustawionego IPv6 na Debianie dalsza konfiguracja nie będzie miała sensu.
Włączenie routingu IPv6
Jeżeli Debian lnx1 ma pełnić rolę hosta rozsyłającego komunikaty Router Advertisement, warto też włączyć obsługę routingu IPv6. W pliku:
/etc/sysctl.conf
dodajemy na końcu:
net.ipv6.conf.default.forwarding=1
net.ipv6.conf.all.forwarding=1
Następnie przeładowujemy konfigurację poleceniem: sysctl -p

Dobrze od razu sprawdzić, czy wartości zostały rzeczywiście ustawione. To ważne, bo bez tego host może nie zachowywać się tak, jak oczekujemy podczas pracy z IPv6.
SLAAC w praktyce – klient sam tworzy adres
Najprostszym scenariuszem jest SLAAC, czyli sytuacja, w której klient buduje adres samodzielnie na podstawie prefiksu ogłaszanego przez router.
Instalacja radvd
Na Debianie lnx1 instalujemy demona odpowiedzialnego za rozsyłanie Router Advertisement:
apt install radvd
Konfiguracja radvd
Tworzymy lub edytujemy plik: /etc/radvd.conf
i wpisujemy w nim prostą konfigurację:
interface enp0s9
{
AdvSendAdvert on;
prefix fc00:10::/64
{
};
};
Ta konfiguracja oznacza, że Debian lnx1 będzie ogłaszał prefiks fc00:10::/64 na interfejsie skierowanym do CL1.
Po zapisaniu restartujemy usługę i sprawdzamy jej status:
systemctl restart radvd
systemctl status radvd
Test na kliencie
Na CL1 restartujemy interfejs sieciowy albo po prostu chwilę czekamy, aż host odbierze komunikat Router Advertisement. Następnie sprawdzamy, czy klient dostał adres IPv6 z prefiksu fc00:10::/64.
W Windowsie można to zobaczyć poleceniem: ipconfig

Jeśli wszystko działa poprawnie, klient powinien mieć adres z tego prefiksu. To oznacza, że mechanizm SLAAC działa poprawnie i host sam wygenerował sobie adres.
Stateless DHCPv6 – adres przez SLAAC, DNS przez DHCPv6
W kolejnym kroku przechodzimy do trybu Stateless DHCPv6. W tym modelu klient nadal buduje swój adres sam przy pomocy SLAAC, ale dodatkowe informacje, na przykład serwer DNS pobiera już z serwera DHCPv6.
Modyfikacja radvd.conf

W pliku /etc/radvd.conf trzeba dopisać informację, że klient ma używać DHCPv6 do pobrania dodatkowych parametrów. Dodajemy parametr AdvOtherConfigFlag on;, który mówi klientowi:
adres tworzysz sam przez SLAAC, ale dodatkowe informacje pobierz z DHCPv6.
Po zmianach restartujemy usługę:
systemctl restart radvd
Konfiguracja DHCPv6

Teraz trzeba skonfigurować sam serwer DHCPv6. Na Debianie lnx1 wykorzystujemy do tego plik:
/etc/dhcp/dhcpd6.conf
Przykładowa konfiguracja dla stateless DHCPv6 może wyglądać tak:
default-lease-time 7200;
max-lease-time 7200;
subnet6 fc00:10::/64 {
option dhcp6.name-servers fc00:10::1;
option dhcp6.domain-search "firma.local";
}
preferred-lifetime 3600;
W tym modelu nie definiujemy jeszcze puli adresów, bo klient sam tworzy sobie adres z prefiksu. DHCPv6 ma tu dostarczyć jedynie dodatkowe dane, na przykład DNS.
Wskazanie interfejsu dla DHCPv6

W pliku: /etc/default/isc-dhcp-server trzeba uzupełnić sekcję dla IPv6 i wskazać interfejs:
INTERFACESv6="enp0s9"
Dodatkowo odkomentowujemy wartości związane ze ścieżkami do plików konfiguracyjnych DHCPv4 i DHCPv6.
Po zapisaniu restartujemy usługę DHCP:
systemctl restart isc-dhcp-server
systemctl status isc-dhcp-server
Test na kliencie

Na CL1 odświeżamy interfejs i sprawdzamy konfigurację. Klient powinien dostać dodatkowo serwer DNS. To właśnie odróżnia ten tryb od czystego SLAAC.
Stateful DHCPv6 – pełny adres z serwera
Teraz przechodzimy do trybu Stateful DHCPv6, czyli scenariusza, w którym klient dostaje adres IPv6 bezpośrednio z serwera DHCPv6.
Modyfikacja radvd.conf

W pliku /etc/radvd.conf zmieniamy konfigurację tak, aby klient wiedział, że adres ma pobrać z DHCPv6. Dodajemy parametr AdvManagedFlag on;, który mówi klientowi:
pełny adres pobierz z DHCPv6.
Po zmianach restartujemy radvd:
systemctl restart radvd
Dodanie puli adresów IPv6

Teraz w pliku /etc/dhcp/dhcpd6.conf trzeba już zdefiniować zakres adresów, które będą rozdawane klientom. Dodajemy w zasadzie tylko zakres range6 fc00:10::100 fc00:10::1ff
default-lease-time 7200;
max-lease-time 7200;
subnet6 fc00:10::/64 {
range6 fc00:10::100 fc00:10::1ff;
option dhcp6.name-servers fc00:10::1;
option dhcp6.domain-search "firma.local";
}
Po zapisaniu restartujemy usługę:
systemctl restart isc-dhcp-server
systemctl status isc-dhcp-server
Test na kliencie
Na CL1 odświeżamy interfejs sieciowy i sprawdzamy konfigurację. Tym razem klient powinien już dostać adres z zakresu zdefiniowanego w range6, a nie wygenerować go samodzielnie na podstawie SLAAC.

To właśnie odróżnia Stateful DHCPv6 od wcześniejszych trybów.
Zastrzeżony adres IPv6 dla konkretnego klienta
Tak jak w DHCP dla IPv4, również w DHCPv6 można przypisać stały adres konkretnemu klientowi. W tym przypadku zamiast adresu MAC używa się zwykle identyfikatora DUID.
Przykładowe zastrzeżenie

W pliku /etc/dhcp/dhcpd6.conf można dodać wpis w stylu:
host cl1v6 {
host-identifier option dhcp6.client-id 00:01:00:01:31:5B:D2:75:08:00:27:74:44:CB;
fixed-address6 fc00:10::100a;
}
Tutaj oczywiście identyfikator dhcp6.client-id trzeba podmienić na rzeczywisty DUID klienta.
Po zapisaniu zmian restartujemy usługę:
systemctl restart isc-dhcp-server
Następnie odświeżamy interfejs klienta i sprawdzamy, czy otrzymał właśnie zastrzeżony adres.

To przydatne wtedy, gdy chcesz zachować przewidywalność adresacji również w IPv6, ale nadal korzystać z centralnego zarządzania przez DHCPv6.
Jak rozpoznać, z którego mechanizmu korzysta klient?
To bardzo ważne pytanie, bo przy IPv6 łatwo się pogubić. W praktyce najlepiej patrzeć na to, skąd host wziął adres i jakie dodatkowe dane dostał.
- Jeśli klient sam wygenerował adres z prefiksu i nie ma dodatkowych parametrów z DHCPv6, to działa SLAAC
- Jeśli klient sam wygenerował adres, ale dostał DNS z DHCPv6, to działa Stateless DHCPv6
- Jeśli klient dostał pełny adres z puli zdefiniowanej na serwerze, to działa Stateful DHCPv6