Konfiguracja interfejsów sieciowych w dhclient

Spis treści

Konfiguracja maszyn w sieci za sprawą protokołu DHCP znacznie ułatwia życie administratorom. Cały ten proces jest nie tylko szybszy ale też eliminuje szereg błędów, które mogą pojawić się za sprawą czynnika ludzkiego. W przypadku, gdy nasza maszyna dysponuje kilkoma interfejsami sieciowymi, to każdy z nich możemy skonfigurować nieco inaczej. Oczywiście, nie chodzi o samą konfigurację adresacji ale o szereg parametrów, które klient przesyła do serwera DHCP. To dzięki nim host min. wie jak ustawić adresację na interfejsie i pod jaki adres słać zapytania DNS. Każdy interfejs może w ten sposób posiadać własne opcje, które klient DHCP będzie przesyłał do serwera. W tym artykule postaramy się konfigurować niezależnie dwa interfejsy sieciowe przy pomocy dhclient , czyli domyślnego klienta DHCP w linux'ie.

Standardowa konfiguracja dhclient'a

W domyślnej konfiguracji debiana, dhclient traktuje wszystkie interfejsy tak samo. W taki sposób jeśli podniesiemy interfejs eth0 , to zostanie mu przypisana adresacja zgodnie z tym o co zapytał ten klient DHCP. Podobnie sprawa ma się w przypadku interfejsu wlan0 . Jak mogliśmy się przekonać we wpisie dotyczącym ukrywania nazwy hosta (hostname) w protokole DHCP, w niektórych sieciach nie zawsze chcemy udostępniać pewne informacje. Mogą przecie one posłużyć do zidentyfikowania nas i oznaczenia naszego ruchu w bliżej nieokreślonych celach. Z kolei konfiguracja globalnych opcji wpłynie na wszystkie interfejsy dokładnie w taki sam sposób, co nie zawsze jest pożądane.

Konfiguracja dla dhclient jest trzymana w pliku /etc/dhcp/dhclient.conf . Zajrzyjmy do niego. Standardowo mamy tam te poniższe linijki:

option rfc3442-classless-static-routes code 121 = array of unsigned integer 8;

send host-name = gethostname();
request subnet-mask, broadcast-address, time-offset, routers,
    domain-name, domain-name-servers, domain-search, host-name,
    dhcp6.name-servers, dhcp6.domain-search, dhcp6.fqdn, dhcp6.sntp-servers,
    netbios-name-servers, netbios-scope, interface-mtu,
    rfc3442-classless-static-routes, ntp-servers;

Pierwsza z tych powyższych linijek definiuje nową opcję rfc3442-classless-static-routes , która zgodnie z RFC 3442 umożliwia określanie statycznych tras w notacji CIDR (bezklasowe) i przesyłanie ich w komunikatach protokołu DHCP. Jest to nowsza wersja opcji o numerze 33.

Pozostałe linijki określają parametry globalne, które będą przesyłane w zapytaniu do serwera DHCP ( send ) i żądane ( request ) od niego w celu skonfigurowania adresacji hosta. Poszczególne opcje są oddzielone od siebie przy pomocy , . Natomiast każda dyrektywa kończy się znakiem ; . Powyżej widzimy, że host przesyła do serwera DHCP nazwę hosta uzyskując ją via gethostname() i żąda od tego serwera przesłania szeregu parametrów. Oczywiście żądanie nie oznacza, że parametr jest wymagany. Jeśli serwer nie będzie w stanie zwrócić wartości części z powyżej ustawionych opcji, to po prostu tego nie zrobi i wyśle to co ma. Oczywiście, nic nie stoi na przeszkodzie, by wymusić pobranie danej opcji stosując dyrektywę require . Bez uzyskania opcji w tej dyrektywie, oferta konfiguracji nie zostanie zaakceptowana przez klienta DHCP. Jeśli nie zamierzamy przesyłać żadnych opcji w dyrektywie request , to bezpośrednio za jej nazwą wpisujemy ; .

Konfiguracja określonego interfejsu w dhclient

Mając kilka interfejsów możemy nadpisać wszystkie dyrektywy globalne i skonfigurować sobie każdy z tych interfejsów indywidualnie. W ten sposób każda dyrektywa może posiadać inne opcje, w zależności od interfejsu przez który zapytanie DHCP zostanie przesłane do serwera. By tego typu rozwiązanie wdrożyć musimy utworzyć osobny blok interface i w nim zawrzeć całą konfigurację. Nie musimy kasować globalnych opcji, bo one nie będą brane w ogóle pod uwagę. Poniżej jest przykład:

interface "eth0" {
    supersede domain-name-servers 127.0.0.1;
    request subnet-mask, broadcast-address, time-offset, routers,
        domain-name,
        dhcp6.fqdn, dhcp6.sntp-servers,
        netbios-name-servers, netbios-scope, interface-mtu,
        rfc3442-classless-static-routes, ntp-servers;
}

W powyższej konfiguracji przepisaliśmy sobie adres resolver'a DNS. Wszystkie dyrektywy, które nie zostały uwzględnione w bloku interface "eth0" {} , a widnieją w sekcji globalnej, będą również uwzględniane przy konfiguracji interfejsu. Dla przykładu, w dalszym ciągu zostanie wysłana nazwa hosta do serwera DHCP. Opcji, które możemy ustawić w pliku /etc/dhcp/dhclient.conf jest sporo. Dlatego też zachęcam do zapoznania się z man dhcp-options oraz man dhclient.conf.

Mikhail Morfikov avatar
Mikhail Morfikov
Po ponad 10 latach spędzonych z różnej maści linux'ami (Debian/Ubuntu, OpenWRT, Android) mogę śmiało powiedzieć, że nie ma rzeczy niemożliwych i problemów, których nie da się rozwiązać. Jedną umiejętność, którą ludzki umysł musi posiąść, by wybrnąć nawet z tej najbardziej nieprzyjemniej sytuacji, to zdolność logicznego rozumowania.