Linux E X P R E S

Facebook

Správa linuxového serveru: DNS a DHCP server dnsmasq

debain_notext.png

Tento díl pokračuje v problematice DNS, věnuje se rekurzivním dotazům, PTR záznamům a DNSSEC. Představuje také server dnsmasq, který poslouží jako na zdroje nenáročný a snadno konfigurovatelný kešovací DNS a DHCP server.


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.

Diskuze (2) Nahoru