Principy fungování DNS: reverzní dotazy aneb hledá se jméno pro adresu

16. 11. 2023
Doba čtení: 6 minut

Sdílet

 Autor: Depositphotos
Reverzní dotaz vychází z IP adresy (verze 4 nebo 6) a snaží se zjistit, jaké doménové jméno jí náleží. Zlidšťují se tak protokoly o činnosti serverů, výstupy testovacích programů typu traceroute a podobně.

Aby se dalo DNS použít k řešení tohoto typu problémů, musí se z adresy vytvořit určité speciální doménové jméno, které se následně stane předmětem dotazu. Nepůjde to ale udělat přímočaře, protože doménové jméno má obecné části vzadu a směrem dopředu se zpřesňuje, zatímco v případě adresy je směr přesně opačný. Začíná obecnou adresou sítě, za ní následuje podsíť a až na konci se nachází adresa konkrétního stroje v podsíti.

Převod IP na jméno

DNS je postaveno na principu distribuované správy, aby informace mohli upravovat místní správci. Proto bylo třeba vymyslet způsob převodu IP adresy na dotazované jméno, který by umožnil například doménu odpovídající síťovému prefixu 147.230.0.0/16 svěřit do správy organizaci, jíž byla přidělena dotyčná síť.

Řešením je prosté otočení adresy. Konkrétně z IPv4 adresy se vytvoří poptávané doménové jméno tak, že se vyjde z jejího standardního zápisu, v něm se obrátí pořadí jednotlivých bajtů a na konec se přidá přípona in-addr.arpa. Pokud bychom například hledali, pod jakým jménem je registrována adresa 147.230.16.27, poptávali bychom doménové jméno:

27.16.230.147.in-addr.arpa

Síti 147.230.0.0/16 odpovídá v tomto pojetí doména 230.147.in-addr.arpa, kterou lze snadno svěřit do správy držiteli adresy. Distribuovaná správa je možná a informace nadále mohou být do DNS vkládány přímo tam, kde vznikají. Pro reverzní dotazy byl vytvořen speciální typ zdrojových záznamů nazvaný PTR (pointer). Jeho hodnotou je doménové jméno odpovídající příslušné adrese.

Například dotaz na záznam typu PTR pro výše uvedené doménové jméno vás oblaží odpovědí, že náleží stroji web.tul.cz. TUL, jejíž doménu tul.cz jsme používali pro příklady v předchozí části, disponuje právě sítí 147.230.0.0/16. Zónový soubor pro její reverzní doménu 230.147.in-addr.arpa, který by odpovídal našemu příkladu výše, by vypadal následovně:

$TTL 48h
$ORIGIN 230.147.in-addr.arpa.
@       SOA bubo.tul.cz. pavel\.satrapa.tul.cz. (
            2023071001 ;sériové číslo
            86400 ;aktualizovat po 1 dni
            7200 ;opakovat po 2 hod
            3600000 ;zrušit po 1000 hod
            172800 ) ;minimum 2 dny

        NS  bubo.tul.cz.
        NS  tul.cesnet.cz.

1.16    PTR bubo.tul.cz.
27.16   PTR web.tul.cz.
241.72  PTR sirius.fm.tul.cz.

Jsme v reverzní doméně, relativní jména jsou proto vztažena k ní – například 1.16 znamená 1.16.230.147.in-addr.arpa. Veškerá jména z domény tul.cz musí být zapsána jako absolutní. Považujeme za rozumné držet celou zónu pohromadě v jednom souboru, nedelegovat její části do dalších zón.

Různá délka prefixu

Popsaný systém byl navržen v době, kdy IPv4 adresy patřily do tříd A, B nebo C a přidělované prefixy končily vždy na hranici bajtů. Když bylo v polovině 90. let nasazeno beztřídní adresování (CIDR, Classless Inter-Domain Routing), vznikl problém, protože najednou mohla koncová síť dostat prefix libovolné délky. Poskytovatel internetu, který má při správě adres roli lokálního internetového registru (LIR), například dostal pro své zákazníky k dispozici prefix  10.1.2.0/24.

Vzhledem k velikosti koncových sítí a aktuálním pravidlům se jej rozhodl rozdělit na čtyři části různé velikosti a ty přidělit jednotlivým zákazníkům:

  • prefix 10.1.2.0/25 dostal zákazník xyz1,
  • prefix 10.1.2.128/26 dostal zákazník xyz2,
  • prefix 10.1.2.192/27 dostal zákazník xyz3 a
  • prefix 10.1.2.224/27 dostal zákazník xyz4.

