===== 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 ===
DISCOVEROFFERREQUESTACKREQUESTACKRELEASEKlientSerwerDHCPSerwerDHCPodświeżeniedzierawy zwolnienieadresupobranieadresu
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.