Unbound a Bind

Správa linuxového serveru: Unbound a Bind

Tento díl se věnuje stavbě vlastního DNS serveru, konkrétně pak rekurzivního a DNSSEC validujícího serveru Unbound, a také víceúčelového serveru Bind.

Jak už bylo řečeno dříve, různé DNS servery realizují různou funkčnost. V zásadě existují dva základní typy, rekurzivní a autoritativní. Rekurzivní DNS servery realizují pro své klienty vyhledávání v DNS stromu a poskytují jim odpovědi na jejich dotazy. Servery tohoto typu vám bývají poskytovány vaším ISP. Rekurzivní DNS servery provádějí také kešování odpovědí na dotazy.

Kromě rekurzivních serverů existují také tzv. autoritativní DNS servery, což jsou servery, které publikují DNS záznamy určité části DNS stromu, jejíž správa jim byla přidělena. Kupříkladu, pokud byste si zaregistrovali doménu example.org, měli byste kontrolu nad tím, které DNS servery budou obsahovat její autoritativní informace. Na tyto DNS servery by se pak obracely rekurzivní DNS servery, které od nich získají odpověď na DNS dotazy týkající se domény example.org a jejích subdomén.

Různé DNS servery realizují různou funkčnost. Server dnsmasq, probraný v minulém díle, je ve své podstatě pouze kešující DNS server, který nevyřizuje dotazy, pouze je přeposílá (forwarduje) definovaným rekurzivním DNS serverům. Unbound je primárně rekurzivní a kešující DNS server, i když do jisté míry se dá použít i jako autoritativní server. Bind je univerzální DNS server schopný fungovat jako rekurzor i jako autoritativní server. Jedná se o nejznámější DNS server vůbec. Jsou i čistě autoritativní servery, které neumí pracovat jako rekurzory a zaměřují se pouze na publikování autoritativních DNS informací. Příkladem může být KnotDNS, server z dílen CZ.NIC.

Připomínám, že výchozí port pro službu DNS je 53 a komunikace může probíhat jak přes UDP, tak přes TCP.

Unbound

Unbound je především rekurzivní a kešující DNS server. Je schopen provádět DNSSEC validaci, ale neprovádí ji ve výchozím stavu (alespoň v Debianu). Problematikou DNSSEC se zabýval minulý díl seriálu.

Instalaci serveru Unbound realizujete velmi jednoduše:

aptitude install unbound

Po instalaci se server rovnou rozběhne a začne fungovat. Jeho funkčnost si můžete snadno ověřit:

dig @localhost example.org

DNSSEC

Jako první by bylo dobré zapnout DNSSEC validaci. K tomu potřebujete do hlavního konfiguračního souboru /etc/unbound/unbound.conf přidat informace o souboru obsahujícím klíč kořenové zóny (fungující jako „trust anchor“, tedy „kotva důvěry“):

auto-trust-anchor-file: "/etc/unbound/root.key"

Tento soubor však ve výchozí instalaci neexistuje a je třeba jej vytvořit. Za tímto účelem je nutné si příslušný klíč opatřit a ověřit. Opatřit si jej můžete stažením následujícího souboru:

https://data.iana.org/root-anchors/root-anchors.xml

Jedná se o XML soubor s potřebnými hodnotami. Tyto hodnoty vložte do souboru /etc/unbound/root.key do jediné řádky, a to dle následujícího klíče:

. IN DS <KeyTag> <Algorithm> <DigestType> <Digest>

Výsledek může vypadat nějak takto:

.IN DS 19036 8 2 49AAC11D7B6F6446702E54A1607371607A1A41855200FD2CE1CDDE32F24E8FB5

Po uložení souboru Unbound restartujte:

service unbound restart

Následně zkontrolujte, že DNSSEC validace funguje, např. takto:

dig +dnssec org @localhost

Je-li DNSSEC aktivní, měli byste vidět příznak „AD“ v odpovědi:

;; flags: qr rd ra ad; QUERY: 1, ANSWER: 0, AUTHORITY: 4, ADDITIONAL: 1

