===== Automatyczna konfiguracja sieci - DHCP, NDP, DHCPv6 =====
==== Adresy link-local ====
Do umożliwienia komunikacji z innymi bezpośrednio podłączonymi urządzeniami,
urządzenie może samodzielnie ustawić sobie adres ze specjalnych sieci
169.254.0.0/16 (IPv4) lub fe80::/64 (IPv6). Adresy z tych sieci są ważne tylko
w obrębie połączenia (ang. //link-local//) i w związku z tym adresy z tych sieci
mogą być jednocześnie używane na wielu urządzeniach.
Przy użyciu tych adresów konieczne jest wskazanie też interfejsu przez
który ma następować komunikacja. W Linuksie prawidłowa składnia to
//adres%interfejs//, np. ''ping fe80::1%eth0''.
Dla IPv4 ustawianie tych adresów realizowane jest na żądanie administratora przez
[[https://en.wikipedia.org/wiki/Zero-configuration_networking|zeroconf]]).
Protokół IPv6 określa, że urządzenie natychmiast po nawiązaniu połączenia
na warstwie łącza danych musi automatycznie ustawić sobie adres z sieci
fe80::/64.
Ustawianie adresów link-local przebiega następująco:
- urządzenie samodzielnie wybiera adres (zwykle na podstawie swojego adresu MAC),
- urządzenie sprawdza czy nikt inny nie ma takiego adresu (wysyłając [[bio-sk:lacza_danych#tlumaczenie_ip_na_mac|pakiet ARP lub Neighbor Solicitation]]),
- urządzenie ustawia sobie wybrany adres, bądź ponawia procedurę (wybierając inny adres).
==== Adres z sieci lokalnej, brama i adres serwera DNS ====
Do zapewnienia dostępu do sieci lokalnej i internetu komputer potrzebuje adresu
IP (z sieci lokalnej), tras (zwykle wystarczy adres IP bramy domyślnej) i adresu
IP serwera nazw. Te adresy może ustawić:
* ręcznie administrator (IPv4, IPV6),
* urządzenie po uzyskaniu podstawowych informacji o sieci i samodzielnym wybraniu sobie adresu z sieci lokalnej (tylko IPv6),
* urządzenie po otrzymaniu ich z serwera DHCP, który "wydzierżawia" temu urządzeniu na określony czas adres z sieci lokalnej (IPv4, IPV6).
==== DHCP - przydzielanie IPv4 ====
=== Działanie ===
Przebieg (bezproblemowego) pobrania adresu z serwera DHCP i późniejszego działania klienta:
- klient wysyła komunikat DISCOVER na adres rozgłoszeniowy (255.255.255.255),
- serwery odpowiadają komunikatem OFFER zawierającym proponowany adres IP i czas dzierżawy, informacje o trasie domyślnej, serwerach DNS (i, jeśli skonfigurowano, o innych ustawieniach sieci),
- klient w odpowiedzi na pierwszą ofertę wysyła REQUEST prosząc o wydzierżawienie adresu IP,
- serwery potwierdza komunikatem ACK wydzierżawienie adresu (z zawartością podobną jak OFFER),
- każdorazowo przed upływem czasu dzierżawy klient wysyła ponownie REQUEST i otrzymuje kolejny ACK (przedłużający dzierżawę),
- jeśli klient kończy używać adres IP przed upływem czasu dzierżawy, może wysłać komunikat RELEASE.
W komunikatach DISCOVER, OFFER, REQUEST i ACK mogą być przekazywane
dodatkowo //opcje// które informują klienta/serwer o ustawieniach sieci/klienta.
Pozwalają one np. ustawić serwer czasu, poinformować serwer o nazwie urządzenia
klienta, określić jaka jest nazwa domenowa komputerów w sieci, przesłać do
urządzenia informacje o dodatkowych trasach.
Lista zdefiniowanych opcji jest
[[https://www.iana.org/assignments/bootp-dhcp-parameters/bootp-dhcp-parameters.xhtml|tutaj]].
=== Pobieranie adresów ===
Przykładowe implementacje klientów DHCP:
* ''[[https://www.isc.org/downloads/dhcp/|dhclient]]'' – klient rozwijany wraz z serwerem ISC DHCP
* żądanie adresu IP: ''dhclient [-d] //eth0//''
* uwolnienie adresu IP: ''dhclient -r //eth0//''
* ''[[https://roy.marples.name/projects/dhcpcd|dhcpcd]]'' – popularny klient DHCP dla Linuksów
* żądanie adresu IP: **''dhcpcd -4 [-d] //eth0//''**
* uwolnienie adresu IP: **''dhcpcd -4 -k //eth0//''**
* ''[[https://en.wikipedia.org/wiki/Udhcpc|udhcpc]]'' – fragment busyboxa, popularny na urządzeniach wbudowanych
* żądanie adresu IP: ''udhcpc -i //eth0//''
=== Podstawy konfiguracji ===
[[https://pl.wikipedia.org/wiki/Dnsmasq|Dnsmasq]] jest popularnym
niewielkim serwerem DNS i DHCP. Zwykle konfiguruje się jego zachowanie
[[https://thekelleys.org.uk/gitweb/?p=dnsmasq.git;a=blob;f=dnsmasq.conf.example|w pliku konfiguracyjnym]],
na potrzeby laboratorium wszystkie opcje podawane są z linii komend.
Serwer DHCP wymaga, żeby na interfejsie z którego przyszła prośba o IP był już
nadany adres IP z sieci z której ma przydzielić adres IP.
Przykładowa komenda do uruchomienia samego serwera DHCP używając dnsmasq:
dnsmasq -d -p0 --interface=eth0 --dhcp-range=192.168.0.100,192.168.0.199
Opcja ''-d'' uruchamia ''dnsmasq'' w trybie diagnostycznym (zajmuje terminal i
wypisuje na niego komunikaty diagnostyczne),
\\
''-p0'' wyłącza działanie ''dnsmasq'' jako serwer DNS,
\\
''--interface=…'' wskazuje na którym urządzeniu serwer ma działać,
\\
natomiast ''--dhcp-range=…'' określa które adresy IP mają być przydzielane.
Zbiór adresów do przydzielania przez serwer DHCP nazywa się pulą adresów
(address pool).
Często ustawia się serwer DHCP tak, by zawsze przydzielał wskazanym urządzeniom
konkretne adresy. W tym celu definiuje się **statyczne dzierżawy** (//static leases//),
czyli mówi który adres jest zajęty/zarezerwowany przez np. przez wskazany MAC.
\\
Przykład takiej konfiguracji w ''dnsmasq'':
dnsmasq -d -p0 --interface=eth0 --dhcp-range=192.168.0.100,192.168.0.150 \
--dhcp-host=7e:04:fe:43:67:41,192.168.0.123,laptop \
--dhcp-host=b6:d0:06:16:49:80,192.168.0.245
gdzie np. ''7e:04:fe:43:67:41'' to MAC urządzenia które ma zawsze dostawać adres
''192.168.0.123'' i mieć proponowaną nazwę hosta ''laptop''.
Domyślnie serwer ''dnsmasq'' ustawia adres własny IP jako trasę domyślną,
proponuje siebie jako sewer DNS (''dnsmasq'' normalnie działa jako DNS i DHCP
jednocześnie). Można zmienić to zachowanie podając własne wartości tych czy
innych opcji, np. komendą:
dnsmasq -d -p0 --interface=eth0 --dhcp-range=192.168.0.100,192.168.0.199 \
--dhcp-option option:dns-server,150.254.5.4,150.254.5.11 \
--dhcp-option=option:ntp-server,150.254.5.25 \
--domain=cs.put.poznan.pl
Klient może zażądać konkretnych opcji, dla ''dhcpcd'' można to uzyskać np.
komendą ''dhcpcd -4 -o ntp_servers -d //eth0//''.
\\
Listę opcji które zna ''dnsmasq'' można wyświetlić komendą ''dnsmasq --help dhcp''.
==== NDP - informowanie o konfiguracji IPv6 ====
=== Działanie ===
Do IPv6 włączono protokół NDP pozwalający, poza wyszukaniem adresu MAC który ma
komputer ze wskazanym IPv6, poznać podstawowe informacje o sieci.
\\
W IPv6 routery powinny periodyczne i na żądanie (//Router Solicit//, RS) wysyłać
komunikat //Router Advertisment// (RA).
Komunikaty RA mogą zawierać:
* listę prefiksów (sieci IPv6) z informacją czy urządzenie może samo wybrać sobie adres z tej sieci,
* informacje czy w sieci jest serwer DHCPv6, oraz:
* czy należy go użyć do pobrania adresów IPv6,
* czy można go prosić o dodatkowe informacje o sieci,
* listę serwerów DNS,
* nazwę domenową komputerów w sieci.
Dodatkowo urządzenia uznają adres z którego otrzymano RA za trasę domyślną.
Jeśli tak nie jest, przy próbie użycia tego routera jako bramy domyślnej
dostaną w odpowiedzi komunikat //Redirect// ze wskazaniem właściwej trasy.
Do wysłania komunikatu //Router Solicit// i wyświetlenia otrzymanych RA można
użyć narzędzia **''rdisc6''**, np:
\\
''rdisc6 br0''
=== Samodzielna konfiguracja adresów (SLAAC) ===
Jeśli RA wskazuje że urządzenie może samo wybrać adresy IP ze wskazanych sieci,
to urządzenie wykonuje taką konfigurację automatycznie. Taką konfigurację
nazywa się //Stateless Adress Autoconfiguration// (SLAAC).
W laboratoriach sieciowych administrator tak ustawił zachowanie systemu, by nie
wykonywać automatycznej konfiguracji. Wykonaj poniższe komendy żeby odblokować
SLAAC:
sysctl net.ipv6.conf.p4p1.addr_gen_mode=0 net.ipv6.conf.p4p2.addr_gen_mode=0
sysctl net.ipv6.conf.p4p1.autoconf=1 net.ipv6.conf.p4p2.autoconf=1
sysctl net.ipv6.conf.p4p1.accept_ra=1 net.ipv6.conf.p4p2.accept_ra=1
W Linuksie jeśli urządzenie jest ustawione jako router (ma włączone przekazywanie
pakietów), to domyślnie ignoruje RA.
(Odszukaj [[https://docs.kernel.org/networking/ip-sysctl.html|tutaj]] klucza
''accept_ra''). Można wyświetlić bieżące ustawienia przetwarzania RA komendą
''sysctl -ar 'accept_ra$''.
=== Konfiguracja ===
Podobnie jak dla IPv4, do przykładowej konfiguracji wykorzystane jest narzędzie
''dnsmasq'', i podobnie jak dla IPv4, do poprawnego działania należy najpierw
ustawić adres z sieci na wskazanym interfejsie.
Przykładowa komenda do ustawienia wysyłania RA i określenia że urządzenia mają
wszystko zrobić samodzielnie:
dnsmasq -d -p0 --interface=eth0 --dhcp-range=fd00::,ra-only
Przykładowa komenda wskazująca dodatkowo serwery DNS i lokalna domenę:
dnsmasq -d -p0 --interface=eth0 --dhcp-range=fd00::,ra-only \
--dhcp-option=option6:domain-search,cs.put.poznan.pl \
--dhcp-option=option6:dns-server,[2001:808:201::5:4],[2001:808:201::5:11]
==== NDP + DHCPv6 ====
Jeżeli możliwości NDP są niewystarczające lub administrator chce decydować
o tym jakie adresy zostaną przyznane urządzeniom, może w RA nakazać użycie
serwera DHCPv6.
Protokół DHCPv6 działa podobnie do DHCP, jedynie klient do zażądania dodatkowej
konfiguracji (jeśli nie prosi o adres) wysyła INFORMATION-REQUEST
zamiast odpowiednika((W DHCPv6 zmieniono nazwy komunikatów w porównaniu z DHCP,
nawet dla komunikatów których semantyka została bez zmian.)) DISCOVER.
=== Pobieranie adresów bądź dodatkowej konfiguracji z serwera DHCPv6 ===
Przykładowe komendy ustawiające IPv6 z użyciem serwera DHCPv6:
* dhclient
* żądanie konfiguracji: ''dhclient -6 [-d] //eth0//''
* uwolnienie adresu (jeśli został nadany): ''dhclient -6 -r //eth0//''
* dhcpcd
* żądanie konfiguracji: **''dhcpcd -6 [-d] //eth0//''**
* uwolnienie adresu (jeśli został nadany): **''dhcpcd -6 -k //eth0//''**
=== SLAAC + dodatkowa konfiguracja z DHCPv6 ===
Przykładowa komenda konfigurująca wysyłanie RA pozwalającego samodzielnie
wybrać adres, ale dostarczająca dodatkowych ustawień z użyciem DHCPv6:
dnsmasq -d -p0 --interface=eth0 --dhcp-range=fd00::,ra-stateless \
--dhcp-option=option6:domain-search,cs.put.poznan.pl \
--dhcp-option option6:dns-server,[2001:808:201::5:4],[2001:808:201::5:11] \
--dhcp-option option6:ntp-server,[2001:808:201::5:25]
Klient, podobnie jak dla DHCP, w DHCPv6 może zażądać konkretnych opcji, np.
komendą ''dhcpcd -6 -o ntp_servers -d //eth0//''.
\\
Listę opcji które zna ''dnsmasq'' można wyświetlić komendą ''dnsmasq --help dhcp6''.
=== DHCPv6 ===
Przykładowa komenda konfigurująca wysyłanie RA nakazującego użycie DHCPv6
i dostarczająca adresy IPv6 po DHCPv6:
dnsmasq -d -p0 --interface=eth0 --dhcp-range=fd00::1,fd00::f --enable-ra
Przykładowa komenda konfigurująca wysyłanie RA nakazującego użycie DHCPv6
i dostarczająca adresy IPv6 i dodatkową konfigurację sieci po DHCPv6:
dnsmasq -d -p0 --interface=eth0 --dhcp-range=fd00::1,fd00::f --enable-ra \
--dhcp-option=option6:domain-search,cs.put.poznan.pl \
--dhcp-option option6:dns-server,[2001:808:201::5:4],[2001:808:201::5:11] \
--dhcp-option option6:ntp-server,[2001:808:201::5:25]
=== Static leases w DHCPv6 ===
Do przydzielania konkretnym urządzeniom wybranych adresów IPv6 protokół DHCPv6
przewiduje użycie, do określania o które urządzenie chodzi, identyfikatora
[[https://datatracker.ietf.org/doc/html/rfc8415#section-11|DUID]] wybieranego
przez klienta. Ustawiając statyczną dzierżawę najprościej znaleźć użyty przez
klienta DUID i skopiować go do konfiguracji – DUID może być generowany na
kilka sposobów i nie wszystkie z tych sposobów zawierają adres MAC.