Serwer DNS

Wprowadzenie teoretyczne do lekcji nr 7

Dokument ten stanowi zwieńczenie trylogii o najważniejszych serwerach. Uruchamialiśmy serwer Dynamic Host Configuration Protocol, powoływaliśmy do życie Routing i NAT, przyszła więc pora na uruchomienie kolejnego istotnego w sieci serwera - serwera DNS.
Czym jest usługa DNS to raczej każdy wie, jednak na wszelki wypadek pozwolę sobie przypomnieć. DNS to skrót od Domain Name System i jest to hierarchiczny, rozproszony system nazw sieciowych, odpowiadający na zapytania o nazwy domen. Stwierdzenie "jest to usługa zamieniająca domenę na nazwę IP" jest dość powierzchownym stwierdzeniem i nadaje się na lekcje Informatyki w szkole podstawowej. DNS nie tylko tłumaczy domeny na adresy IP, ale może np. tłumaczyć adresy IP na domeny (tzw. RevDNS), a nawet domeny na domeny (CNAME). Hierarchiczny oznacza, że opiera się na jakiejś hierarchii, w tym przypadku będziemy mieć 13 głównym serwerów zwanych root-servers, do których są podłączone mniejsze serwery w różnych krajach. Do tych serwerów mogą być podłączone inne serwery np. operatorów domen, operatorów internetowych itd. Z kolei do tych serwerów często podłączone są serwery mniejsze – firmowe, domowe. Rozproszony oznacza, że nie skupia się w jednym miejscu. Serwery DNS rozproszone są po krajach, kontynentach, miastach itd.
Znając to, możemy przejść do instalacji naszego serwera DNS. Użyjemy do tego implementacji o nazwie BIND w wersji 9. Jest to serwer stworzony przez Internet Systems Consortium, które można kojarzyć z serwera DHCP. BIND to skrót od Berkley Internet Name Domain. Wpierw jednak warto zaktualizować repozytoria i pakiety na naszym serwerze. Jeżeli zaś chodzi o dalsze wyjaśnienia na temat DNS, to będę wszystko tłumaczył w dalszej części tego dokumentu.

I. Instalacja implementacji BIND9.

Najpierw będziemy musieli zainstalować nasz serwer DNS. Użyjemy do tego następującej komendy:
$ sudo apt install -y bind9 bind9utils bind9-doc dnsutils
Zainstaluje nam ona serwer BIND9, dodatkowe oprogramowanie oraz dokumentację do serwera. Po pomyślnej instalacji, możemy przejść do właściwej konfiguracji.

Zanim przejdziemy do dalszej konfiguracji, wypunktujmy sobie najważniejsze informacje:
- Adres IP serwera: 192.168.10.10
- Docelowa domena: mydomain.local
- Nazwa domenowa serwera: serwer.mydomain.local
- Nazwa domenowa klienta: klient1.mydomain.local
Oczywiście każdy może sobie wybrać inną domenę. Ważne jest aby nie była to domena publiczna jak .com .pl .edu itd. Najlepiej korzystać z domeny .local przeznaczonej dla sieci lokalnej. Jednak nikt nie zabroni nam korzystać np. z domeny .uwu.

Konfiguracja BIND9 przechowywana jest w folderze /etc/bind. Najlepiej będzie jeżeli przejdziemy do tego katalogu i sobie go wylistujemy poleceniem:
$ ls -l
Interesują nas pliki zaznaczone na zielono, gdyż te wykorzystamy sobie do konfiguracji naszego serwera DNS.
- db.127 - przykładowa konfiguracja strefy przeszukiwania wstecznego
- db.local - przykładowa konfiguracja strefy przeszukiwania do przodu
- named.conf - globalna konfiguracja DNS
- named.conf.default-zones - domyślne strefy przeszukiwania
- named.conf.local - lokalna konfiguracja DNS
- named.conf.options - konfiguracja serwera DNS

II. Konfiguracja serwera BIND9.

UWAGA! ACHTUNG! ATTENTION!
Serwer BIND9 posiada dość wybredną składnię plików konfiguracyjnych. Należy uważać aby WSZYSTKO było wpisane poprawnie. W przeciwnym wypadku serwer NIE ZADZIAŁA. Proszę się pilnować aby NIE POMIJAĆ znaków ani NIE PRZEPISYWAĆ WSZYSTKIEGO NA ŚLEPO.


Konfiguracja pliku /etc/bind/named.conf.options