Přizpůsobení nastavení Unboundu

Jak je z postupu výše patrné, soubor s konfigurací Unboundu je /etc/unbound/unbound.conf. Tento soubor je bohatě komentovaný, doporučuji si jej tedy projít a upravit podle vašich potřeb. Základní dvě věci pro úpravu jsou v první řadě rozhraní a IP adresy, na kterých Unbound poslouchá (ve výchozím stavu naslouchá pouze na lokální smyčce, tedy nikoliv na síti), a ve druhé řadě je to řízení přístupu, tj. kdo má právo na vyřizování DNS dotazů.

Specifikace rozhraní, popřípadě IP adres, na kterých Unbound naslouchá, se realizuje takto:

interface: 1.2.3.4
interface: 1.2.3.4@5000
interface: 0.0.0.0
interface: ::0

První řádka zajistí, že Unbound bude naslouchat na IP adrese 1.2.3.4 na standardním portu. Druhá řádka ukazuje, jak byste Unboundu sdělili, aby naslouchal na nestandardním portu (v tomto případě portu 5000). Třetí řádka zajistí, že Unbound bude naslouchat na všech IPv4 rozhraních a adresách. Čtvrtá pak provede totéž, ale v rámci protokolu IPv6.

Druhou podstatnou oblastí je řízení přístupu. Ve výchozím stavu je totiž veškerý přístup zakázán, kromě místní smyčky (localhostu).

access-control: 10.0.1.15 refuse
access-control: 10.0.1.0/24 allow

Syntaxe je zde na první pohled jasně patrná – v první řádce se zamítá přístup počítači 10.0.1.15, druhá řádka pak povoluje přístup ze sítě 10.0.1.0/24.

Unbound umožňuje i tvorbu místních zón, popřípadě úpravu odpovědí na specifické dotazy. Místní zónu můžete snadno a rychle vytvořit takto:

local-zone: "local." static
local-data: "typhoon.local. IN A 10.0.1.27"

První řádek definuje doménu „local“, druhý pak vytváří A záznam pro počítač 10.0.1.27 se jménem typhoon.local.

Nastavení Unboundu jako výchozího rekurzoru pro server

Máte-li funkční rekurzivní DNS server, můžete pro příslušný počítač zajistit, aby DNS dotazy vyřizoval přímo místní rekurzor (na místo DNS serverů poskytovatele). To zajistíte úpravou /etc/resolv.conf a vložením následujícího záznamu na první řádek:

nameserver 127.0.0.1

Tato úprava zajistí, že se běžící aplikace budou ptát nejprve místního DNS serveru, který bude odpovídat rychleji než servery vašeho ISP. Nevyřadíte-li ostatní záznamy v resolv.conf, zajistíte tak „fallback“ na některý z dalších serverů, pokud bude váš místní DNS server mimo provoz.

Bind

Bind je univerzální DNS server, umí pracovat jako rekurzor a vyřizovat DNS dotazy (podpora DNSSEC je samozřejmostí), ale umí pracovat také jako autoritativní server.

Jeho instalaci provedete opět velmi jednoduše:

aptitude install bind9

Po instalaci se Bind rozběhne a začne fungovat jako rekurzivní DNS server, což si opět můžete snadno ověřit:

dig @localhost example.org

DNSSEC

Základem je opět opatřit si klíč ke kořenové zóně. Tento klíč můžete získat DNS dotazem:

dig . dnskey

