DHCP i DNS, czyli konfiguracja sieci w OpenWRT

Spis treści

Rutery WiFi są w stanie zorganizować przewodową i/lub bezprzewodową sieć w naszych domach. By taka sieć działała bez zarzutu, potrzebna jest odpowiednia adresacja wszystkich komputerów wewnątrz niej. W obecnych czasach już praktycznie nie stosuje się statycznej konfiguracji, bo to zadanie zostało zrzucone na barki serwera DHCP. W OpenWRT do tego celu oddelegowane jest oprogramowanie dnsmasq. Zapewnia ono nie tylko wspomniany wyżej serwer DHCP ale także serwer cache'ujący zapytania DNS. Ten drugi z kolei jest niezastąpiony w przypadku przekazywania zapytań o nazwy domen do upstream'owego serwera DNS, który zajmuje się rozwiązywaniem tych nazw na odpowiadające im adresy IP. Bez dnsmasq ogarnięcie naszej sieci przerodziłoby się w istne piekło. Dlatego też w tym artykule przybliżymy sobie nieco konfigurację tego narzędzia.

Jak konfigurować dnsmasq w OpenWRT

W przypadku OpenWRT, dnsmasq można konfigurować na dwa sposoby. Pierwszym z nich jest konfiguracja przez plik /etc/config/dhcp . I jest to standardowe podejście. Przy starcie routera, po przetworzeniu skryptu /etc/init.d/dnsmasq jest generowany plik /var/etc/dnsmasq.conf . Niemniej jednak, tak utworzona konfiguracja nie zawiera wszystkich opcji możliwych do określenia w dnsmasq . Z tego właśnie powodu developerzy OpenWRT zostawili furtkę bezpieczeństwa, dzięki której możemy korzystać z dodatkowego pliku konfiguracyjnego /etc/dnsmasq.conf . I to jest właśnie drugi ze sposobów konfiguracji. Wszystkie niestandardowe opcje są umieszczane właśnie w tym pliku. Zatem jeśli jakieś opcje nie są uwzględniane przez natywny mechanizm OpenWRT, to zawsze możemy go obejść przez plik /etc/dnsmasq.conf i to tam dodać stosowne wpisy.

O samej konfiguracji narzędzia dnsmasq wspominałem już wielokrotnie na tym blogu w kontekście różnych aspektów pracy zarówno systemów z rodziny linux jak i OpenWRT. Niemniej jednak, tutaj postaram się zebrać wszystkie te bardziej użyteczne opcje, tak by były w jednym miejscu. Warto też wspomnieć, że cała masa parametrów jest opisana na wiki OpenWRT. Przejdźmy zatem do edycji pliku /etc/config/dhcp .

Serwer DNS

Poniższe dwie opcje są w stanie odfiltrować zapytania, na które nie potrafią odpowiedzieć publiczne serwery DNS. Pierwsza z nich, tj. domainneeded , nie forwarduje nazw bez kropek (bez części domeny). Zaś boguspriv nie zezwala na przekazywanie adresów z prywatnej przestrzeni adresowej.

option domainneeded '1'
option boguspriv '1'

Opcja local sprawia, że wszystkie zapytania we wskazanej domenie będą rozwiązywane lokalnie, tj. w oparciu o plik /etc/hosts lub lease wydawane za sprawą protokołu DHCP. Opcja domain ustawia domenę dla routera. W efekcie wszystkie hosty, które otrzymują konfiguracje od serwera DHCP, będą skonfigurowane na tę domenę. Dodatkowo, nazwa określona tutaj jest wykorzystywana w opcji expandhosts , która z kolei odpowiada za dodanie części domenowej do nazwy hostów, które jej nie posiadają.

option local '/lan/'
option domain 'lan'
option expandhosts '1'

Opcja nohosts określa czy wpisy znajdujące się w pliku /etc/hosts mają być brane pod uwagę przy rozwiązywaniu nazw hostów.

option nohosts '0'

Opcja rebind_protection zapobiega przekierowaniu w oparciu od DNS, tj. wpisujemy jedną domenę, a jest nam zwracana inna, tzw DNS rebinding. Za pomocą opcji rebind_localhost z tego mechanizmu jest wyłączony blok 127.0.0.0/8. A to ze względu na fakt, że szereg lokalnych usług wymaga tego typu operacji do poprawnego działania. Jeśli jednak są domeny, które życzylibyśmy sobie również wyłączyć spod mechanizmu DNS rebinding, to możemy je sprecyzować w list rebind_domain .