Konfigurację serwera BIND9 rozpoczniemy sobie od edycji pliku /etc/bind/named.conf.options znanym edytorem stosując polecenie:
$ sudo nano /etc/bind/named.conf.options
Musimy sobie odnaleźć w nim zakomentowaną opcję nazwaną forwarders. Odkomentujemy całą opcję, a następnie w miejsce 0.0.0.0 wpisujemy adres IP jakiegoś serwera DNS. Ja w swojej sieci domowej posiadam własny serwer DNS, więc tego też używam. Wy możecie, a nawet musicie, wpisać inny serwer. Zapisujemy plik i opuszczamy edytor.

Teraz skonfigurujemy sobie plik /etc/bind/named.conf.local. Dodamy sobie do niego dwie strefy przeszukiwania – naprzód i wstecz. Zanim jednak to zrobimy, warto wyjaśnić znaczenie poszczególnych pól, które będą uzupełniane.
Zone (pol. Strefa) jest to wydzielony obszar w systemie nazw domenowych (Domain Name System) gdzie obowiązek administrowania został oddelegowany do pojedynczego menadżera. Aby to zrozumieć należy przypomnieć sobie czym jest DNS – jest to "hierarchiczny, rozproszony system nazw sieciowych, odpowiadający na zapytania o nazwy domen". System ten rozproszony jest na całym świecie i składa się z wielu domen. Strefa to jest obszar, który zajmuje się jedną domeną i wszystkimi subdomenami i innymi sprawami związanymi z daną domeną. Menadżerem jest główny serwer DNS danej domeny. Oczywiście jeden serwer może być menadżerem wielu domen, czyli wielu stref.
Strefa przeszukiwania naprzód jest strefą która zawiera rekordy mapujące nazwy domenowe na adresy IP lub inne informacje. Zaś strefa przeszukiwania wstecz jest strefą, która zawiera rekordy mapujące adresy IP lub inne informacje na nazwy domenowe. Jest to element związany z usługą Reverse DNS, która właśnie mapuje adresy IP na domeny.

Konfiguracja pliku /etc/bind/named.conf.local

Wróćmy jednak do naszego pliku. Edytujemy go poleceniem:
$ sudo nano /etc/bind/named.conf.local
Utworzenie strefy rozpoczniemy od napisania słowa "zone"”", następnie w cudzysłowie podajemy adres naszej domeny "mydomain.local", a następnie "IN", czyli "w". Otwieramy nawiasy klamrowe "{}", w których podamy potrzebne parametry na podstawie, których BIND9 będzie obsługiwał domenę. Pierwszy z nich, czyli type master; informuje serwer, że będzie on głównym serwerem DNS dla strefy. Innym typem jest slave. Wtedy serwer pobiera dane o strefie (czyli domeny, subdomeny itd.) z serwera master. File "(…)" wskazuje nam na plik przechowywujący informacje o strefie. Później mamy allow-update {none;}; allow-transfer {adresip;}; oraz also-notify {adresip;};. Co te parametry oznaczają zostało wyjaśnione na screenie. Następnie dodamy do pliku drugą strefę jednak tym razem strefę przeszukiwania wstecznego. Zapis będzie taki sam jak wcześniej z tą różnicą, że wskazujemy inny plik, a domena ma następujący zapis:
X.in-addr.arpa Tam gdzie jest X podajemy odwrócony adres IP serwera DNS bez części hosta. Czyli dla adresu IP 192.168.10.10/24 piszemy 10.168.192.in-addr.arpa. Dla IP 10.0.0.1/8 piszemy 10.in-addr.arpa. Dla adresów publicznych np. 8.8.4.4 piszemy 4.4.8.8.in.addr.arpa. Kiedy nasz plik wygląda jak powyżej, to możemy go zapisać i przejść dalej.

Tworzenie pliku /etc/bind/forward.mydomain.local.db

Teraz przejdziemy do konfiguracji strefy przeszukiwania do przodu. Najpierw musimy skopiować przykładowy plik konfiguracyjny (/etc/bind/db.local) i nadać mu taką nazwę jaką podaliśmy w poprzednim pliku przy opcji file. W moim przypadku komenda będzie wyglądać następująco:
$ sudo cp /etc/bind/db.local /etc/bind/forward.mydomain.local.db

Zawartość pliku /etc/bind/forward.mydomain.local.db

