=== DNS === Wprowadzenie ------------ Adres IP nie jest jedynym typem adresacji komputera w sieci Internet. Komputer można bowiem adresować (na poziomie warstwy aplikacji) również przez nazwę. Ludziom dużo łatwiej jest operować na zrozumiałych nazwach, niż na nieczytelnych adresach numerycznych. Z drugiej strony, komputery preferują liczby. Dlatego aby adresy numeryczne mogły współistnieć z nazwami komputerów, należy umożliwić odwzorowywanie adresów z jednej postaci w drugą. Zadanie to wykonuje system DNS (ang. *Domain Name System*). Usługa DNS operuje w warstwie aplikacji modelu OSI; została opisana w dokumentach :rfc:`1034` oraz :rfc:`1035`. Model systemu ------------- Nazwa komputera musi mieć specjalną postać, by można było ją odwzorować w adres IP. Postać ta wynika z przyjętego w systemie DNS modelu, zgodnego z ogólnym modelem klient-serwer. Elementami modelu DNS są: domena, serwer DNS oraz klient. Ilustrację modelu DNS zawiera poniższy rysunek: .. _Rys. 1: .. figure:: img/dns1.png :align: center :width: 700px Rys.1. Idea systemu DNS Przestrzeń nazw domenowych w systemie DNS rozpięta jest na strukturze drzewa. Jego korzeń tworzy domena `.`. Dalej, hierachicznie znajdują się domeny najwyższego poziomu (ang. TLD, *top level domain*), np. `com`, `org` czy domeny krajowe. Każda domena ze swoimi ewentualnymi poddomenami tworzy tzw. strefę DNS (ang. *DNS zone*), która jest zarządzana przez jakąś organizację. W ten sposób, zarządzanie całą przestrzenią nazw wydelegowane jest do wielu organizacji. Nazwę domeny (od lewej do prawej strony) tworzą nazwy kolejnych naddomen (stref), oddzielone od siebie kropką. Pełna nazwa komputera zaś posiada dodatkowo na początku identyfikator komputera. Na przykład, komputer o identyfikatorze lupus w domenie abc.com ma nazwę lupus.abc.com. Każda domena posiada swój serwer, przy czym kilka domen może być obsługiwanych przez jeden serwer. Ponadto każda domena ma swojego właściciela i jest przez niego administrowana. W związku z tym aby utworzyć własną domenę, należy ją zarejestrować u właściciela naddomeny (i najczęściej za to zapłacić). Od strony technicznej rejestracja w gruncie rzeczy polega na zapamiętaniu w serwerze naddomeny adresu i nazwy serwera tworzonej domeny. .. note:: Serwer danej domeny musi znać lokalizację serwerów wszystkich jej poddomen – jest to jedno z ważniejszych założeń systemu DNS. Przykładowo, chcąc utworzyć nową domenę `def` w domenie com, należy najpierw oficjalnie wystąpić do administratora domeny com o rejestrację nowej domeny. Ponadto, domena `def.com` musi mieć swój serwer, a jego adres i nazwa zostanie zapamiętana w serwerze domeny com. Format nazwy domenowej: ~~~~~~~~~~~~~~~~~~~~~~ * element nazwy najbardziej z prawej strony oznacza domenę TLD, np. dla domeny `www.put.poznan.pl`, domeną TLD jest `pl` * hierarchię nazw domenowych odczytujemy od **prawej** strony, np. `poznan.pl` jest poddomeną `pl`. * każdy element nazwy domenowej może zawierać 63 znaki, pełna nazwa nie może przekraczać 253 znaków System DNS zezwala także na używanie znaków spoza ASCII w nazwach domenowych, dzięki temu możliwe jest np. istnienie domeny takiej jak `żółw.pl `_ czy `http://яндекс.рф `_ Serwer DNS jednakże zapisuje tę nazwę w specjalnym zakodowanym formacie, dla żółw.pl - `xn--w-uga1v8h.pl`. Typy serwerów DNS ~~~~~~~~~~~~~~~~~ W systemie DNS wyróżnia się dwa główne typy serwerów: * **serwery domeny głównej** (ang. *root servers*) – są to serwery znajdujące się na samym szczycie hierarchii modelu. Obecnie istnieje na świecie około 13 serwerów domeny głównej, z których większość znajduje się w Stanach Zjednoczonych; * **serwery autorytatywne** (ang. *authoritative servers*) – serwerem autorytatywnym danej domeny jest ten, który zawsze posiada aktualne informacje na temat komputerów w tej domenie. Najczęściej serwerem autorytatywnym danej domeny jest jej lokalny serwer. Aby jednak zwiększyć niezawodność systemu, zaleca się, by dla każdej domeny istniały co najmniej dwa serwery autorytatywne. Klienci DNS ~~~~~~~~~~~ Klientami systemu DNS są komputery oraz inne serwery DNS, klient DNS w systemie operacyjnym, zajmujący się rozwiązaniem nazwy (odpytaniem DNS) nazywa się resolwerem (ang. *resolver*). Każdy system operacyjny ma wbudowany resolwer, który do działania potrzebuje adresu najbliższego serwera DNS. Adres ten wpisujemy, gdy konfigurujemy adres IP ręcznie lub jest on dostarczany przez serwer `DHCP `_. W systemie Linux, konfigurację resolwera dokonuje się poprzez wpis w pliku :file:`/etc/resolv.conf`. .. code-block:: c nameserver 8.8.8.8 Taki zapis mówi resolwerowi, żeby w pierwszej kolejności odpytywał serwer DNS firmy Google (8.8.8.8) Rodzaje zapytań ~~~~~~~~~~~~~~~ Zapytanie DNS ma na celu znalezienie odwzorowania nazwy domenowej w adres IP (lub odwrotnego). Istnieją dwa rodzaje zapytań DNS – iteracyjne i rekurencyjne. Zasadę działania zapytania iteracyjnego ilustruje poniższy rysunek: .. figure:: img/dns2.png :align: center :width: 700px Rys.2. Idea zapytania iteracyjnego Na rysunku celowo pominięte zostały serwery Spn.pl oraz Spl, aby ilustracja odpowiadała rzeczywistości. Serwer lokalny, nie znając odwzorowania, odwołuje się od razu do serwera domeny głównej. Kolejne kroki odwzorowywania nazwy lupus.abc.com w adres IP (patrz rysunek): 1. Jaki jest adres IP komputera o nazwie lupus.abc.com? 2. Jaki jest adres IP komputera o nazwie lupus.abc.com? 3. Nie wiem, ale zapytaj serwer domeny .com. 4. Jaki jest adres IP komputera o nazwie lupus.abc.com? 5. Nie wiem ale zapytaj serwer domeny abc.com. 6. Jaki jest adres IP komputera o nazwie lupus.abc.com? 7. Odpowiedź: 1.1.1.1 8. Odpowiedź: 1.1.1.1 Zasadę działania zapytania rekurencyjnego przedstawia poniższy rysunek: .. figure:: img/dns3.png :align: center :width: 700px Rys.2. Idea zapytania rekurencyjnego Kolejne kroki odwzorowywania nazwy lupus.abc.com w adres IP (patrz rysunek): 1. Jaki jest adres IP komputera o nazwie lupus.abc.com? 2. Jaki jest adres IP komputera o nazwie lupus.abc.com? 3. Jaki jest adres IP komputera o nazwie lupus.abc.com? 4. Jaki jest adres IP komputera o nazwie lupus.abc.com? 5. Jaki jest adres IP komputera o nazwie lupus.abc.com? 6. Jaki jest adres IP komputera o nazwie lupus.abc.com? 7. Odpowiedź: 1.1.1.1 8. Odpowiedź: 1.1.1.1 9. Odpowiedź: 1.1.1.1 10. Odpowiedź: 1.1.1.1 11. Odpowiedź: 1.1.1.1 12. Odpowiedź: 1.1.1.1 Należy zaznaczyć, że powyższy rysunek służy wyłącznie jako ilustracja koncepcji zapytań rekurencyjnych. W rzeczywistości serwery łączą obydwa rodzaje zapytań. Jeżeli serwer lokalny domeny nie posiada odwzorowania, wysyła zapytanie do jednego z serwerów domeny głównej. Jeśli ten nie odpowiada, pytany jest kolejny serwer domeny głównej, i tak dalej. Serwery domeny głównej są więc odpytywane w sposób iteracyjny. Reszta zapytań zaś ma najczęściej charakter rekurencyjny. Wykonywanie zapytań rekurencyjnych pozwala wszystkim uczestniczącym serwerom zapamiętać odwzorowanie (ang. *DNS caching*), co podnosi efektywności systemu. Jak już wspomniano, system DNS umożliwia również wykonywanie zapytań odwrotnych, znajdujących nazwę komputera o znanym adresie IP. W praktyce, aby ogranicznyć ruch DNS w sieci Internet, wiele serwerów nieautorytatywnych dla danej domeny, odpowiada bezpośrednio z pamięci podręcznej. Rekordy zasobowe DNS ~~~~~~~~~~~~~~~~~~~~ Opis domeny dokonywany jest przy użyciu tzw. rekordów zasobowych DNS (ang. *DNS resource records*). Do najważniejszych z nich należą: * **SOA** (ang. *Start Of Authority*) - wskazuje, że dany serwer jest najlepszym źródłem informacji o domenie oraz definiuje zachowanie serwerów głównych (ang. *primary DNS*) oraz zapasowaych (ang. *secondary DNS*); rekord SOA jest obecny jako pierwszy rekord w każdym pliku strefowym (opisującym domenę) * **A** - zawiera odwzorowanie nazwy domenowej w adres IP * **NS** - określa nazwę komputera będącego serwerem DNS dla tej domeny. * **CNAME** (ang. *canonical name*) - pozwala stworzyć "alias" dla już istniejącej nazwy domenowej * **MX** (*mail exchange*) - określa nazwę komputera będącego serwerem poczty elektronicznej w danej domenie. Serwery SMTP odczytują jego wartość żeby wiedzieć, który komputer obsługuje pocztę dla domeny. * **SRV** - zawiera dodatkowe informacje dotyczące lokalizacji usługi, którą wskazuje serwer DNS, rekord SRV używany jest np. przez usługi VoIP, protokół XMPP, LDAP, czy nawet grę Minecraft. * **TXT** - rekord pozwala na wpisanie dowolnego tekstu, używany głównie przez usługę SPF do walki ze spamem (:command:`host -t txt wp.pl`) * **PTR** - definiuje odwzorowanie odwrotne (ang. *reverse DNS*) adresu IP na nazwę domenową * **AAAA** - to samo co rekord A, ale dla adresów IPv6 To właśnie wartości rekordów zasobowych przesyłane są w zapytaniach i odpowiedziach DNS. Na przykład serwer poczty elektronicznej odczytuje wartości rekordów MX, z kolei serwer DNS – najczęściej wartości rekordów A i NS. Narzędzia klienckie systemu Linux --------------------------------- System Linux dysponuje zestawem narzędzi, które pozwalają diagnozować i testować system DNS. Do najważniejszych z nich należy komenda :command:`dig` z pakietu `bind` (:linuxman:`dig(1)`) oraz :command:`host` z pakietu `dnstools` (:linuxman:`host(1)`). Jak wspomniano wyżej, ustawienie domyślnego DNS do odpytywania w systemie Linux można ustawić w pliku :file:`/etc/resolv.conf` (:linuxman:`resolv.conf(5)`) Serwer DNS ---------- Istnieje `wiele implementacji `_ serwera DNS dla systemów z rodziny UNIX, takich jak BIND, Powerdns, djbdns, MaraDNS. BIND ~~~~ BIND (ang. *Berkeley Internet Name Domain*) jest de facto standardową implementacją serwera DNS. Aktualna wersja BIND to wersja 9, powinna być dostępna po zainstalowaniu pakietu `bind9`. BIND używa jednego głównego pliku konfiguracyjnego serwera, który przeważnie nazywa się :file:`/etc/named.conf`. W pliku tym podawane są ogólne opcje serwera oraz definicje stref DNS. .. code-block:: apache options { directory "/var/lib/named"; notify no; } # plik opisujący domenę główną zone "." in { # wskazówki type hint; file "root.hint"; }; zone "localhost" in { type master; file "localhost.zone"; }; zone "0.0.127.in-addr.arpa" in { type master; file "127.0.0.zone"; }; Przykładowy plik strefy dla domeny example.com z różnymi rekordami. .. code-block:: apache $TTL 1M example.com. IN SOA example.com. root( 1 ;serial 2M ;refresh 4M ;retry 6M ;expiry 1M ;minimum ) @ IN NS ns1 ns1 IN A 192.168.1.2 host1 IN A 192.168.1.3 host2 IN A 192.168.1.4 kot IN CNAME host1 mail IN MX 10 host1 mail IN MX 100 host2 Powyższa definicja strefy dla domeny example.com określa 6 rekordów zasobowych. Rekord SOA dodatkowo definiuje opcje odświeżania, wygasania oraz numer wersji strefy. Wpisy bez kropki domyślnie rozszerzane są o nazwę strefy - `example.com.`. Notacja `@` jest skrótem na nazwe strefy, zatem `@` = `example.com.`. Niektóre rekordy mają także możliwość podania priortetu, w przypadku powyższej strefy rekord MX z priorytetem 10 jest nadrzędny do tego z prioytetem 100. Parametr `$TTL` określa jak długo serwery DNS odczytujące plik strefowy mają go zapamiętać, w laboratorium parametr ten najlepiej ustawić na 1 minutę (`$TTL 1M`). .. note:: Przy każdej zmianie strefy należy inkrementować pole `serial`, w przeciwnym wypadku serwer BIND nie załaduje nowej definicji strefy! Ćwiczenia --------- 1. Korzystając z komend :command:`dig` oraz :command:`host`, sprawdź rekordy dla popularnych domen, np. google.com, wp.pl, talk.google.com. 2. Skonfiguruj serwer BIND ze strefą example.com. Wydziel w tej strefie poddomenę sub.example.com i wydeleguj na inny komputer z serwerem BIND. Nowa poddomena powinna zawierać także wpis `host` wskazujący na adres komputera. Skonfiguruj komputery aby używały nowych serwerów DNS i przetestuj konfigurację.