Analýza DNS programem dig

Z Milan Kerslager
Přejít na: navigace, hledání

Program dig je nástroj pro ruční kladení otázek DNS serverům. Může dobře posloužit pro zjištění chyb, ale i k prostému nahlédnutí "pod pokličku" DNS. V distribuci Fedora a Red Hat Enterprise Linux ho najdete v balíčku bind-utils. Program dig je nástupcem programu nslookup (který není již dále vyvíjen a nejsou v něm ani opravovány známé chyby).

Tučně psaný text v příkladech vkládá uživatel, výzva systému (shell) je zde vidět jako znak dolar ($). Ostatní text je výstup programu tak, jak ho uživatel mohl vidět.

Převod jména na IP adresu

Při převodu jména na IP adresu zadáme požadované DNS jméno programu dig jako parametr:

$ dig ftp.pslib.cz

; <<>> DiG 9.2.1 <<>> ftp.pslib.cz
;; global options:  printcmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 18216
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 3, ADDITIONAL: 2

;; QUESTION SECTION:
;ftp.pslib.cz.                  IN      A

;; ANSWER SECTION:
ftp.pslib.cz.           86400   IN      CNAME   neptun.pslib.cz.
neptun.pslib.cz.        86400   IN      A       195.113.159.1

;; AUTHORITY SECTION:
pslib.cz.               86400   IN      NS      neptun.pslib.cz.
pslib.cz.               86400   IN      NS      semiramis.sslib.cz.
pslib.cz.               86400   IN      NS      ns.ces.net.

;; ADDITIONAL SECTION:
ns.ces.net.             82485   IN      A       195.113.144.233
semiramis.sslib.cz.     83745   IN      A       195.113.167.1

;; Query time: 2 msec
;; SERVER: 195.113.159.1#53(195.113.159.1)
;; WHEN: Thu Oct 10 14:43:16 2002
;; MSG SIZE  rcvd: 167

V příkladu je vidět, že odpověď byla autoritativní (tj. pochází od primárního nebo od sekundárního serveru domény, na kterou se ptáme). Autoritativní odpověď je indikována příznakem (flag) aa na 5. řádku výstupu. To znamená, že DNS server má danou informaci uvedenou v definici domény na svém pevném disku. Pokud bychom se ptali na jiné jméno, server by poskytl neautoritativní odpověď, protože informaci získá někde jinde. Neautoritativní odpovědi jsou uchovávány v cache (v paměti) DNS serveru, který odpověď získal. Informace je uložena v cache jen tak dlouho, jak to dovolí správce dané domény. Zbývající čas je pak uveden před klíčovým slovem IN (zde je z důvodu autoritativní odpovědi trvale hodnota 86400).

Dále výstup obsahuje sekci s odpovědí (ANSWER SECTION). Z výstupu je vidět, že ftp.pslib.cz není vlastní jméno počítače, ale že je to je přezdívka (CNAME). Tato přezdívka ukazuje na reálné jméno počítače (zde neptun.pslib.cz). Na dalším řádku je pak uveden A záznam pro tento počítač (tj. jeho IP adresa).

Sekce AUTHORITY SECTION ukazuje seznam DNS serverů, které jsou autoritativní pro tuto doménu (tj. jeden z nich bude zřejmě primární a ostatní budou sekundární). Sekundární i primární DNS servery poskytují rovnocenné odpovědi a z hlediska uživatele mezi nimi není rozdíl. Z hlediska jejich správce je primární server nositelem databáze (dělají se zde tedy změny v definici domény) a sekundární servery jsou záložní. Sekundární servery si kopírují definici domény z primárního DNS serveru automaticky pomocí příkazu AXFR (jak bude uvedeno dále).

Poslední sekcí výstupu je ADDITIONAL SECTION. Zde jsou uvedeny upřesňující informace, zde konkrétně IP adresy DNS serverů. Můžete si povšimnout, že zbývající doba trvanlivosti informace uložené v cache DNS serveru je nižší. Při opakování dotazu je pak vidět, jak dále klesá.

Převod IP adresy na jméno

Pro zpětný převod je potřeba použít parametr -x. Tento parametr zajistí automatický přepis IP adresy do reverzního zápisu v doméně in-addr.arpa. Všimněte si, že odpověď už není autoritativní (chybí příznak aa, který byl vidět v předchozím příkladu).

$ dig -x 147.230.16.8

; <<>> DiG 9.2.1 <<>> -x 147.230.16.8
;; global options:  printcmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 14640
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 2

;; QUESTION SECTION:
;8.16.230.147.in-addr.arpa.     IN      PTR

