====== Domain Name System - odpytywanie serwerów ====== **[[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.#~~ 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ą zwykle z UDP. 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.#~~ 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.#~~ Odpytaj kilka domen o wszystkie rekordy. Jakie typy rekordów głównie widzisz? Czy są to wszystkie rekordy dla tej domeny? 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 _matrix._tcp.matrix.org SRV'' \\ 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.#~~ 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.#~~ 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.#~~ 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.#~~ Wykonaj ręcznie i automatycznie zapytanie iteracyjne dla przykładowej nazwy domenowej Serwery authoritative i caching – przypomnienie ~~Zadanie.#~~ 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? ~~Zadanie.#~~ Znajdź w wynikach ''dig'' informację o tym, czy serwer ustawił flagę ''authoritative answer'' wskazującą że uznaje siebie za serwer authoritative dla wskazanej domeny. 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.#~~ 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'' ==== UDP vs TCP ==== Programy korzystające z systemu DNS zgodnie ze [[https://datatracker.ietf.org/doc/html/rfc1035#section-4.2|standardami]] ograniczają długość wiadomości UDP do 512B. Jeśli wiadomość nie zmieści się w tym limicie, używa się TCP. Użycie TCP w systemie DNS podsumowuje [[https://tools.ietf.org/html/rfc7766|RFC7766]]. ~~Zadanie.#~~ Zapytaj o rekord TXT dla nazwy domenowej ''lenovo.com'' i zobacz w Wiresharku jak wygląda wymiana pakietów. Porównaj ją z wymianą o rekord A dla tego adresu. ==== Przykłady odpowiedzi na zapytania ==== ++++ Przykłady odpowiedzi na zapytania | Przykładowy wynik komendy ''dig'' – ogólny opis sekcji:
$ dig +norecurse bip.put.poznan.pl @sol.put.poznan.pl

; <<>> DiG 9.16.48 <<>> +norecurse bip.put.poznan.pl @sol.put.poznan.pl
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 54420
;; flags: qr aa; QUERY: 1, ANSWER: 1, AUTHORITY: 3, ADDITIONAL: 4

;; QUESTION SECTION:
;bip.put.poznan.pl.             IN      A

;; ANSWER SECTION:
bip.put.poznan.pl.      86400   IN      A       89.191.148.30

;; AUTHORITY SECTION:
put.poznan.pl.          86400   IN      NS      orion.put.poznan.pl.
put.poznan.pl.          86400   IN      NS      sunflower.man.poznan.pl.
put.poznan.pl.          86400   IN      NS      sol.put.poznan.pl.

;; ADDITIONAL SECTION:
sol.put.poznan.pl.      86400   IN      AAAA    2001:808:201::5:11
orion.put.poznan.pl.    86400   IN      AAAA    2001:808:201::5:4
sol.put.poznan.pl.      86400   IN      A       150.254.5.11
orion.put.poznan.pl.    86400   IN      A       150.254.5.4

;; Query time: 57 msec
;; SERVER: 2001:808:201::5:11#53(2001:808:201::5:11)
;; WHEN: Thu Jan  1 01:00:00 CET 1970
;; MSG SIZE  rcvd: 214
Przykładowy wynik komendy ''dig'' – flagi i treść rekordu:
$ dig bip.put.poznan.pl @sol.put.poznan.pl

; <<>> DiG 9.16.48 <<>> bip.put.poznan.pl @sol.put.poznan.pl
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 54144
;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; WARNING: recursion requested but not available

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
;; QUESTION SECTION:
;bip.put.poznan.pl.             IN      A

;; ANSWER SECTION:
bip.put.poznan.pl.      86400   IN      A       89.191.148.30

;; Query time: 48 msec
;; SERVER: 2001:808:201::5:11#53(2001:808:201::5:11)
;; WHEN: Thu Jan  1 01:00:00 CET 1970
;; MSG SIZE  rcvd: 62
Wybór wybranych sekcji z wyników ''dig''
$ dig +norecurse +noall +question bip.put.poznan.pl @sol.put.poznan.pl 
;bip.put.poznan.pl.             IN      A
$ dig +norecurse +noall +answer bip.put.poznan.pl @sol.put.poznan.pl
bip.put.poznan.pl.      86400   IN      A       89.191.148.30
$ dig +norecurse +noall +authority bip.put.poznan.pl @sol.put.poznan.pl
put.poznan.pl.          86400   IN      NS      orion.put.poznan.pl.
put.poznan.pl.          86400   IN      NS      sunflower.man.poznan.pl.
put.poznan.pl.          86400   IN      NS      sol.put.poznan.pl.
$ dig +norecurse +noall +additional bip.put.poznan.pl @sol.put.poznan.pl
sol.put.poznan.pl.      86400   IN      AAAA    2001:808:201::5:11
orion.put.poznan.pl.    86400   IN      AAAA    2001:808:201::5:4
sol.put.poznan.pl.      86400   IN      A       150.254.5.11
orion.put.poznan.pl.    86400   IN      A       150.254.5.4
$ dig +norecurse +noall +question +answer bip.put.poznan.pl @sol.put.poznan.pl
;bip.put.poznan.pl.             IN      A
bip.put.poznan.pl.      86400   IN      A       89.191.148.30
Wysyłanie kilku zapytań naraz
$ dig @sol.put.poznan.pl +norecurse +noall +question +answer www.put.poznan.pl A www.put.poznan.pl AAAA
;www.put.poznan.pl.             IN      A
www.put.poznan.pl.      86400   IN      CNAME   maxine.put.poznan.pl.
maxine.put.poznan.pl.   86400   IN      A       150.254.5.114
;www.put.poznan.pl.             IN      AAAA
www.put.poznan.pl.      86400   IN      CNAME   maxine.put.poznan.pl.
maxine.put.poznan.pl.   86400   IN      AAAA    2001:808:201::5:114
$ dig @1.1.1.1 +noall +answer put.poznan.pl A put.poznan.pl MX put.poznan.pl TXT
put.poznan.pl.          82927   IN      A       150.254.5.114
put.poznan.pl.          78005   IN      MX      0 sargas.put.poznan.pl.
put.poznan.pl.          78005   IN      MX      0 antares.put.poznan.pl.
put.poznan.pl.          86398   IN      TXT     "v=spf1 ip4:150.254.5.18 ip4:150.254.5.16 ip4:150.254.5.15 ip4:150.254.5.14 ip4:150.254.5.28 -all"
(…)
Rekordy używane przez pocztę internetową
$ dig +noall +answer sejm.gov.pl MX
sejm.gov.pl.            3600    IN      MX      10 mx1.sejm.gov.pl.
sejm.gov.pl.            3600    IN      MX      5 mx2.sejm.gov.pl.
$ dig +noall +answer _dmarc.sejm.gov.pl txt
_dmarc.sejm.gov.pl.     3600    IN      TXT     "v=DMARC1; p=reject; aspf=s; adkim=s; rua=mailto:dmarc@sejm.gov.pl; ruf=mailto:dmarc@sejm.gov.pl;fo=1"
$ dig +noall +answer put.poznan.pl TXT
put.poznan.pl.          86398   IN      TXT     "v=spf1 ip4:150.254.5.18 ip4:150.254.5.16 ip4:150.254.5.15 ip4:150.254.5.14 ip4:150.254.5.28 -all"
$ cat mail.eml
(…)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=github.com;
	s=smtpapi; bh=…
(…)
$ dig +short smtpapi._domainkey.github.com txt
"k=rsa; t=s; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDPtW5iwpXVPiH5FzJ7Nrl8USzuY9zqqzjE0D1r04xDN6qwziDnmgcFNNfMewVKN2D1O+2J9N14hRprzByFwfQW76yojh54Xu3uSbQ3JP0A7k8o8GutRF8zbFUA8n0ZH2y0cIEjMliXY4W4LwPA7m4q0ObmvSjhd63O9d8z1XkUBwIDAQAB"
Odwzorowania odwrotne ("IP" na nazwę domenową)
$ dig +noall +answer -x 150.254.5.15
15.5.254.150.in-addr.arpa. 86390 IN     PTR     mercury.put.poznan.pl.
$ dig +noall +answer -x 2001:808:201::5:29
9.2.0.0.5.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.1.0.2.0.8.0.8.0.1.0.0.2.ip6.arpa. 86249 IN PTR kerio.put.poznan.pl.
TTL – czas przez jaki rekord jest jeszcze ważny (i może być trzymany w cache'u)
$ for S in 1.0.0.1 ordns.he.net bilbo.nask.org.pl; do dig +noall +answer @$S nask.pl A; done
nask.pl.                22      IN      A       45.60.74.15
nask.pl.                579     IN      A       45.60.74.15
nask.pl.                600     IN      A       45.60.74.15
Serwery cache mogą być skonfigurowane tak, by nie odpowiadać na wybrane nazwy domenowe bądź zmieniać treść odpowiedzi na wybrane nazwy domenowe; np. dla walki z niepłaceniem podatków od gier hazardowych czy blokowania reklam:
$ dig +noall +answer @dns.google  casino.com
casino.com.             120     IN      A       159.203.128.199
$ dig +noall +answer @dns.tpsa.pl casino.com
casino.com.             0       IN      A       145.237.235.240

$ dig +noall +answer @dns.google                 tpc.googlesyndication.com
tpc.googlesyndication.com. 30   IN      A       216.58.215.65
$ dig +noall +answer @dns.adguard-dns.com        tpc.googlesyndication.com
tpc.googlesyndication.com. 3600 IN      A       0.0.0.0
$ dig +noall +comments @adblock.dns.mullvad.net  tpc.googlesyndication.com
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: REFUSED, id: 49888
;; flags: qr rd; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 1
++++