Serwer DHCP

Wprowadzenie teoretyczne do lekcji nr 5

Ten materiał poświęcony będzie instalacji serwera DHCP na Ubuntu 20.04. Tym samym rozpoczniemy instalację pierwszego z trzech podstawowych serwerów – zostaje jeszcze serwer routingu oraz serwer DNS. DHCP to skrót od Dynamic Host Configuration Protocol – protokół dynamicznego konfigurowania hostów. Jak nie trudno się domyśleć, jest to mechanizm pozwalający ”dynamicznie konfigurować hosty”. Oznacza to, że w sieci w której działa serwer DHCP, inne urządzenia będą mogły od niego pobierać potrzebne ustawienia do działania w sieci. Wśród tych ustawień są: adres IP, maska sieci, adres bramy domyślnej oraz adresy DNS. Pytanie się nasuwa: Skąd klient wie, gdzie zgłosić swoje zapytanie skoro nie ma przypisanego adresu IP? Odpowiedź brzmi: nie wie. Klient znajduje w sieci serwer DHCP wysyłając odpowiednią wiadomość na limitowany adres rozgłoszeniowy – 255.255.255.255. Kiedy serwer zostanie odnaleziony, klient wysyła odpowiednie zapytania, na które serwer DHCP odpowiada odpowiednią konfiguracją.
Adres IP przypisany przez DHCP jest dynamiczny. Oznacza to, że po jakimś czasie następuje jego zwolnienie i pobranie nowego adresu. W większości przypadków DHCP przypisze ten sam adres IP, jednak może się tak zdarzyć, iż DHCP przypisze inny adres. Otóż adresy IP są dzierżawione na określoną ilość czasu. Po tym czasie wracają do puli wolnych adresów IP, a serwer przypisuje inne. DHCP jest na pewno wygodnym mechanizmem jednak tylko w przypadku klientów. Wszelkiego rodzaju urządzenia sieciowe, serwery, drukarki i inny sprzęt tego typu musi być adresowany statycznie. Dzieje się tak iż istnieje ryzyko, że takie urządzenie dostanie inne IP, a wtedy mogą się pojawić problemy z działaniem niektórych usług.
Dodatkowo przed instalacją serwera DHCP warto zaktualizować repozytoria i pakiety znanymi komendami:
$ sudo apt update
$ sudo apt upgrade

I. Instalacja implementacji ISC DHCP.

Jako, że protokół DHCP to tylko przepis na gotowy produkt, to na rynku istnieje wiele rozwiązań, różnych producentów implementujących ten mechanizm. Jedną z najpopularniejszych implementacji serwer DHCP jest ISC DHCP. Została ona stworzona przez Internet Systems Consortium – organizację non-profit zajmującą się tworzeniem oprogramowania dla sieci komputerowych. Pierwsza wersja ISC DHCP została opublikowana w 1999 roku i jest rozwijana po dziś dzień. Pokazuje to jak nie wiele wymaga dziedzina sieci komputerowych.

Aby zainstalować ISC DHCP należy wydać polecenie:
$ sudo apt install isc-dhcp-server
Tak bowiem nazywa się pakiet z tą implementacją. Po poprawnej instalacji możemy przejść do konfiguracji.

II. Konfiguracja ISC DHCP.

Konfiguracja serwera DHCP jest bajecznie prosta. Wszystko opiera się o odpowiednie pliki konfiguracyjne, które muszą być odpowiednio edytowane, inaczej wszystko może się uszkodzić. Na podstawie naszych plików konfiguracyjnych będą tworzone inne pliki i dowiązania. W momencie kiedy coś pójdzie nie tak, to może być trudno naprawić powstałe problemy. Dlatego proszę zwracać uwagę na wszystko co robimy.

Najpierw musimy sprawdzić czy nasza usługa jest aktywna. Można to zrobić korzystając z polecenia systemctl wraz z parametrem status. Nasza usługa nazywa się isc-dhcp-server. Wpisujemy, więc:
$ sudo systemctl status isc-dhcp-server
Interesuje nas przede wszystkim pole Active. Bardzo ważne jest aby usługa NIE DZIAŁAŁA. Czyli failed jest tutaj poprawnym statusem. Jeżeli usługa by nam się podniosła to sudo systemctl stop isc-dhcp-server skutecznie ją ubije. Dodatkowymi błędami się obecnie nie przejmujemy. Informują nas, że usługa nie została skonfigurowana. Wyjść z tego okienka możemy korzystając z Ctrl+C.

Konfiguracja pliku isc-dhcp-server

Generalnie, aby serwer DHCP zadziałał poprawnie, musimy dokonać zmian w dwóch plikach:
/etc/default/isc-dhcp-server
/etc/dhcp/dhcpd.conf
Aby otworzyć pierwszy z tych plików wpisujemy:
$ sudo nano /etc/default/isc-dhcp-server
Plik /etc/default/isc-dhcp-server przechowuje informacje na temat interfejsów na których usługa będzie nasłuchiwać żądań. Poprawnie wygenerowany plik wygląda następująco (pomijając komentarze):
(…)
INTERFACESv4=""
INTERFACESv6=""

