Wstęp.
Protokół DHCP (ang. Dynamic Host Configuration Protocol) został opracowany na podstawie BootP (bootstrap protocol). Jest to kompletny protokół konfiguracyjny, mogący dostarczyć klientowi praktycznie wszystkich informacji służących do konfiguracji TCP/IP. DHCP może przekazać wszystkie parametry, które są ujete w RFC "Requirements for Internet Host". Najpoważniejszą zmianą w stosunku do orginalnego BootP jest dynamiczne przydzielanie adresów IP. Nie musimy już tworzyć oddzielnej konfiguracji dla kazdego hosta, lecz możemy utworzyć jeden ogólny profil i stosować go do wszystkich stacji roboczych.
Zasada działania.
Serwer DHCP ma za zadania dostarczyć klientowi adres IP. Jak to w takim razie działa i skąd wiadomo, które informacje są przeznaczone dla którego komputera?
Kolejne etapy przydzielania adresu wyglądają mniej-więcej tak:
1. Klient DHCP rozgłasza pakiet DHCPDISCOVER
2. Serwer wysyła pakiet z oferowanym adresem IP (DHCPOFFER)
3. Klient wysyła żądanie (DHCPREQUEST) adresu IP
4.Serwer wysyła paczkę z potwierdzeniem przyznania adresu (DHCPACK)
Całe połączenie odbywa się na portach 67 oraz 68 UDP. Pierwsze zapytanie od klienta wysyłane jest przy użyciu adresu ograniczonego rozgłaszania 255.255.255.255. Gdy serwer otrzyma na porcie 67 żądanie adresu wysyła odpowiedź na port 68, na którym nasłuchuje klient.
Konfigurowanie serwera.
Aby mechanizm DHCP mógł działać w naszej sieci, musimy najpierw skonfigurować odpowiedni serwer DHCPd (Dynamic Host Configuration Protocol Server).
Aby serwer mógł się załadować do pamięci wymaga pliku /etc/dhcpd.leases, w którym będzie przechowywał bazę dzierżaw adresów IP. Musimy więc taki plik stworzyć. Można tego dokonać np. poprzez wydanie polecenia 'touch /etc/dhcpd.leases' będąc zalogowanym jako root.
Następnym krokiem jest skonfigurowanie samego serwera. Cała konfiguracja demona dhcpd znajduje się w pliku /etc/dhcpd.conf. Plik zawiera listę poleceń dla serwera, które opisują parametry wysyłane do klientów.
Przypuśćmy, że na komputerze pełniącym rolę serwera mamy zainstalowane dwie karty sieciowe 'eth0' (192.168.0.1/24) oraz 'eth1' (10.0.0.1/16). Niech 'eth0' będzie naszym połączeniem ze światem, a 'eth1' będzie podłączona do naszej sieci lokalnej. Oczywiste jest, że serwer dhcpd powinien nasłuchiwać jedynie na interfejsie 'eth1'. Przykładowy plik dhcpd.conf może wyglądać tak:
subnet 192.168.2.0 netmask 255.255.255.0 {
}
subnet 10.0.0.0 netmask 255.255.0.0 {
option domain-name-servers 10.0.0.1;
option routers 10.0.0.1;
max-lease-time 86400;
range 10.0.0.100 10.0.0.150;
host snake {
hardware ethernet 00:00:E8:F0:9F:D5;
fixed-address 10.0.0.6;
}
}
Instrukcje znajdującę się w nawiasie klamrowym są opisem parametrów dla poszczególnych klientów. Ponieważ mamy dwa intrfejsy sieciowe, w pliku konfiguracyjnym powinny znaleźć się dwa bloki 'subnet' określające poszczególne podsieci podłączone do serwera.
Pierwszy blok odpowiada za podsieć 192.168.2.0/24, czli nasze połączenie ze światem. Nie chcemy, aby serwer udzielał jakichkolwiek informacji dla hostów podłączonych do tej podsieci, więc nawias klamrowy jest pusty.
Drugi blok odpowiada za naszą sieć lokalną i w nim właśnie znajduje się opis konfiguracji klientów.
Pierwsza instrukcja zawarta w tym bloku to 'domain-name-servers'. Jest to opcja pozwalająca przekazać klientowi adres serwera DNS, z którego powinien korzystać podczas pracy. Ponieważ zakładam, że na tym samym serwerze zainstalowane jest oprogramowanie pełniące rolę serwera DNS (demon named), to adres serwera DNS przekazywany do klienta wskazuje na serwer 10.0.0.1.
Opcja 'routers' opisuje bramę łączącą klienta z pozostałymi sieciami. także i w tym przypadku adres został ustalony na 10.0.0.1, ponieważ nasz serwer jest jednocześnie routerem dostępowym do internetu.
Trzecim poleceniem jest 'max-lease-time', które opisuje czas dzierżawy adresu (parametr podany jest w sekundach, a wartość 86400 oznacza 24 godziny). Po upłynięciu tego czasu, klient, o ile jest aktywny, zobowiązany jest odnowić dzierżawę adresu.
Kolejnym poleceniem jest 'range'. Linia ta opisuje przedział adresów IP, jaki został udostepniony dla serwera DHCP. Innymi słowy klienci zgłaszający się do serwera o przydzielenie adresu dostaną adres właśnie z przedziału opisanego poleceniem 'range'.
Następnie następuje statyczne przypisanie adresu dla konkretnego hosta. Czasem się zdarza, że określony komputer w sieci powinien zawsze dostawać ten sam adres IP. Sytuacja taka występuje np. wtedy, gdy nasz router dostępowy mapuje pewne porty na jakiś komputer w lokalnej sieci. W takim wypadku należy za pomocą parametru 'hardware ethernet' zdefiniować adres MAC karty sieciowej, dla której chcemy przydzielić statyczne IP, a nastepnie za pomocą 'fixed-address' przypisać jej odpowiednie IP.
Jest jeszcze jeden powód, dla którego możemy chcieć przypisywać statyczne adresy dla klientów. Jeżeli jesteśmy szczęśliwymi posiadaczami lokalnej sieci komputerowej podłączonej jakimś stałym łączem do internetu to czasem zadrza się sytuacja, że chcemy mieć kontrolę nad tym, kto może korzystać z internetu. W miarę prostym sposobem na rozwiązanie tego problemu jest skojarzenie MAC adresów kart sieciowych klientów ze stałymi adresami IP i regulowanie dostępu do łącza internetowego poprzez odpowiednie regółki 'iptables' lub 'ipchains'.
Przedstwiony powyżej prosty przykład zawiera jedynie kilka z wielu przydatnych opcji, które można skonfigurować za pomocą DHCP. Po pełną listę parametrów odsyłam do systemowego manuala a tutaj chciałbym przedstawić jeszcze jedną, czasem przydatną w małych sieciach osiedlowych:
Za pomocą polecenia 'netbios-name-servers [lista serwerów]' możemy powiadomić stacje robocze o serwerach NetBIOSu, które pracują w naszej sieci. Serwerem NetBIOSu jest m.in jeden z demonów Samby.
Uruchamianie serwera.
Po skonfigurowaniu wystarczy już tylko uruchomić serwer i cieszyć się dobrodziejstwami mechanizmu DHCP.
UWAGA:
Czasem jednak zdarza się sytuacja, że pomimo prawidłowego działania serwera DHCP klienci nie widzą serwera i nie otrzymują od niego żadnych informacji (szczególnie dotyczy to stacji Windows). W takim przypadku należy do jednego ze skryptów startowych (np. dla dystrybucji Slackware może to być /etc/rc.d/rc.inet1) dodać linię '/sbin/route add -host 255.255.255.255 dev eth1' (oczywiście parametr 'ethX' musimy dobrać odpowiednio do interfejsu).
Poza tym jest możliwość wymuszenia na demonie DHCPd nasłuchiwania tylko na określonym interfejsie. Na moim serwerze demon jest uruchamiany w następujący sposób:
if [ -x /usr/sbin/dhcpd ]; then
echo "Starting: /usr/sbin/dhcpd"
/usr/sbin/dhcpd eth0
fi
Parametr wystepujący po nazwie programu, czyli w tym przypadku 'eth0' określa, że demon będzie aktywny jednynie na tym interfejsie sieciowym.