Następnie edytujemy sobie plik /etc/bind/forward.mydomain.local.db poleceniem:
$ sudo nano /etc/bind/forward.mydomain.local.db
Widzimy oryginalną zawartość tego pliku, którą za chwilę zmienimy. Pierwsze co musimy zrobić to zmienić localhost. oraz root.localhost. na nazwę domenową jaką wybraliśmy dla naszego serwera. Ja wybrałem serwer.mydomain.local, więc taką też podaję.
PROSZĘ PAMIĘTAĆ O KROPCE NA KOŃCU KAŻDEJ NAZWY DOMENOWEJ.
Później zmieniamy numer seryjny (Serial) pliku o 1. DOKONUJEMY TEGO ZAWSZE PO KAŻDORAZOWEJ ZMIANIE TEGO PLIKU. Jest to istotne, gdyż wtedy informujemy serwer DNS, że strefa uległa zmianie. Na samym końcu dodajemy już interesujące nas rekordy. Ich składnia wygląda następująco:
nazwa_domenowa   IN   typ_rekordu   wartość
serwer                          IN            A            192.168.10.10
Znak @ oznacza tutaj sam serwer.
Rekordy to są poszczególne wpisy w strefie, które mapują odpowiednie informacje. Typów rekordów jest wiele jednak takimi najpopularniejszymi są:
- A - mapuje nazwę domenową na adres IP
- NS - informuje o serwerach DNS
- CNAME - mapuje nazwę domenową na nazwę domenową
- MX - informuje o serwerze poczty
- AAAA - mapuje nazwę domenową na adres IPv6
- TXT - przechowuje czysty tekst. Używany przez chociażby przez Google do autoryzacji właściciela

Konfiguracja pliku /etc/bind/forward.mydomain.local.db

Skoro już wszystko wiemy, to dokonujemy odpowiednich wpisów w naszym pliku. Oprócz wprowadzenia nazwy serwera i domeny, ja dodam jeszcze cztery rekordy. Jeden informuje nas istnieniu serwera DNS pod adresem serwer.mydomain.local. Drugi informuje, że pod nazwą serwer.mydomain.local skryje się adres IP 192.168.10.10. Trzeci informuje nas, że pod nazwą klient1.mydomain.local znajduje się IP 192.168.10.11. Ostatni typ CNAME (taki alias) informuje nas, że pod nazwą alKli1.mydomain.local kryje się klient1.mydomain.local. Jeżeli mamy w sieci większą ilość klientów to również możemy ich dodać. Ważne jest to aby mieli oni stały adres IP, a nie przydzielany przez DHCP. Jeżeli nasz plik wygląda jak powyżej to zapisujemy w nim zmiany i zamykamy go.

Tworzenie pliku /etc/bind/reverse.mydomain.local.db

Teraz pora na drugi plik, czyli strefa przeszukiwania wstecznego. Również tworzymy sobie kopię pliku z tym, że zamiast /etc/bind/db.local musimy użyć /etc/bind/db.127 Nadajemy mu taką nazwę jaką podaliśmy wcześniej przy opcji file. W moim przypadku komenda będzie wyglądać następująco:
$ sudo cp /etc/bind/db.127 /etc/bind/reverse.mydomain.local.db

Zawartość pliku /etc/bind/reverse.mydomain.local.db

Kiedy to już zrobiliśmy to możemy przejść do edycji tego pliku znanym już poleceniem:
$ sudo nano /etc/bind/reverse.mydomain.local.db
Widzimy oryginalną zawartość tego pliku i postępujemy tak samo jak w poprzednim przypadku (zmiana localhost i numeru seryjnego). Aż do momentu dodawania rekordów. Najpierw tak jak poprzednio dodajemy dwa rekordy – NS i A informujące o serwerze DNS. Na samym końcu dodajemy interesujące nas rekordy, a ich składnia wygląda następująco:
część_hosta_ip   IN   PTR   adres_domenowy
np. 10                     IN   PTR   serwer.mydomain.local.
PAMIĘTAJMY O KROPCE NA KOŃCU.

Konfiguracja pliku /etc/bind/reverse.mydomain.local.db

Skoro już wszystko wiemy, to dokonujemy odpowiednich wpisów w naszym pliku. Dodajemy tyle rekordów PTR, używanych przy RevDNS ile mamy zdefiniowanych subdomen w strefie przeszukiwania do przodu. Ja mam dwa – serwer oraz klienta, więc dodaję tylko dwa rekordy. Jeżeli nasz plik wygląda jak powyżej to zapisujemy w nim zmiany i zamykamy go.

Sprawdzenie konfiguracji

Teraz pozostało nam tylko sprawdzić i zaakceptować opcje trzema komendami:
$ sudo named-checkconf
Powyższa komenda sprawdzi nam konfigurację serwera DNS.
$ sudo nano /etc/bind/reverse.mydomain.local.db
Ta komenda sprawdzi nam poprawność konfiguracji strefy przeszukiwania do przodu dla naszej domeny.
$ sudo nano /etc/bind/reverse.mydomain.local.db
Ostatnia komenda sprawdzi nam poprawność konfiguracji strefy przeszukiwania wstecznego dla naszej domeny.
Jeżeli komendy te zachowają się tak samo jak na screenie to gratuluję! Wszystko zostało skonfigurowane poprawnie. Jeżeli coś pójdzie nie tak to komendy te poinformują nas gdzie jest błąd i co nim jest.

