Dnsmasq je jednoduchá implementace základních síťových služeb — vše v jednom: DNS, DHCP, router advertisement a bootování ze sítě. Pro svou velikost (maličkost) a nenáročnost na systémové prostředky si našel místo na mnoha domácích routerech. Dnsmasq také spravuje virtuální sítě v sadě nástrojů libvirtd. A v neposlední řadě je k nalezení i na některých smartphonech (včetně Androidu), kde se používá pro tethering.
9. dubna 2014 vyšel Dnsmasq verze 2.69, který do vínku dostal podporu validace DNSSEC. To určitě stojí za vyzkoušení.
Na stránkách projektu je k nalezení odkaz na stránku s distribučními tarbally, případně adresa Git repozitáře s aktuální vývojovou verzí. Já použiji verzi z Gitu:
git clone git://thekelleys.org.uk/dnsmasq.git Cloning into 'dnsmasq'... ... $ cd dnsmasq
Pro předklad budou potřeba knihovny nettle a gmp. Na Fedoře instalujte balíčky nettle-devel a gmp-devel, na Debianu nettle-dev a libgmp-dev. Na jiných systémech budete muset hledat.
(fedora) $ su -c 'yum install nettle-devel gmp-devel' (debian) $ sudo apt-get install nettle-dev libgmp-dev
Podpora pro DNSSEC se ve výchozím stavu nepřekládá a instrukce pro zapnutí naleznete v souboru CHANGELOG. V podstatě stačí předat překladači parametr
-DHAVE_DNSSEC.
$ make COPTS="-DHAVE_DNSSEC" make[1]: Entering directory `/tmp/dnsmasq/src' cc -Wall -W -O2 -DHAVE_DNSSEC -DVERSION='"2.71test2"' -c cache.c cc -Wall -W -O2 -DHAVE_DNSSEC -DVERSION='"2.71test2"' -c rfc1035.c cc -Wall -W -O2 -DHAVE_DNSSEC -DVERSION='"2.71test2"' -c util.c ... cc -o dnsmasq cache.o rfc1035.o util.o option.o forward.o network.o dnsmasq.o dhcp.o lease.o rfc2131.o netlink.o dbus.o bpf.o helper.o tftp.o log.o conntrack.o dhcp6.o rfc3315.o dhcp-common.o outpacket.o radv.o slaac.o auth.o ipset.o domain.o dnssec.o blockdata.o -lnettle -lhogweed -lgmp make[1]: Leaving directory `/tmp/dnsmasq/src
Výsledkem bude jediná binárka dnsmasq v adresáři src. Do systému můžete instalovat tradičním make install, pro testování to však není třeba.
Veškerou funkcionalitu Dnsmasq lze konfigurovat přes parametry příkazové řádky. Případně lze použít konfigurační soubor, který používá stejné volby. Nejlepším manuálem je tedy dnsmasq –help. Pro začátek můžeme vyzkoušet, zda funguje DNS bez DNSSECu:
$ src/dnsmasq --no-daemon --listen-address=127.0.0.1 --port 53533 dnsmasq: started, version 2.71test2 cachesize 150 dnsmasq: compile time options: IPv6 GNU-getopt no-DBus no-i18n no-IDN DHCP DHCPv6 no-Lua TFTP no-conntrack ipset auth DNSSEC dnsmasq: reading /etc/resolv.conf dnsmasq: using nameserver 192.168.0.1#53 dnsmasq: read /etc/hosts - 21 addresses
Server se spustí na popředí, DNS server poběží na lokálním rozhraní a portu 53533. Dnsmasq bohužel pro resolvování potřebuje jiný rekurzivní DNS server a standardně používá systémové z /etc/resolv.conf.
Zda resolvování funguje můžeme ověřit pomocí nástroje kdig, dig, drill, … zkrátka podle osobních preferencí:
$ kdig @127.0.0.1 -p 53533 +short nic.cz NS b.ns.nic.cz. d.ns.nic.cz. a.ns.nic.cz.
Pokud vše funguje jak má, můžeme ukončit Dnsmasq (Ctrl+C) a zkusíme zapnout DNSSEC. Tentokrát bude lepší zápis do konfiguračního souboru:
# nastavení daemona no-daemon listen-address=127.0.0.1 port=53533 # vypisování dotazů do konzole log-queries # nastavení DNSSEC dnssec dnssec-check-unsigned trust-anchor=.,19036,8,2,49AAC11D7B6F6446702E54A1607371607A1A41855200FD2CE1CDDE32F24E8FB5
Jednotlivé konfigurační volby pro DNSSEC si zaslouží vysvětlení:
- Volba dnssec zapíná validaci DNSSECu, ale pouze u podepsaných odpovědí od upstream resolveru. Takže pokud útočník ze zprávy s odpovědí poslané resolverem odstraní DNSSEC informace, Dnsmasq bude obsahu zprávy důvěřovat.
- Volba dnssec-check-unsigned zapne validaci DNSSECu i v případě, že od resolveru přijde odpověď bez DNSSEC informací. Dnsmasq tedy za cenu dalších dotazů provede sestavení celého řetězu důvěry. Ve většině případů má smysl tuto volbu zapínat.
- Volba trust-anchor specifikuje DS záznam klíče, který slouží jako kořen důvěry.
Spustíme server:
$ src/dnsmasq -C dnssec.conf dnsmasq: started, version 2.71test2 cachesize 150 dnsmasq: compile time options: IPv6 GNU-getopt no-DBus no-i18n no-IDN DHCP DHCPv6 no-Lua TFTP no-conntrack ipset auth DNSSEC dnsmasq: DNSSEC validation enabled dnsmasq: reading /etc/resolv.conf dnsmasq: using nameserver 192.168.0.1#53 dnsmasq: read /etc/hosts - 21 addresses
A vyzkoušíme, zda validace funguje:
- Zabezpečená doména:
$ kdig @127.0.0.1 -p 53533 +short www.nic.cz 217.31.205.50
- Nezabezpečená doména:
$ kdig @127.0.0.1 -p 53533 +short www.unsigned.cz 217.31.205.51
- Chybně podepsaná doména (server vrací SERVFAIL):
$ kdig @127.0.0.1 -p 53533 +short www.rhybar.cz ; Warning: failed to query server 127.0.0.1#53533(UDP)
- Chybně podepsaná doména a CD flag (checking disabled):
$ kdig +cd @127.0.0.1 -p 53533 +short www.rhybar.cz 217.31.205.55
Doporučuji se také podívat na výstup Dnsmasq, kde je vidět sestavování řetězu důvěry mezi doménou a důvěryhodným kořenem:
dnsmasq: query[A] www.nic.cz from 127.0.0.1 dnsmasq: forwarded www.nic.cz to 192.168.0.1 dnsmasq: dnssec-query[DNSKEY] nic.cz to 192.168.0.1 dnsmasq: dnssec-query[DS] nic.cz to 192.168.0.1 dnsmasq: dnssec-query[DNSKEY] cz to 192.168.0.1 dnsmasq: dnssec-query[DS] cz to 192.168.0.1 dnsmasq: dnssec-query[DNSKEY] . to 192.168.0.1 dnsmasq: reply . is DNSKEY keytag 40926 dnsmasq: reply . is DNSKEY keytag 19036 dnsmasq: reply cz is DS keytag 54576 dnsmasq: reply cz is DNSKEY keytag 54576 dnsmasq: reply cz is DNSKEY keytag 43883 dnsmasq: reply cz is DNSKEY keytag 8816 dnsmasq: reply nic.cz is DS keytag 59916 dnsmasq: reply nic.cz is DNSKEY keytag 59916 dnsmasq: reply nic.cz is DNSKEY keytag 18996 dnsmasq: validation result is SECURE dnsmasq: reply www.nic.cz is 217.31.205.50 dnsmasq: query[A] www.unsigned.cz from 127.0.0.1 dnsmasq: forwarded www.unsigned.cz to 192.168.0.1 dnsmasq: dnssec-query[DS] www.unsigned.cz to 192.168.0.1 dnsmasq: dnssec-query[DS] unsigned.cz to 192.168.0.1 dnsmasq: validation result is INSECURE dnsmasq: reply www.unsigned.cz is 217.31.205.51 dnsmasq: query[A] www.rhybar.cz from 127.0.0.1 dnsmasq: forwarded www.rhybar.cz to 192.168.0.1 dnsmasq: validation result is BOGUS
Podpora validace DNSSEC v Dnsmasq je určitě dobrá zpráva. Teď už zbývá jen doufat, že ji výrobci routerů začnou zapínat a že se tato technologie přenese zase o kousek blíže ke koncovým zařízením. Náš router Turris je možná jediný domácí router, který DNSSEC ve výchozím nastavení validuje (pomocí Unbound).
Vas router Turris je super.