option rebind_protection '1'
option rebind_localhost '1'
list rebind_domain 'free.aero2.net.pl'

W przypadku nieudanego rozwiązania nazwy na adres IP, takie zapytanie może być buforowane i zajmować miejsce w pamięci. Za pomocą opcji nonegcache możemy wyłączyć lub włączyć dodawanie takich adresów do pamięci cache.

option nonegcache '1'

Zapytania DNS zajmują trochę czasu i w przypadku, gdy odwiedzamy jedną stronę kilka razy, to za każdym razem trzeba rozwiązać jej nazwę na adres IP. Przynajmniej takie jest domyślne zachowanie w systemach z rodziny linux, bo te nie posiadają cache DNS. Co prawda, realizacja takiego żądania nie trwa długo ale zawsze jest to parę milisekund. W tym celu stworzono mechanizm, który buforuje zapytania DNS. Gdy odwiedzamy ponownie ten sam adres, odpowiedź na żądanie pochodzi od dnsmasq i jest zwracana niemal natychmiast. Oczywiście, o ile taki wpis figuruje w cache i jest ważny. Rozmiar takiego cache (ilość wpisów) można dostosować sobie przy pomocy opcji cachesize .

option cachesize '10000'

Kolejne dwie opcje, tj. min-cache-ttl oraz max-cache-ttl , nie mogą zostać określone w pliku /etc/config/dhcp i trzeba je umieścić w pliku /etc/dnsmasq.conf . Odpowiadają one za czas ważności rekordu DNS w cache. Po upłynięciu tego czasu trzeba będzie ponownie odpytać upstream'owy serwer DNS, by rozwiązać nazwę.

min-cache-ttl=3600
max-cache-ttl=7200

Opcja dnsforwardmax odpowiada za ilość jednoczesnych zapytań, które mogą być obsługiwane przez serwer DNS.

option dnsforwardmax '1000'

Przy pomocy opcji logqueries zapytania DNS można logować w celu późniejszego debug'owa.

option logqueries '1'

Za pomocą opcji resolvfile możemy określić nazwę pliku, w którym to będą znajdować się wpisy z adresami upstream'owych serwerów DNS. Standardowo taki plik jest generowany automatycznie przy starcie routera i umieszczany w katalogu /tmp/ .

option resolvfile '/tmp/resolv.conf.auto'

W OpenWRT plik /etc/resolv.conf jest podlinkowany do /tmp/resolv.conf . Znajduje się w nim lokalny adres serwera DNS (routera), do którego to wędrują wszelkie zapytania o domeny z sieci lokalnej. Opcja noresolv sprawi, że dnsmasq nie będzie używał DNS'ów pobranych z lease DHCP od ISP. Trzeba jednak pamiętać, że by nazwy domen były rozwiązywane, to musimy określić jakiś serwer DNS. Za to odpowiadają wpisy z list server . Natomiast ostatni wpis poniżej sprawi, że wszelkie zapytania o domeny (i subdomeny) google.com będą rozwiązywane przez góglowski serwer DNS.

option noresolv '1'
list server '208.67.222.222'
list server '208.67.220.220'
list server '/google.com/8.8.8.8'

Jeśli chcemy określić statyczny wpis DNS dla jakiegoś adresu IP, to możemy to zrobić albo przez wspomniany wyżej plik /etc/hosts , albo definiując wpis w konfiguracji dnsmasq . Jeśli zdecydujemy się na tę drugą opcję, to w pliku /etc/config/dhcp musimy zdefiniować blok config domain . Ten blok ma poniższą postać:

config domain
    option name 'bdi.free.aero2.net.pl'
    option ip '10.2.37.78'

Serwer DHCP

Opcje dotyczące modułu DNS w dnsmasq mamy z głowy. Teraz przyszła pora, by rozprawić się z opcjami dotyczącymi serwera DHCP. Przede wszystkim, jeśli mamy w sieci tylko jeden router i żadna inna maszyna nie świadczy usługi DHCP, to serwer obecny w routerze jest typu authoritative . W warunkach domowych jest to prawdziwa sytuacja praktycznie w 100%. Dlatego też by przyśpieszyć przydzielanie lease w konfiguracji OpenWRT dla dnsmasq mamy ustawioną poniższą opcję.