Konfiguracja pliku isc-dhcp-server

Jeżeli otworzony plik nie ma takiej struktury to należy takową utworzyć. Nas interesuje pole INTERFACESv4 gdzie w cudzysłowie wpisujemy nazwę interfejsu LAN. W naszym przypadku jest to enp0s8. Ostatecznie plik ma wyglądać tak jak na screenie.

Wykonanie kopii pliku

Istotniejszym z naszego punktu widzenia plikiem jest /etc/dhcp/dhcpd.conf. Przechowuje on konfigurację naszego demona DHCP (inaczej usługi w nomenklaturze Windowsowej) i stanowi najważniejszy element całej konfiguracji. Jego złe edytowanie może spowodować wiele problemów, dlatego należy podchodzić do niego ostrożnie. Najlepiej wykonać sobie jego kopię.
Aby wykonać kopię pliku /etc/dhcp/dhcpd.conf należy wpisać polecenie:
$ sudo cp /etc/dhcp/dhcpd.conf /etc/dhcp/dhcpd.conf-kopia
Potem możemy wyświetlić zawartość katalogu /etc/dhcp/ poleceniem:
$ ls -l /etc/dhcp
i widzimy, że kopia została wykonana.

Konfiguracja pliku dhcpd.conf

Edytujemy zatem nasz plik poleceniem:
$ sudo nano /etc/dhcp/dhcpd.conf
Pierwszym interesującym nas elementem będzie wpis authoritative. Domyślnie jest umieszczony w komentarzu, który można rozpoznać po znaku # na początku linii. Wpis ten informuje nasz serwer DHCP iż jest jedynym serwerem tego typu w sieci. Dzięki temu ISC DHCP będzie odmawiać klientom z innych podsieci przyznania adresu IP. Kiedy ta opcja pozostałaby wyłączona to serwer DHCP po prostu ignorowałby żądania klienta. Wpis ten istotny jest przy konfiguracji serwera DNS dlatego już na początku warto zdjąć z niego komentarz – kasując znak #

Konfiguracja pliku isc-dhcp-server

Następnie odnajdujemy sekcję w której komentarz mówi "A slightly different configuration for an internal subnet". Jest to przykładowa konfiguracja serwera DHCP, która wystarczy nam do ćwiczeń. Na początku musimy odkomentować wszystkie komentarze od subnet do znaku }, tak jak jest pokazane na powyższym screenie. Jest to bardzo istotne ponieważ w przypadku złego odkomentowania, usługa może już nie wstać. Oczywiście musimy dostosować konfigurację do naszej sieci. Pozwolę sobie przypomnieć parametry naszej sieci:
- Adres sieci: 192.168.10.0
- Maska sieci: 255.255.255.0 - /24
- Adres (przyszłej) bramy: 192.168.10.10
- Adres (przyszłego) serwera DNS: 192.168.10.10
- Adres serwera: 192.168.10.10
- Adres rozgłoszeniowy: 192.168.10.255
Oczywiście parametry te zależą od adresacji i u każdego mogą być zupełnie inne, dlatego też proszę nie przepisywać bezmyślnie tych danych z tego dokumentu.

Analiza sekcji "A slightly different configuration for an internal subnet"