;; ANSWER SECTION:
8.16.230.147.in-addr.arpa. 86400 IN     PTR     obelix.tul.cz.

;; AUTHORITY SECTION:
230.147.in-addr.arpa.   86400   IN      NS      ns.ces.net.
230.147.in-addr.arpa.   86400   IN      NS      bubo.tul.cz.

;; ADDITIONAL SECTION:
ns.ces.net.             79871   IN      A       195.113.144.233
bubo.tul.cz.            86229   IN      A       147.230.16.1

;; Query time: 5 msec
;; SERVER: 195.113.159.1#53(195.113.159.1)
;; WHEN: Thu Oct 10 15:26:50 2002
;; MSG SIZE  rcvd: 147

Zjištění MX záznamů

MX záznamy slouží pro směrování elektronické pošty. Obsahují číslo, které slouží k určení priority. Čím nižší, tím má příslušný záznam vyšší prioritu a naopak. Při doručování pošty je z elektronické adresy vzata část za zavináčem a nejprve se ji program doručující poštu (MTA - Mail Transfer Agent) pokusí přeložit na IP adresu (nejstarší varianta směrování pošty). Pokud to nelze nebo daná IP adresa není schopna poštu přijmout, zkouší se pošta doručit na MX záznamy nižší prioritou.

Následující výpis je zkrácen tak, aby obsahoval jen vlastní odpověď.

$ dig pslib.cz mx

...
;; ANSWER SECTION:
pslib.cz.               86400   IN      MX      20 neptun.pslib.cz.
pslib.cz.               86400   IN      MX      30 semiramis.xserver.cz.
pslib.cz.               86400   IN      MX      40 rs.cesnet.cz.
pslib.cz.               86400   IN      MX      10 opteron.pslib.cz.

Zjištění NS, SOA a případně dalších záznamů

Podobně jako u MX záznamů lze požádat i o další záznamy v DNS, například NS (seznam DNS serverů), SOA (Start Of Authority, resp. definiční část domény se sériovým číslem a předepsanými implicitními intervaly) a podobně:

$ dig pslib.cz ns

...
;; ANSWER SECTION:
pslib.cz.               86400   IN      NS      ns.ces.net.
pslib.cz.               86400   IN      NS      neptun.pslib.cz.
pslib.cz.               86400   IN      NS      semiramis.xserver.cz.
$ dig pslib.cz soa

...
;; ANSWER SECTION:
pslib.cz.               86400   IN      SOA     neptun.pslib.cz. hostmaster.pslib.cz. 2004081800 28800 7200 1814400 86400

SOA záznam obsahuje postupně tyto údaje:

  • jméno primárního NS serveru (nemá funkční význam, takže tam může být v podstatě cokoliv, zde neptun.pslib.cz)
  • elektronickou adresu správce domény, přičemž znak zavináč je nahrazen tečkou (zde hostmaster@pslib.cz)
  • serial - sériové číslo zónového souboru, podle kterého sekundární NS servery usuzují, zda je potřeba přenést novější zónový soubor z primárního NS serveru, obvykle je to datum plus sériové číslo, ale v podstatě musí být při každé změně číslo pouze zvětšeno (zde 2004081800)
  • refresh - doba, za kterou by sekundární server měl zkontrolovat, zda primár neobsahuje novější informace (zde 28800 vteřin, tj. 8 hodin)
  • retry - po jaké době by měl sekundární server opakovat pokus o stažení zóny v případě neúspěchu (zde 7200 vteřin, tj. 2 hodiny)
  • expire - po jakou dobu je oprávněn poskytovat sekundár autoritativní odpovědi bez toho, aby se mu podařilo spojit s primárním NS serverem (zde 1814400 vteřin, tj. 4 týdny)
  • minimum TTL - implicitní trvanlivost záznamů v cache, přičemž pro každý záznam je možné v zónovém souboru uvést specifickou hodnotu (zde 86400 vteřin, tj. 1 den)

Přenos zóny (AXFR)

Pokud je přenos zóny povolen, lze o něj požádat primární nebo sekundární DNS server domény. Z toho vyplývá, že nejprve zjistíme NS servery domény a pak se jich pokusíme zeptat. Z výpisu NS serverů nepoznáme, který server je primární a který sekundární, nicméně oba poskytují autoritativní odpovědi (označené flagem aa). S jistou rezervou lze brát jako nápovědu jméno serveru uvedené v SOA záznamu domény, protože na toto místo většinou administrátor domény píše právě název primárního NS serveru.

