Rekurzivní dotazy
Většina z vás bude jistě tušit (zejména po přečtení předchozího dílu), že pomocí DNS můžete získat ke jménu (např. wikipedia.org
) konkrétní IP adresu (např. 208.80.152.201
). DNS ale také podporuje „obrácené“, rekurzivní dotazy, tedy takové dotazy, které vám vrátí jméno ke konkrétní IP adrese. Využívají se k tomu záznamy typu PTR a speciální doména in-addr.arpa
pro IPv4, ip6.arpa
pro IPv6.
Zkuste si to na nějakém příkladu. Můžete využít nástroj dig
, který byl představen v minulém díle. Nejprve získejte IP adresu k nějakému jménu (tedy A záznam), třeba wikipedia.org
:
dig wikipedia.org ;; QUESTION SECTION: ;wikipedia.org. IN A ;; ANSWER SECTION: wikipedia.org. 3516 IN A 208.80.152.201
Chcete-li provést rekurzivní DNS dotaz pomocí nástroje dig
, použijte volbu -x
, takto:
dig -x 208.80.152.201 ;; QUESTION SECTION: ;201.152.80.208.in-addr.arpa. IN PTR ;; ANSWER SECTION: 201.152.80.208.in-addr.arpa. 3361 IN PTR wikipedia-lb.pmtpa.wikimedia.org.
Z odpovědi na tento dotaz by mělo být jasné, jak je vlastně rekurzivní dotaz realizován. Hledá se záznam typu PTR
ke jménu 201.152.80.208.in-addr.arpa
, přičemž toto jméno obsahuje číselnou reprezentaci IP adresy, ovšem jednotlivé oktety jsou uvedeny v opačném pořadí. Jak víte, systém DNS je tvořen stromovou strukturou, která má počátek na konci (top-level doména), a pak se dále větví do domén druhého, třetího a dalších řádů. Každá větev nebo „podvětev“ tohoto stromu pak může být delegována jinému subjektu.
Jak je patrné z příkladu výše, PTR
záznamy nemusí mít stejnou hodnotu jako A
záznamy. Dlužno dodat, že PTR záznamů pro jednu IP adresu může být více, nicméně není to obvyklé, často z obav, že nebude správně fungovat software očekávající pouze jedno jméno na rekurzivní dotaz.
PTR záznamy jsou důležité zejména v oblasti pošty, jelikož některé poštovní servery předpokládají a očekávají shodu A záznamu s PTR záznamem. Pokud se záznamy shodovat nebudou, pošta může být odmítnuta, klasifikována jako spam nebo se zvýší skóre nástrojů typu spamassassin.
PTR záznamy obvykle nastavujete u svého ISP, který vám buď deleguje danou DNS větev na váš vlastní DNS server, nebo vám nastaví PTR záznamy na svém.
Dnsmasq: Jednoduchý DNS server
Dnsmasq
je vynikající nástroj, pokud potřebujete rychle nasadit kešující DNS (anebo také DHCP) server pro malou síť (dle webu projektu zvládá i tisíc klientů). Dnsmasq
není resolver, tzn. neprovádí vyhledávání neznámých domén sám, nýbrž jen předává dotazy místním DNS resolverům (viz /etc/resolv.conf
). Vyřešené dotazy kešuje, což snižuje zátěž hlavních DNS resolverů a také mírně zvyšuje výkon. Můžete samozřejmě přidávat vlastní DNS záznamy pro místní nebo speciální domény.
Dnsmasq
umí fungovat také jako jednoduchý DHCP server, IP adresy můžete přidělovat staticky nebo dynamicky. Jeho předností je nenáročnost na paměť a na konfiguraci.
Instalaci nástroje dnsmasq
provedete v Debianu klasickým způsobem, instalací příslušného balíčku z oficiálních repozitářů:
aptitude install dnsmasq
Konfigurace
Hlavním konfiguračním souborem je /etc/dnsmasq.conf
. Tento konfigurační soubor je bohatě komentovaný, takže není problém dnsmasq
rychle nastavit podle vašich představ. První věc, kterou byste měli upravit, je specifikace rozhraní, kde má dnsmasq
naslouchat. Z bezpečnostních důvodů se nehodí, aby byl dostupný z internetu (ve výchozím stavu naslouchá na všech rozhraních):
interface=eth1
Rozhraní můžete specifikovat více:
interface=eth2 interface=eth3
DNS
Kešování DNS a forwarding fungují automaticky, k tomu není třeba nic nastavovat. Můžete se sami přesvědčit tím, že se zeptáte na nějakou doménu :
dig www.wikipedia.org @127.0.0.1
Dnsmasq
využívá vaše resolvery (viz /etc/resolv.conf
) a odpovědi kešuje. Integruje také informace z /etc/hosts
, což velmi usnadňuje pojmenování místních počítačů – odpadá nutnost tvořit zónový soubor. Například, pokud do /etc/hosts
vložíte záznam:
10.0.1.15 kremilek.local
...můžete se po restartu programu dnsmasq
rovnou přesvědčit, že od něj dostanete správnou odpověď (tedy, správnou dle /etc/hosts
):
dig @127.0.0.1 kremilek.local ;; ANSWER SECTION: kremilek.local. 10800 IN A 10.0.1.15
Výchozí hodnota pro velikost keše je sto padesát záznamů, což není mnoho. Chcete-li kešovat více záznamů, specifikujte příslušnou hodnotu v direktivě cache-size
:
cache-size=500
Vlastní DNS záznamy můžete vkládat nejenom do /etc/hosts
, ale také do konfigurace samotné:
host-record=laptop,laptop.local,10.0.1.60,1234::100
Výše uvedená řádka vytvoří A záznam pro jména laptop
a laptop.local
s IP adresou 10.0.1.60
a AAAA (IPv6) záznam s IPv6 adresou 1234::100
.
Potřebujete-li vložit vlastní MX záznam, můžete použít mx-host
:
mx-host=example.org,postovniserver.local,10
Výše uvedený řádek nastaví MX záznam pro doménu example.org
o váze 10
s poštovním serverem postovniserver.local
.
Podobným způsobem můžete vytvářet i PTR nebo SRV záznamy. Více viz manuálová stránka a komentáře v konfiguračním souboru. Po úpravě konfigurace je třeba dnsmasq
restartovat:
service dnsmasq restart
DHCP
Funkci DHCP serveru má dnsmasq
ve výchozím stavu vypnutou. Pro její zprovoznění postačí specifikovat rozsah adres pro DHCP:
dhcp-range=10.0.1.50,10.0.1.150,12h
Tato řádka nastaví dynamické přidělování adres v rozsahu 10.0.1.50 až 10.0.1.150, přičemž přidělená IP adresa bude „pronajatá“ dvanáct hodin. Podobně jako v případě direktivy interface
můžete dhcp-range
specifikovat vícekrát, pokaždé pro jiný rozsah:
dhcp-range=10.0.1.50,10.0.1.150,12h dhcp-range=10.0.5.10,10.0.5.50,12h
IP adresy můžete specifikovat i staticky, pro konkrétní MAC síťové karty:
dhcp-host=11:22:33:44:55:66,10.10.10.10
Tato řádka přidělí MAC adrese 11:22:33:44:55:66
IP adresu 10.10.10.10
.
Konkrétní rozsahy můžete přidělovat i konkrétním síťovým rozhraním:
dhcp-range=eth1,10.0.1.50,10.0.1.150,12h dhcp-range=eth2,10.0.5.10,10.0.5.50,12h
Potřebujete-li specifikovat některé další volby jako router apod., můžete použít dhcp-option
:
dhcp-option=option:router,10.10.10.10 dhcp-option=option:ntp-server,10.10.10.20,10.10.10.30
Výše uvedená řádka sdělí DHCP klientům, že router je na adrese 10.10.10.10
a NTP servery jsou na 10.10.10.20
a 10.10.10.30
. Další příklady naleznete v konfiguračním souboru a v manuálu.
DNSSEC
DNS je velmi starý protokol, který nebyl navržen s ohledem na bezpečnost (což samozřejmě neplatí jen o DNS). Existuje možnost podvržení DNS záznamů, které není možné spolehlivě zabránit, což otevírá prostor pro známý man-in-the-middle útok. Podaří-li se útočníkovi podvrhnout odpověď na váš DNS dotaz, dojde k „otrávení“ vaší DNS keše podvrženým záznamem (proto se tyto útoky označují jako DNS cache poisoning). Snad nemusím zdůrazňovat, jaké důsledky může mít podvržení DNS záznamů – místo komunikace se svou bankou můžete komunikovat s útočníkem, který pak může zaútočit přímo na vaše bankovní konto.
Obranou vůči těmto útokům je DNSSEC, což je systém, který DNS záznamy digitálně podepisuje (používá se asymetrické šifrování), a DNS resolvery podpisy kontrolují. Digitální podpisy mají svou hierarchii (tzv. chain of trust model), která začíná u kořenové zóny (počáteční bod hierarchie se označuje jako „trust anchor“, kotva důvěry – její podpis byste měli pečlivě ověřit, jelikož s jeho důvěryhodností stojí a padá důvěryhodnost celého ověřování). Tento systém je poměrně komplexní a komplikovaný – více o principech fungování DNSSEC se dozvíte v odkazech pod článkem.
DNSSEC je třeba implementovat na straně resolvujících DNS serverů, které využíváte. Nepodporuje-li tedy váš ISP DNSSEC, můžete si postavit vlastní resolver se zprovozněným DNSSECem. Zda váš ISP používá DNSSEC (resp. zda vámi použité resolvující DNS servery používají DNSSEC), zjistíte dotazem na špatně podepsanou doménu, kterou je např. rhybar.cz
:
dig www.rhybar.cz ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 56068 ;; QUESTION SECTION: ;www.rhybar.cz. IN A ;; ANSWER SECTION: www.rhybar.cz. 504 IN A 217.31.205.51
Pokud vám na tento dotaz vrátí server bezchybnou odpověď (status: NOERROR
), pak DNSSEC implementovaný nemá a vy jste zranitelní. Dostane-li se vám odpovědi se statusem SERVFAIL
:
dig www.rhybar.cz ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: SERVFAIL, id: 18561 ;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 1 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 4096 ;; QUESTION SECTION: ;www.rhybar.cz. IN A
...pak je všechno v pořádku a DNSSEC je aktivní. Jednoduchý test přímo z webového prohlížeče můžete realizovat třeba na stránce www.dnssec.cz. Jak si postavit vlastní resolvující a DNSSEC validující server, se dozvíte v příštím díle.