Omówmy sobie teraz ten fragment pliku konfiguracyjnego, a konkretnie, co poszczególne opcje oznaczają.
subnet X.X.X.X netmask Y.Y.Y.Y { - jest to opcja definiująca naszą sieć w serwerze DHCP. Podaję mu podstawowe informacje o niej. W miejscu X.X.X.X podajemy adres sieci np. 192.168.10.0, zaś w miejscu Y.Y.Y.Y podajemy maskę naszej sieci np. 255.255.255.0;
range X.X.X.X Y.Y.Y.Y; - definiuje nam przedział z którego serwer DHCP będzie przydzielał adresy IP. W miejscu X.X.X.X podajemy najniższy adres IP, który chcemy przeznaczyć z naszej puli. W miejscu Y.Y.Y.Y podajemy najwyższy adres IP z naszej puli. My ustawiamy pulę liczącą 21 adresów;
option domain-name-servers X.X.X.X/example.org; - w tej sekcji podajemy adresy DNS, które chcemy aby nasi klienci używali. Mogą być w formie adresów IP (X.X.X.X) lub w formie adresów mnemonicznych (example.org). W moim przypadku będzie to adres serwera;
option domain-name „internal.example.org”; - tutaj podajemy nazwę domenową naszej sieci. Obecnie możemy zostawić to co jest oryginalnie wpisane;
option subnet-mask X.X.X.X; - w tym miejscu podajemy maskę naszej sieci. W moim przypadku będzie to maska /24 czyli 255.255.255.0;
option routers X.X.X.X; - tutaj podajemy bramę domyślną naszej sieci. Obecnie takowej nie ma, jednak w przyszłości będzie, więc podajemy adres naszego serwera Ubuntowego;
option broadcast-address X.X.X.X; - zamiast X.X.X.X podajemy adres rozgłoszeniowy naszej sieci. Rzecz prosta. W moim przypadku jest to 192.168.10.255;
default-lease-time X; - domyślny czas utrzymywania dzierżawionego adresu IP. Czas ten podajemy w sekundach. Domyślna wartość czyli 600 jest wystarczająca;
max-lease-time X; - maksymalny czas dzierżawy o jaki klient może poprosić serwer.
Tym samym kończymy też omawianie tegoż pliku konfiguracyjnego. Kiedy wszystko zostanie już skonfigurowane to należy pamiętać o zapisaniu zmian w pliku. Aby dowiedzieć się więcej informacji na temat ISC DHCP zalecam skorzystać z zasobów Internetu.

Restart serwera DHCP

Po zapisaniu pliku pozostało nam już tylko uruchomić lub zrestartować serwer DHCP. Wykorzystamy do tego znaną już komendę, jednak z innymi parametrami:
$ sudo systemctl start isc-dhcp-server
lub
$ sudo systemctl restart isc-dhcp-server

Status serwera DHCP

Następnie możemy sprawdzić czy poprawnie usługa została uruchomiona wykorzystując komendę systemctl z parametrem status:
$ sudo systemctl status isc-dhcp-server
Pole Active musi wskazywać active (running) zaś jedyny błąd jaki może się pojawić to błąd o braku deklaracji zakresu dla karty enp0s3. Błąd ten zniknie po instalacji serwera routingu, więc nie należy się nim przejmować. Jeżeli pojawia się inny błąd to może oznaczać to złą konfigurację serwera DHCP.

III. Konfiguracja klienta korzystając z serwera DHCP.

Kolejną rzeczą jaką należy zrobić, jest konfiguracja klienta lub tak jak w naszym przypadku klientów tak aby korzystali z serwera DHCP. Podłączymy do naszego serwera dwóch klientów, jeden z systemem Ubuntu Desktop 20.04, a drugi z Windows 8.1.

Konfiguracja klienta z Ubuntu

W Ubuntu możemy to zrobić w ustawieniach sieci tak jak wcześniej ustawialiśmy stałe IP. Tam wybieramy Przewodowe, wchodzimy w Opcje i w zakładce IPv4 ustawiamy Automatycznie. Zapisujemy zmiany i warto przeładować sobie interfejs korzystając z odpowiedniego do tego przycisku (przełącznik na głównym ekranie, ten fioletowy).

Konfiguracja klienta z Ubuntu

Następnie klikamy ponownie w Ustawienia i w zakładce Informacje sprawdzamy co pobrała nasza karta. Jak widzimy karta sieciowa pobrała pierwszy dostępny adres, czyli 192.168.10.200.

Adres z serwera DHCP na Ubuntu

Możemy też uruchomić terminal i tam przy użyciu polecenia ip a także sprawdzić czy pobrany adres jest właściwy. Dodatkowo możemy zapingować na serwer i jak widać odpowiedź wraca.

Adres z serwera DHCP na Windows

Podobną czynność wykonamy na kliencie z systemem Windows 8.1. Ustawiamy kartę sieciową na automatyczny pobór adresacji i po uruchomieniu wiersza poleceń wpisujemy polecenie ipconfig /all. Tym razem widzimy adres 192.168.10.201, czyli następny wolny.

Podgląd dzierżawy z poziomu serwera

Bardzo ciekawym poleceniem dostarczanym przez ISC DHCP jest:
$ sudo dhcp-lease-list
Wyświetla nam ono wszystkie obecnie trwające dzierżawy adresów IP. Można tutaj sprawdzić chociażby adres MAC czy IP komputerów, ale jedynie tych które korzystają z usług DHCP. Widać tutaj również datę wygaśnięcia dzierżawy, a także po wgraniu odpowiedniego pliku – producenta.

Pingi z serwera do klientów

Na koniec sprawdzimy połączenie z serwera do naszych klientów. Jak widać działa, połączenie pomiędzy klientami, a serwerem zostało poprawnie nawiązane.

IV. Rezerwacja adresów dla klienta.

Ostatnią rzeczą jaką pozostaje nam jeszcze zrobić, jest rezerwacja konkretnego adresu IP dla klienta. Wystarczy skojarzyć konkretny adres IP z adresem fizycznym klienta.

Rezerwacja adresu IP dla klienta

Edytujemy ponownie plik "/etc/dhcp/dhcpd.conf" poleceniem:
$ sudo nano /etc/dhcp/dhcpd.conf
i odszukujemy pozycję #host fantasia {

Rezerwacja adresu IP dla klienta

Oczywiście należy zdjąć komentarze zaczynając od host..., a kończąc na } i podać nazwę naszego hosta, jego adres MAC oraz adres IP, który chcemy dla niego zarezerwować. U nas będzie to 192.168.10.25. Zapisujemy zmiany w pliku i restartujemy serwer DHCP.

Sprawdzenie rezerwacji

Na koniec pozostaje nam w ustawieniach sieci na kliencie, znanym już "suwakiem" wyłączyć i włączyć "Ustawienia sieci przewodowej" oraz sprawdzić jaki adres IP pobrał klient. Jak widać jest to 192.168.10.25, czyli taki jaki został dla niego zarezerwowany.