Při zachování původní koncepce reverzních zón bylo jedinou možností, aby jejich společnou zónu 2.1.10.in-addr.arpa spravoval poskytovatel a na základě požadavků jednotlivých zákazníků do ní vkládal záznamy pro jejich stroje. Takové uspořádání je ale dost nepraktické a popírá princip, aby si reverzní zónu spravoval sám držitel příslušného prefixu. Bylo potřeba vymyslet způsob, jak reverzní zónu delegovat kdesi uprostřed bajtu.

S řešením přišlo RFC 2317 s názvem Classless IN-ADDR.ARPA delegation. Do reverzního jména navrhlo vložit další doménu, která popisuje rozdělení bajtu a umožňuje delegovat jednotlivé poddomény různým subjektům. Toto vložení nelze udělat obecně, protože adresní prostor je členěn podle potřeby, jeho jednotlivé části se liší a zdaleka ne každá potřebuje delegaci uvnitř bajtu.

Držitel či správce prefixu, na jehož konci došlo k rozdělení, musí tuto skutečnost zanést do odpovídající reverzní zóny. V bajtu, ve kterém došlo k rozdělení, zavede poddomény pro jeho jednotlivé části a hodnoty do nich rozdělí. Používají se k tomu záznamy typu CNAME (přezdívka).

Konkrétně v našem příkladu by poskytovatel v doméně 2.1.10.in-addr.arpa zavedl poddomény 0/25, 128/26, 192/27 a 224/27 a delegoval je příslušným zákazníkům. Kromě toho by do domény 2.1.10.in-addr.arpa vložil záznamy CNAME, jimiž by převedl původní reverzní jména na jména v těchto poddoménách. Všechny adresy přidělené prvnímu zákazníkovi by byly převedeny do domény 0/25.2.1.10.in-addr.arpa, takže například jméno 15.2.1.10.in-addr.arpa by se stalo přezdív kou pro 15.0/25.2.1.10.in-addr.arpa. Pro adresy druhého zákazníka by přezdívky vedly do domény 128/26.2.1.10.in-addr.arpa  – například 137.2.1.10.in-addr.arpa by se díky CNAME změnila na 137.128/26.2.1.10.in-addr.arpa a tak dále.

Výhodou je, že dělicí zónu lze připravit předem a celou, bez ohledu na to, zda adresy byly přiděleny nebo nikoli. Zóna bude obsahovat záznamy CNAME pro všech 256 možných hodnot a až při dotazu autoritativních serverů jednotlivých poddomén spravovaných zákazníky se zjistí, zda pro danou adresu existuje PTR záznam či nikoli. Okamžitě po přidělení prefixů by tedy poskytovatel mohl vytvořit zónový soubor pro doménu 2.1.10.in-addr.arpa s následujícím obsahem:

$TTL 48h
$ORIGIN 2.1.10.in-addr.arpa.
@       SOA …

;poddomény spravované zákazníky
0/25    NS   ns1.xyz1.cz
        NS   ns2.xyz1.cz
128/26  NS   ns1.xyz2.cz
        NS   ns2.xyz2.cz
192/27  NS   ns1.xyz3.cz
        NS   ns2.xyz3.cz
224/27  NS   ns1.xyz4.cz
        NS   ns2.xyz4.cz

;pro všechny adresy v rozsahu prvního zákazníka
0       CNAME 0.0/25
1       CNAME 1.0/25
2       CNAME 2.00/25
…
127     CNAME 127.0/25

;pro všechny adresy v rozsahu druhého zákazníka
128     CNAME 128.128/26
129     CNAME 129.128/26
130     CNAME 130.128/26
…
191     CNAME 191.128/26

;pro všechny adresy v rozsahu třetího zákazníka
192     CNAME 192.192/27
193     CNAME 193.192/27
…
223     CNAME 223.192/27

;pro všechny adresy v rozsahu čtvrtého zákazníka
224     CNAME 224.224/27
225     CNAME 225.224/27
…
255     CNAME 255.224/27