option authoritative '1'

Trzeba także określić zakres adresów IP przydzielanych lokalnym maszynom przez serwer DHCP na routerze. Przy czym, interesuje nas jedynie interfejs lan . Dlatego też interfejs wan poniżej ma ustawioną flagę ignore . W ten sposób wskazujemy dnsmasq , by uruchamiał serwer DHCP tylko na określonych interfejsach sieciowych.

config dhcp 'lan'
    option interface 'lan'
    option start '100'
    option limit '150'
    option leasetime '12h'
    option dhcpv6 'server'
    option ra 'server'

config dhcp 'wan'
    option interface 'wan'
    option ignore '1'

Standardowa sieć w OpenWRT to 192.168.1.0/24 (192.168.1.1-192.168.1.254). Wyżej w bloku config dhcp 'lan' mamy szereg opcji, które mówią serwerowi DHCP jak ma się zachowywać. Według opcji start , pierwszy adres IP otrzymany via DHCP będzie miał numer 192.168.1.100 . Z kolei opcja limit , określa ile adresów może być do dyspozycji serwera. W tym wypadku 150 , czyli pula adresów przydzielana przez serwer DHCP to 192.168.1.100-192.168.1.249. Możemy także określić ważność lease DHCP. Jako, że są to komputery w sieci domowej, możemy ten parametr ustawić na 24-48 godzin. Po upływie połowy określonego czasu, lease traci ważność. W takim wypadku host ponownie odpytuje serwer DHCP i poprosi o konfigurację sieci. Opcje dhcpv6 oraz ra odpowiadają za konfigurację protokołu IPv6.

Niżej mamy parametr określający maksymalną ilość lease DHCP. Dobrze jest ten parametr skontrastować z pulą adresów, którą dysponuje serwer DHCP (widoczną powyżej).

option dhcpleasemax '150'

Statyczne lease DHCP

Przy pomocy dnsmasq jesteśmy także w stanie definiować statyczne lease DHCP. Możemy to zrobić z grubsza na dwa sposoby. Pierwszy z nich polega na skorzystaniu z opcji readethers w pliku /etc/config/dhcp . Za jej sprawą przeszukiwany jest plik /etc/ethers , gdzie znajduje się baza adresów MAC wraz z przypisanymi im adresami IP.

option readethers '1'

Sam plik /etc/ethers wygląda następująco:

3c:4a:92:00:4c:5b      192.168.1.150
00:11:22:33:44:55      192.168.1.200

Statyczne lease DHCP możemy także zdefiniować bezpośrednio w konfiguracji dnsmasq przez dodawanie bloków podobnych do tego poniżej:

config host
    option ip       '192.168.1.166'
    option mac      '00:16:e6:34:c4:e0'
    option name     'the-hound'

Taki zapis sprawi, że hostowi identyfikującemu się adresem MAC 00:16:e6:34:c4:e0 zostanie przypisany adres IP 192.168.1.166 i nazwa the-hound .

Opcje dla klientów DHCP

W pliku /etc/confg/dhcp możemy także zdefiniować opcje, które będą przesyłane z lease DHCP do hostów w sieci lokalnej. Pełna lista wszystkich dostępnych parametrów znajduje się tutaj. Poniżej przykład:

config dhcp 'lan'
    ...
    list 'dhcp_option' '3,192.168.1.1'
    list 'dhcp_option' '6,8.8.8.8,8.8.4.4'

Mamy tutaj dwie opcje, z których pierwsza posiada numer 3 , druga zaś 6 . Zgodnie z powyższym linkiem są to opcje router oraz serwer DNS . Za pomocą pierwszej opcji jesteśmy w stanie ustawić adres bramy sieciowej na hostach. Oczywiście w przypadku, gdy maszyna z serwerem DHCP nie jest jednocześnie bramą sieciową. Natomiast jeśli chodzi o drugą opcję, to określa ona adresy serwerów DNS, które powinny zostać ustawione na hostach pobierających lease DHCP. Standardowo router uzupełnia to pole wpisując swój własny adres, po czym wszystkie zapytania DNS skierowane do niego są forward'owane zwykle do serwerów DNS naszego ISP.

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.