.                       172758  IN      DNSKEY  256 3 8 AwEA
AbW4qUZUxSRqUntM9u0pvmkqRB9Z+WRPghllsekdgp8ksT5bwRBE3xwVWJJp
JgVYGvFGgLIutrGyZDJVLQX+tu+qe6HJbA8XRZsL2aA6e4MZeD4TOUlIH/c
Vlof3y4gFibjwzuuondVku9ia2MSRYnrBl+LMSRftBkVa4OvS+dij
.                       172758  IN      DNSKEY  257 3 8 AwEA
AagAIKlVZrpC6Ia7gEzahOR+9W29euxhJhVVLOyQbSEW0O8gcCjFFVQUTf6v
58fLjwBd0YI0EzrAcQqBGCzh/RStIoO8g0NfnfL2MTJRkxoXbfDaUeVPQuYE
hg37NZWAJQ9VnMVDxP/VHL496M/QZxkjf5/Efucp2gaDX6RS6CXpoY68LsvP
VjR0ZSwzz1apAzvN9dlzEheX7ICJBBtuA6G3LQpzW5hOA2hzCTMjJPJ8LbqF
6dsV6DoBQzgul0sGIcGOYl7OyQdXfZ57relSQageu+ipAdTTJ25AsRTAoub8
ONGcLmqrAmRLKBP1dfwhYB4N7knNnulq QxA+Uk1ihz0=

Ve výpisu budou patrné dva klíče, vy chcete ten delší (257). Klíč a hodnoty převeďte do následující podoby:

managed-keys {
  "." initial-key 257 3 8
    "AwEAAagAIKlVZrpC6Ia7gEzahOR+9W29euxhJhVVLOyQbSEW0O8gcCjF
     FVQUTf6v58fLjwBd0YI0EzrAcQqBGCzh/RStIoO8g0NfnfL2MTJRkxoX
     bfDaUeVPQuYEhg37NZWAJQ9VnMVDxP/VHL496M/QZxkjf5/Efucp2gaD
     X6RS6CXpoY68LsvPVjR0ZSwzz1apAzvN9dlzEheX7ICJBBtuA6G3LQpz
     W5hOA2hzCTMjJPJ8LbqF6dsV6DoBQzgul0sGIcGOYl7OyQdXfZ57relS
     Qageu+ipAdTTJ25AsRTAoub8ONGcLmqrAmRLKBP1dfwhYB4N7knNnulq
     QxA+Uk1ihz0=";
};

A tu vložte třeba do souboru /etc/bind/named.conf.managed. Následně vložte potřebnou include direktivu do /etc/bind/named.conf:

include "/etc/bind/named.conf.managed";

Toto samo o sobě by mělo stačit (DNSSEC validace je povolená, ale fungovat začne teprve po výše uvedené operaci). Bind tedy restartujte:

service bind9 restart

A následně použijte stejný postup uvedený výše pro ověření, že DNSSEC validace funguje.

Pozor! Opět zde platí, že výše uvedený klíč si musíte v každém případě nějakým způsobem ověřit, protože na něm stojí celá bezpečnost ověřování DNSSEC.

Přizpůsobení nastavení Bindu

Bind se umí chovat úplně stejně jako dnsmasq, tedy jako forwardující (přeposílá dotazy na jiný server) a kešující DNS server. Chcete-li ho takto nastavit, vložte do /etc/bind/named.conf.options, mezi složené závorky direktivy options, následující řádky (servery, které se mají dotazovat, se specifikují v proměnné forwarders):

forward only;
forwarders { 1.2.3.4; 4.3.2.1;};

Nastavení síťových rozhraní, kde má Bind naslouchat, se realizuje následovně (stejný soubor, stejné umístění jako v příkladu výše):

listen-on-v6 { any; };
listen-on { 127.0.0.1; 10.0.1.254; };

První řádka specifikuje naslouchání na IPv6 adresách. Klíčové slovo any zajistí, že se bude naslouchat na všech. Druhá řádka řídí naslouchání na IPv4, kde jsou specifikovány v tomto případě dvě adresy, adresa místní smyčky (localhostu) a privátní adresa 10.0.1.254.

allow-query { 10.0.1.0/24; };

Proměnná allow-query definuje, kdo se smí serveru dotazovat. V tomto příkladu se serveru smí dotazovat síť 10.0.1.0/24.

allow-recursion { 10.0.1.0/24; };

Tato proměnná definuje, kdo smí pokládat rekurzivní dotazy. Syntax je totožná jako u allow-querry.

Pokud nechcete provozovat rekurzivní DNS server, rekurzi jako takovou je možné vypnout:

recursion no;

Tím bych pro tentokrát skončil. Příště bude osvětlena problematika tvorby zón a zónových souborů.