III. Konfiguracja serwera do świadczenia usług.

Konfiguracja Netplanu

Ostatnim etapem będzie przygotowanie serwera do świadczenia usług DNS-owych. W tym celu musimy dodać w Netplanie do karty LAN adres IP serwera DNS, czyli samego siebie. Wpisujemy zatem polecenie:
$ sudo nano /etc/netplan/00-installer-config.yaml
I dodajemy adres IP 192.168.10.10

Sprawdzanie konfiguracji Netplanu

Sprawdzamy poprawność konfiguracji poleceniami:
$ sudo netplan try
$ sudo netplan apply
Jeśli uzyskamy powyższy efekt, to znaczy, że wszystko jest ok.

Polecenia dig i nslookup

Teraz możemy przetestować działanie serwera DNS korzystając z dwóch poleceń. Pierwsze bardziej zaawansowane, które wchodzi w skład pakietu bind9utils, czyli dig wyświetla nam więcej informacji o danej domenie. Istotna dla nas jest sekcja ANSWER SECTION. Tutaj wyświetlana jest informacja o rekordzie. Znacznie prostszym poleceniem jest nslookup. Wyświetla ono tylko podstawowe informacje. Wpisujemy zatem:
$ dig serwer.mydomain.local
$ nslookup serwer.mydomain.local
UWAGA! Czasem (tak jak u nas) te komendy mogą nie działać. Musimy wtedy do pliku /etc/resolv.conf dopisać nasz serwer DNS.

Konfiguracja pliku /etc/resolv.conf

W związkuz powyższym edytujemy sobie plik /etc/resolv.conf poleceniem:
$ sudo nano /etc/resolv.conf
I zmieniamy adres 127.0.0.53 na 192.168.10.10. Zapisujemy zmiany w pliku i zamykamy go.

Konfiguracja pliku /etc/resolv.conf

Teraz ponownie możemy przetestować działanie serwera DNS korzystając z tych dwóch poleceń. Wpisujemy zatem:
$ dig serwer.mydomain.local
$ nslookup serwer.mydomain.local
I teraz już wszystko działa.

Sprawdzanie serwera DNS

Spróbujemy teraz zapingować na naszego klienta. Najpierw na samą subdomenę (klient1) wpisujemy:
$ ping klient1
Niestety nie działa, ale możemy sprawdzić, czy zadziała na pełną nazwę domenową:
$ ping klient1.mydomain.local
I teraz już otrzymujemy odpowiedż. Możemy wporowadzić małą poprawkę, po to, żeby działało to pierwsze polecenie.

Dodanie domeny do pliku /etc/resolv.conf

Żeby zadziałał ping na samą subdomenę (klient1) musimy wprowadzić nazwę domenową do naszego pliku /etc/resolv.conf. Edytujemy go zatem poleceniem:
$ sudo nano /etc/resolv.conf
I wpisujemy na końcu search mydomain.local, zapisujemy zmiany i zamykamy plik.

Sprawdzanie serwera DNS

Sprawdzamy ponownie ping na samą subdomenę (klient1). I teraz już wszystko działa.

Sprawdzanie serwera DNS

Przechodzimy teraz na klienta i również sprawdzamy poprawność działania serwera DNS. Sytuacja się powtarza, więc ponownie musimy dokonać zmian w pliku /etc/resolv.conf

Konfiguracja pliku /etc/resolv.conf

Edytujemy więc na kliencie plik /etc/resolv.conf znanym już poleceniem:
$ sudo nano /etc/resolv.conf
I wpisujemy adres IP serwera DNS 192.168.10.10 oraz na końcu search mydomain.local, zapisujemy zmiany i zamykamy plik.

Sprawdzanie serwera DNS

Jak widać serwer DNS poprawnie podaje adres IP dla pełnej domeny (serwer.mydomain.local) oraz dla samej subdomeny (serwer). Do tego poprawnie pinguje na serwer korzystając z subdomeny. Jeżeli pamiętacie testy routingu, to nie działało pingowanie do google.pl, gdyż nie było serwera DNS. Teraz już to się zmieniło i jak widać pingi do google.pl też lecą. Jeżeli tak to wszystko wygląda to jest sukces. Jeżeli nie to sprawdzamy po kolei – serwer DNS oraz Routing. Tym akcentem też kończymy ten dokument, a także trylogię najważniejszych serwerów.