$ dig pslib.cz ns
$ dig @neptun.pslib.cz pslib.cz axfr

; <<>> DiG 9.2.2 <<>> @neptun.pslib.cz pslib.cz axfr
;; global options:  printcmd
pslib.cz.               86400   IN      SOA     neptun.pslib.cz. hostmaster.pslib.cz. 2004081800 28800 7200 1814400 86400
pslib.cz.               86400   IN      NS      ns.ces.net.
pslib.cz.               86400   IN      NS      neptun.pslib.cz.
pslib.cz.               86400   IN      NS      semiramis.xserver.cz.
pslib.cz.               86400   IN      MX      10 opteron.pslib.cz.
pslib.cz.               86400   IN      MX      20 neptun.pslib.cz.
pslib.cz.               86400   IN      MX      30 semiramis.xserver.cz.
pslib.cz.               86400   IN      MX      40 rs.cesnet.cz.
pslib.cz.               86400   IN      A       195.113.159.10
pluto.pslib.cz.         86400   IN      A       195.113.159.169
...

Kontroly DNS

Kontrola správnosti NS záznamů

Domény jsou organizovány jako stromová struktura shora dolů. Zakládáme-li tedy doménu, musíme u nadřízené domény požádat o definici včetně příslušných NS serverů. Protože jsou NS servery uvedené i ve vlastním zónovém souboru domény (jak je vidět v předchozím výpisu), vzniká zde prostor pro nekonzistence. Ve správném případě by tedy měl být seznam NS serverů nadřízené domény shodný se seznamem NS serverů uvedeným v příslušné doméně. Pokud bychom chtěli provést kontrolu pro doménu pslib.cz, vypadal by postup zhruba takto:

$ dig cz ns

...
;; ANSWER SECTION:
cz.                     18000   IN      NS      ns.tld.cz.
cz.                     18000   IN      NS      ns.ripe.net.
cz.                     18000   IN      NS      ns2.nic.fr.
cz.                     18000   IN      NS      nss.tld.cz.
cz.                     18000   IN      NS      sunic.sunet.se.
cz.                     18000   IN      NS      ns-ext.vix.com.

$ dig @ns.tld.cz. pslib.cz ns

...
;; AUTHORITY SECTION:
pslib.cz.               18000   IN      NS      neptun.pslib.cz.
pslib.cz.               18000   IN      NS      semiramis.sslib.cz.
pslib.cz.               18000   IN      NS      ns.ces.net.

$ dig @neptun.pslib.cz. pslib.cz ns

...
;; ANSWER SECTION:
pslib.cz.               86400   IN      NS      semiramis.xserver.cz.
pslib.cz.               86400   IN      NS      ns.ces.net.
pslib.cz.               86400   IN      NS      neptun.pslib.cz.

Jak je vidět, záznamy jsou v pořádku. Současně bychom měli zkontrolovat, zda všechny uvedené NS servery poskytují autoritativní odpovědi (tj. jestli na nich jsou skutečně umístěny zónové soubory, resp. jestli jsou opravdu buď primárním nebo sekundárním serverem dané domény).

Kontrola DNS záznamů

Při běžném postupu můžeme přeskočit kontrolu toplevel domény a přikročit přímo ke zjištění NS serverů domény pslib.cz (viz dále). Pokud je něco špatně, neměli bychom vynechat ani tento první krok. Zjistíme si tedy, jaký server je zřejmě dané toplevel zóně primární (zde česká doména .cz):

$ dig cz. soa

...
;; ANSWER SECTION:
cz.                     780     IN      SOA     a.ns.nic.cz. hostmaster.nic.cz. 1255876469 900 300 604800 900

Zde je vidět, že primárním serverem toplevel domény cz je zřejmě a.ns.nic.cz.. Mohli bychom se také zeptat na běžné NS servery zóny cz, protože správně by všechny měly obsahovat stejné informace:

$ dig cz. ns

...
;; ANSWER SECTION:
cz.                     11334   IN      NS      C.NS.NIC.cz.
cz.                     11334   IN      NS      D.NS.NIC.cz.
cz.                     11334   IN      NS      E.NS.NIC.cz.
cz.                     11334   IN      NS      B.NS.NIC.cz.
cz.                     11334   IN      NS      F.NS.NIC.cz.
cz.                     11334   IN      NS      A.NS.NIC.cz.