Poddomény pak budou obsahovat běžné záznamy typu PTR pro existující stroje. Reverzní zóna 0/25.2.1.10.in-addr.arpa spravovaná zákazníkem xyz1 by mohla obsahovat například:

$TTL 48h
$ORIGIN 0/25.2.1.10.in-addr.arpa.
@       SOA …
        NS  ns1.xyz1.cz.
        NS  ns2.xyz1.cz.

1       PTR www.xyz1.cz.
2       PTR ns1.xyz1.cz.
3       PTR ns2.xyz1.cz.
4       PTR podpora.xyz1.cz.
35      PTR pc1.xyz1.cz.
36      PTR pc2.xyz1.cz.
127     PTR router.xyz1.cz.

Reverzní záznamy pro IPv6

Pro IPv6 adresy se používá analogický postup, jen je vzhledem k zápisu adres o něco složitější. Opět vychází ze zápisu adresy, který se rozvine na úplný tvar – tedy doplní se všechny vynechané nuly. Pořadí jednotlivých šestnáctkových číslic v adrese se obrátí a každá z nich se stane samostatnou doménou. Za ně se pak přidá konstantní přípona ip6.arpa. Vezměme jako příklad adresu 2001:db8:89ab:1:2a0:ecff:fe12:345. Doplníme chybějící nuly:

2001:0db8:89ab:0001:02a0:ecff:fe12:0345

Poté otočíme pořadí šestnáctkových číslic, uděláme z nich poddomény a připojíme ip6.arpa. Výsledný dotaz tedy bude poptávat doménové jméno:

5.4.3.0.2.1.e.f.f.f.c.e.0.a.2.0.1.0.0.0.b.a.9.8.8.b.d.0.1.0.0.2.ip6.arpa

Tento přístup opět umožňuje delegovat poddomény v souladu s přidělenými částmi adresního prostoru, navíc to vzhledem k důsledné agregaci adres půjde dělat hierarchicky. Vlastní informace o příslušném doménovém jméně je uložena v záznamu typu PTR, stejně jako v případě IPv4.

Nezaručená konzistence

Nikde není zaručeno, že dopředná a reverzní informace budou konzistentní. Tedy že odpověď získaná reverzním dotazem je skutečným doménovým jménem, pod nímž je zaregistrována daná adresa. Nesrovnalosti vznikají chybami, v horším případě úmyslně s cílem podvádět.

Nikdo totiž nemůže zabránit správci reverzní domény 230.147.in-addr.arpa, aby do ní zanesl, že některá ze zdejších adres přísluší třeba www.google.cz. Pokud na tom záleží (například při omezování přístupu ke službě podle klientovy domény), je záhodno si získané jméno ověřit – nechat si pro ně najít adresy a podívat se, zda je původní adresa mezi nimi. Pokud ne, nejsou data v reverzní doméně v pořádku.

bitcoin školení listopad 24

Řekněme, že nejmenovaný server má povolen přístup pouze pro stroje z domény tul.cz. Dorazí-li mu paket z IPv4 adresy 147.230.33.44, získá reverzním dotazem jeho jméno, řekněme pc33.tul.cz. Jelikož se této informaci nedá věřit, poptá vzápětí záznamy typu A pro pc33.tul.cz. Ty už do DNS vkládá správce domény tul.cz a má je pod kontrolou. V odpovědi se dozví třeba:

pc33    A    147.230.11.12
        A    147.230.33.44

Pak může nalezenému jménu důvěřovat, protože zkoumaná adresa se nachází v jeho záznamech A. Daleko častější chybou než úmyslné falšování je chybějící reverzní záznam. Nemálo správců se jejich údržbou nezatěžuje a pokus o zjištění jména k takové adrese skončí neúspěchem.

 

Kniha Domain Name System

Text, který jste právě dočetli, je součástí knihy „Domain Name System: Principy fungování DNS a praktické otázky spojené s jeho používáním“ autorů Pavla Satrapy a Ondřeje Filipa, která vyšla v Edici CZ.NIC.

Autor článku

Pavel Satrapa působí na Ústavu nových technologií a aplikované informatiky na Technické univerzitě v Liberci, píše knihy a motá se kolem tuzemské akademické sítě CESNET.

Ondřej Filip vystudoval Matematicko-fyzikální fakultu Univerzity Karlovy a působí jako ředitel organizace CZ.NIC. Ve volném čase hraje basketbal, cestuje nebo programuje open-source software.