====== Domain Name System ====== **[[http://www.cs.put.poznan.pl/ddwornikowski/sieci/sieci2/dns.html]]** ** //Przygotowanie do laboratoriów w salach 1.6.16 / 1.6.18// ** \\ Na początku zajęć pobierz skrypt {{:sk2:dns_lab_setup.sh|}} i wykonaj go z uprawnieniami roota, podając jako argument adres IP podany przez prowadzącego. ===== FQDN ===== Nazwa domenowa [[https://en.wikipedia.org/wiki/Domain_name|[2]]] \\ Budowa nazwy domenowej: [[https://pl.wikipedia.org/wiki/Domena_internetowa#/media/File:Dns-schemat.svg|struktura drzewiasta]], [[https://en.wikipedia.org/wiki/DNS_root_zone|korzeń]]. \\ Top Level Domain [[https://en.wikipedia.org/wiki/Top-level_domain|[3]]], [[http://www.iana.org/domains/root/db|lista]]     (do 2012r istniały tylko [[https://pl.wikipedia.org/wiki/Domena_funkcjonalna|funkcjonalne]] i [[https://pl.wikipedia.org/wiki/Krajowa_domena_najwy%C5%BCszego_poziomu|krajowe]] domeny, teraz mogą też funkcjonować [[https://en.wikipedia.org/wiki/Generic_top-level_domain|prawie dowolne]]) \\ Fully qualified domain name – pełna nazwa domenowa [[https://en.wikipedia.org/wiki/Fully_qualified_domain_name|[1]]] //Zadanie 1.// Porównaj wynik poniższych poleceń: $ ping -c1 lab-net-1 $ ping -c1 lab-net-1.cs.put.poznan.pl ===== Role serwerów DNS ===== Serwery nazw można podzielić ze względu na pełnione zadanie na: * root servers [[https://en.wikipedia.org/wiki/Root_name_server|[1]]] – odpowiadają za TLD; odpowiadają tylko na pytania o TLD * authoritative servers [[https://en.wikipedia.org/wiki/Name_server#Authoritative_name_server|[2]]] – wpisywane do serwerów nazw nadrzędnej domeny serwery odpowiedzialne za rozgłoszenie domeny w sieci; odpowiadają na pytania o swoją domenę * caching name servers [[https://en.wikipedia.org/wiki/Name_server#Caching_name_server|[3]]] – serwery zbierające informacje z powyższych, przeznaczone dla użytkowników końcowych (zwane czasem //public DNS//) ===== Drzewo DNS a serwery DNS ===== {{:sk2:dns.svg|}} ===== Zapytania DNS ===== Klienci odpytujący DNS korzystają z UDP((z pewnymi wyjątkami podsumowanymi w [[https://tools.ietf.org/html/rfc7766|RFC7766]])) Do odpytywania serwerów DNS można używać np. komend: * ''host'' (uwaga, różne wersje: [[http://www.isc.org/software/bind|[1]]] [[http://www.weird.com/~woods/projects/host.html|[2]]] ) * ''dig -h'' * ''nslookup'' (zacznij od przeczytania ''man nslookup'') * ''dnstracer'' (pozwala przejść całe drzewo DFSem, np: ''dnstracer -c -o -s . assets.publishing.service.gov.uk.'' ) //Zadanie 2.// Przetestuj poniższe zapytania: host lab-net-1.cs.put.poznan.pl host lab-net-1.cs.put.poznan.pl. host lab-net-1 dig +noall +answer lab-net-1.cs.put.poznan.pl dig lab-net-1.cs.put.poznan.pl dig +short lab-net-1.cs.put.poznan.pl dig www.cs.put.edu.pl dig wp.pl host wp.pl ==== Rodzaje rekordów ==== Wybór typu rekordu: * ''host -t //typ// //nazwa_domenowa//'' np: \\ ''host -t MX put.poznan.pl'' * ''dig //nazwa_domenowa// //typ//'' np: \\ ''dig put.poznan.pl AAAA'' Pytanie o "wszystkie" rekordy: * ''host -a [-v] //nazwa_domenowa//'' * ''dig //nazwa_domenowa// any'' //Zadanie 3.// Odpytaj kilka domen o wszystkie rekordy. Jakie typy rekordów głównie widzisz? Ważniejsze typy rekordów: | A | Adres IPv4 | | AAAA | Adres IPv6 | | NS | Serwer nazw | | SOA | Start of Authority (omówione dokładniej przy konfiguracji serwera DNS) | | MX | Serwer odbierający pocztę dla domeny ( ++ np. | \\ ''host -t mx ngo.pl''     /     ''dig ngo.pl mx'' ++ ) | | CNAME| Alias na inną nazwę domenową ( ++ np. | \\ ''host -t cname %%www.cs.put.edu.pl%%'' \\ ''dig unixlab.cs.put.poznan.pl cname'' ++ ) | | TXT | Dowolny tekst (dosłownie dowolny). \\ Używany np. na potrzeby mechanizmów walki ze spamem – [[https://en.wikipedia.org/wiki/Sender_Policy_Framework|SPF]], [[https://en.wikipedia.org/wiki/DomainKeys_Identified_Mail|DKIM]] i [[https://dmarc.org/overview/|DMARC]]) ( ++ przykłady: | \\ Cokolwiek: ''dig akamai.net txt'' \\ Cokolwiek: ''host -t txt lenovo.com'' \\ SPF: ''dig student.put.poznan.pl txt'' \\ DKIM: ''host -t txt dkim1024._domainkey.allegro.pl'' \\ DMARC: ''dig +noall +answer _dmarc.um.poznan.pl txt'' ++ ) | | SRV | Host i port usługi, ( ++ np. | \\ dla klientów [[https://matrix.org/|matrixa]]: ''dig -t SRV _matrix._tcp.matrix.org'' \\ dla klientów minecrafta: ''host -t srv _minecraft._tcp.cubecraft.net'' \\ w domenie AD: https://technet.microsoft.com/en-us/library/cc961719.aspx ++ ) | | PTR | Nazwa domenowa (patrz niżej) | Pozostałe: https://en.wikipedia.org/wiki/List_of_DNS_record_types //Zadanie 4a.// Wykonaj zapytania o odwzorowanie odwrotne: host 150.254.30.43 dig -x 150.254.30.43 dig @8.8.8.8 -x 150.254.30.43 host -t ptr 43.30.254.150.in-addr.arpa dig 43.30.254.150.in-addr.arpa ptr //Zadanie 4b.// Zadaj zapytania odwrotne o adres IPv6. Jaka domena jest użyta?
// „Żeby dowiedzieć się jaki IP ma ''home.cern'', zapytam się root serwera gdzie jest serwer nazw dla ''cern''. Serwer nazw jest pod adresem ''a2.nic.cern'', więc żeby dowiedzieć się, gdzie jest ''a2.nic.cern'', zapytam się root serwera gdzie jest serwer nazw dla ''cern''…“ //
Błędne koło? Jeśli NS jest w tej samej domenie, którą rozwiązuje, to razem z rekordem NS w nadrzędnym serwerze nazw musi być też rekord A lub AAAA tzw. [[https://en.wikipedia.org/wiki/Domain_Name_System#Circular_dependencies_and_glue_records|glue record]] //Zadanie 5.// Sprawdź jak wygląda wynik komendy: ''dig nask.pl @a-dns.pl''. Które rekordy to glue records? ==== Kogo pytamy? ==== System operacyjny Linux używa serwera DNS skonfigurowanego w pliku ''/etc/resolv.conf''. Dokumentacja możliwych wpisów w tym pliku: ''man resolv.conf'' Ręczne wybranie serwera: * ''host //name// //server//'', np: \\ ''host pl.wikipedia.org dns.tpsa.pl'' \\ ''host pl.wikipedia.org one.one.one.one'' * ''dig @//server// //name//'', np: \\ ''dig @dns.tpsa.pl pl.wikipedia.org'' \\ ''dig @one.one.one.one pl.wikipedia.org'' Rodzaje zapytań [[http://www.cs.put.poznan.pl/ddwornikowski/sieci/sieci2/dns.html#rodzaje-zapytan|[1]]]: * iteracyjne * automatycznie: \\ ''dig //nazwa// +trace'' * ręcznie krok po kroku, np. dla cs.put.poznan.pl: \\ ''dig @a.root-servers.net cs.put.poznan.pl'' \\ ''dig @a-dns.pl cs.put.poznan.pl'' \\ ''………'' * rekurencyjne (domyślne) \\ ''dig //nazwa// +recurse'' Przykładowe adresy publicznych serwerów DNS: * ''8.8.8.8'' oraz ''8.8.4.4'' [[https://en.wikipedia.org/wiki/Google_Public_DNS|Google Public DNS]] * ''1.1.1.1'' oraz ''1.0.0.1'' [[https://en.wikipedia.org/wiki/1.1.1.1|Cloudflare DNS]] * ''9.9.9.9'' [[https://en.wikipedia.org/wiki/Quad9|IBM (Quad9)]] * dłuższa lista: [[https://en.wikipedia.org/wiki/Public_recursive_name_server]] //Zadanie 6.// Wykonaj zapytanie iteracyjne dla przykładowej nazwy domenowej Serwery authoritative i caching – przypomnienie //Zadanie 7a.// Porównaj odpytanie o stronę **//poznan.pl//** programem ''dig'' następujących serwerów DNS: \\      ''cns1a.atman.pl''     ''ordns.he.net''     ''bilbo.nask.org.pl'' \\ Co oznacza druga kolumna wyników? Czym różnią się flagi odpowiedzi? Bezpieczeństwo: * Problem: [[https://en.wikipedia.org/wiki/DNS_spoofing|DNS spoofing]] * Powszechnie przyjęte rozwiązanie: [[https://en.wikipedia.org/wiki/Domain_Name_System_Security_Extensions|DNSSEC]] Prywatność: * Problem: zapytania DNS są wysyłane otwartym tekstem * Brak powszechnych rozwiązań * Zaproponowano: DNS over {TLS,HTTPS,QUIC,SSH}, dnscrypt, … //Zadanie 7b.// Porównaj wynik zapytania o adres dowolnej strony z listy: https://hazard.mf.gov.pl/ pytając poniższe serwery DNS: \\     ''1.0.0.1''     ''ordns.he.net''    ''dns.tpsa.pl''    ''netia-dns1.inetia.pl'' ===== Konfiguracja DNS ===== Rodzaje serwerów – master (primary), slave (secondary) W trakcie laboratoriów jest używany serwer DNS [[https://www.isc.org/bind/|BIND]] w wersji 9 którego rozwój dba [[https://en.wikipedia.org/wiki/Internet_Systems_Consortium|ISC]]. \\ BIND9 pozwala tworzyć zarówno serwery authoritative jak i caching (i serwery pełniące obie role naraz, co zwykle jest odradzane). \\ Standardowa nazwa głównego programu BIND to ''named'' (od //name daemon//). Inne popularne authoritative DNS to [[https://www.nlnetlabs.nl/projects/nsd|NSD]] i [[https://www.knot-dns.cz/|Knot DNS]]. \\ Inne popularne caching DNS to [[https://www.nlnetlabs.nl/projects/unbound/about/|Unbound]] czy [[https://pl.wikipedia.org/wiki/Dnsmasq|dnsmasq]] (który łączy w sobie serwer DNS i DHCP). Format [[https://en.wikipedia.org/wiki/Zone_file|plików stref]] (zone files) opisujących informacje znajdujące się w DNS (a pochodzący z BIND) stał się standardem używanym do konfiguracji rekordów DNS w większości serwerów DNS. ==== Caching server ==== //Zadanie 8.// - Pobierz plik {{bind9-caching-server.conf}} z (prawie) minimalną konfiguracją serwera cache'ującego - Dodaj wszystkim uprawnienia do zapisu w katalogu w którym znajduje się plik (np. ''chmod a+w .'') - Uruchom serwer DNS z tą konfiguracja komendą: \\ ''named -4 -g -c bind9-caching-server.conf'' - Odpytaj serwer DNS o wybrane domeny – wykonane zapytania pownny zostać zalogowane na wyjściu serwera Sensowniejszy przykład takiej konfiguracji jest np. [[https://bind9.readthedocs.io/en/stable/configuration.html#a-caching-only-name-server|tutaj]]. ==== Authoritative server ==== **Uwaga:** przedstawione tutaj konfiguracje w wielu miejscach nie przestrzegają dobrych praktyk i zaleceń dotyczących konfigurowania serwerów DNS – zostało to zrobione celowo dla skrócenia plików konfiguracyjnych, trzymania wszystkich plików w jednym miejscu, poprawienia czytelności, skróceniu czasów do mieszczących się w trakcie zajęć et cetera. //Zadanie 9a.// - Pobierz i rozpakuj konfigurację demonstracyjną {{bind9-durna-konfiguracja.tar.gz}} - Nadaj prawa do zapisu w katalogu w którym ją rozpakowałeś i ją uruchom poleceniem: \\ ''named -g -c durna-konfiguracja.conf'' - Przejrzyj pliki konfiguracyjne i odpytaj serwer o wszystkie zawarte w niej rekordy. //Zadanie 9b.// - Sprawdź czy w systemie istnieje plik ''/etc/rndc.key''; jeśli nie, wykonaj komendę ''rndc-confgen -a'' - Pobierz, rozpakuj i uruchom trochę lepszą konfigurację: {{bind9-kiepska-konfiguracja.tar.gz}} - Konfiguracja zawiera te same rekordy co w zadaniu 9a. Porównaj wpisy w plikach stref z zadania 9a i 9b. - Zmień plik strefy (nie wyłączając serwera). - Nakaż (z osobnej konsoli) odświeżenie strefy poleceniem: \\ ''rndc reload example.com'' - Sprawdź czy zmiany zostały wczytane. Do sprawdzenia konfiguracji serwera możesz wykonać komendę: \\ ''named-checkconf sciezka/do/pliku.conf'' \\ natomiast do sprawdzenia pliku strefy: \\ ''named-checkzone example.com sciezka/do/pliku/example.com.zone'' //Zadanie 10.// (zadanie wykonaj w parach) - Pobierzcie i rozpakujcie {{bind9-dwaserwery.tar.gz}} - W pliku konfiguracyjnym slave'a należy poprawić adres IP mastera - Jedna osoba uruchamia serwer master (plik ''dwaserwery-master.conf''), \\ druga osoba uruchamia serwer slave (plik ''dwaserwery-slave.conf'') - Zaobserwujcie co pojawia się w konsoli - Zmień plik strefy u mastera i nakaż (z osobnej konsoli) odświeżenie strefy poleceniem ''rndc reload example.com'' - Sprawdź czy zmiany zostały wczytane na masterze i na slave //Zadanie 11.// Dodaj nową domenę do konfiguracji serwera i stwórz plik strefy dla tej domeny. \\ Do pliku strefy dodaj kolejno przykładowe wpisy AAAA, TXT i MX (wzorując się na przykładowych wynikach ''dig'') ==== Dłuższa konfiguracja ==== Dłuższe materiały o konfiguracji DNS są [[dns_config_old|tutaj]]. ==== Zone transfer ==== Serwery slave ściągają kompletny plik strefy od serwerów master wykonując tzw. **zone transfer** [[https://en.wikipedia.org/wiki/DNS_zone_transfer|[1]]], czyli zapytanie AXFR. \\ Wymiana danych między serwerem master a serwerem slave (zone transfer) wykorzystuje TCP //Zadanie 12.// Wykonaj zone transfer dla domeny [[https://digi.ninja/projects/zonetransferme.php|zonetransfer.me]] i porównaj wyniki z zapytaniem o wszystkie rekordy: * zone transfer: \\ ''host -al zonetransfer.me nsztm1.digi.ninja'' \\ ''dig @nsztm1.digi.ninja zonetransfer.me axfr'' * pytanie o wszystkie rekordy: \\ ''host -a zonetransfer.me nsztm1.digi.ninja'' \\ ''dig @nsztm1.digi.ninja zonetransfer.me any'' ==== Worek linków ==== * [[http://www.cs.put.poznan.pl/ddwornikowski/sieci/sieci2/dns.html#serwer-dns]] * [[https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/6/html/deployment_guide/s1-bind]] \\ [[https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/6/html/deployment_guide/s2-bind-zone]] * [[https://bind9.readthedocs.io/en/latest/index.html]]