Z výše uvedeného výpisu je zřejmé, že jeden z uvedených NS serverů je primární a zbylé sekundární. Z vnějšku je není možné rozlišit (maximálně pomocí informativní položky v SOA záznamu) a všechny poskytují autoritativní odpovědi. Dále zjistíme NS servery dané domény (mohli bychom použít i přímý dotaz na zvolený NS server, například dig @a.ns.nic.cz. pslib.cz ns a porovnat pak jednotlivé odpovědi):

$ dig pslib.cz ns

...
;; ANSWER SECTION:
pslib.cz.               18000   IN      NS      neptun.pslib.cz.
pslib.cz.               18000   IN      NS      semiramis.sslib.cz.
pslib.cz.               18000   IN      NS      ns.ces.net.

Jeden z uvedených serverů je primární, ostatní jsou sekundární. Sekundární servery si periodicky synchronizují obsah zóny podle primárního NS serveru. Může se tedy stát, že sekundární servery budou obsahovat starší informace, což by mělo být zřejmé podle sériového čísla uvedeného v SOA záznamu domény. V ideální případě musí být sériová čísla stejná. Pokud nejsou, je nutné vyčkat až proběhne synchronizace sekundárních serverů s primárním serverem. Při výpisu SOA záznamu je možné orientačně zjistit, který server je označen za primární, avšak je nutné si uvědomit, že tato informace má pouze informativní charakter (důležitá je vlastní konfigurace DNS serveru, kterou z vnějšku však nelze zjistit). Zjistíme tedy SOA záznam domény pslib.cz:

$ dig pslib.cz soa

...
;; ANSWER SECTION:
 pslib.cz.               86400   IN      SOA     neptun.pslib.cz. hostmaster.pslib.cz. 2009076006 28800 7200 1814400 86400

Ve výše uvedeném výstupu je zřejmé, že sériové číslo zóny pslib.cz je 2009076006 (zde ve formě datumu a dvojciferného rozlišení). Primárním serverem je zřejmě neptun.pslib.cz (avšak tato informace nemusí být pravdivá, jak bylo uvedeno výše). Pomocí konkrétních dotazů můžeme zjistit stav jednotlivých serverů (jejich SOA záznamy), protože pokud je záznam již v cache lokálního serveru, nebude po celou dobu své platnosti aktualizován. Níže jsou uvedeny tři dotazy na všechny tři NS servery domény pslib.cz:

$ dig @neptun.pslib.cz pslib.cz soa
$ dig @semiramis.sslib.cz pslib.cz soa
$ dig @ns.ces.net pslib.cz soa

Podle stavu SOA záznamů jednotlivých DNS serverů si můžeme vytvořit představu o aktuálním stavu jejich konzistence. Pak lze kontrolovat jednotlivé záznamy, zkusit přenést celou zónu a podobně:

$ dig @neptun.pslib.cz. www.pslib.cz

...
;; flags: qr aa rd; QUERY: 1, ANSWER: 2, AUTHORITY: 3, ADDITIONAL: 2
...
;; ANSWER SECTION:
www.pslib.cz.           86400   IN      CNAME   opteron.pslib.cz.
opteron.pslib.cz.       86400   IN      A       195.113.159.18

Výše uvedený výstup je autoritativní (nepochází z cache), což indikuje flag aa ve výstupu (anglicky authoritative answer). Pokud bychom se zeptali lokálního DNS serveru (je dán konfigurací počítače, na kterém pracujeme), získáme pravděpodobně odpověď z cache, přičemž lze získat i informaci o tom, jak dlouho bude ještě záznam v cache platný:

$ dig www.pslib.cz

...
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 3, ADDITIONAL: 1
...
;; ANSWER SECTION:
www.pslib.cz.           85422   IN      CNAME   opteron.pslib.cz.
opteron.pslib.cz.       76004   IN      A       195.113.159.18

Ve výše uvedeném výpisu je zřejmé, že jde o výpis z cache (chybí flag aa). Záznam CNAME pak bude platný ještě 85422 vteřin (necelý 1 den) a záznam A pak ještě 76004 vteřin (asi 21 hodin).

Kontrola reverzního záznamu

Ke každému A záznamu by měl být v pořádku příslušný reverzní záznam, který by měl odpovídat stejnému jménu, jako má A záznam. Zkusíme tedy převést výše zjištěnou IP adresu 195.113.159.18 na jméno:

$ dig -x 195.113.159.18

...
;; ANSWER SECTION:
18.159.113.195.in-addr.arpa. 86400 IN   PTR     opteron.pslib.cz.

V tomto případě je k A záznamu konzistentní PTR záznam, takže je vše v pořádku (opteron.pslib.cz je 195.113.159.18 a to je po reverzním překladu opět opteron.pslib.cz).