Eida.cz - Domácí Knot DNS

Domácí Knot DNS

Eida

Ó, nebojme se, nebude řeč o někom konkrétním, ani o Svíčce. Ale v rámci procesu úprav je nutné neustále dělat každý den alespoň jednu inovaci. A pokud se někdo ptá proč... tak... proč vlastně ne? Cokoliv nás posune ve vlastním zdokonalení dál, cokoliv nám dá pocit vyššího ranku, to se počítá. A to i hvězdám navzdory, kdyby se vše ostatní spiklo. Musíme věřit, neexistují žádné limity.

Po neustálých změnách v DNS a přenosech zón a zápisech do zón a správě sítí a zón občas přijde spásná, dlouho odkládaná myšlenka, totiž pokusit se všechno dělat ještě efektivněji. A je to dvojsečná zbraň, protože Kaluž by mohl mít radost a zároveň mi vynadat, že sice používám, ale kdovíjakým způsobem jeho kočičácké počiny, a to konkrétně Knot DNS a Knot Resolver. Hned na úvod se sluší říct, že jsou to super projekty pro profesionální nasazení, ale už ne tak moc dobře se hodí na homelaby. A přesto, pracuje se s nimi i v takovýchto podmínkách o dost snáze, než s kolosálním BINDem. 

Architektura AD s Knot DNS a Knot Resolverem
Architektura AD s Knot DNS a Knot Resolverem

Navržená upravená architektura vychází z logiky věci, kdy je potřeba spravovat vlastní zóny, ale také používat nějaký rozumný resolver. Jenže v rámci Knotu jedno nesupluje druhé, ačkoliv by třeba ChatGPT mohla tvrdit opak. Knot DNS je čistě autoritativní server pro správu, údržbu a podepisování zón, kdežto Knot Resolver provádí tu otrockou práci s překlady. Aby to bylo možné používat na síti tak, aby se to navzájem doplňovalo, bylo potřeba ujasnit si, co by to vlastně mělo dělat. Vzhledem k tomu, že LANové zóny se přenášejí z DCček a není potřeba je už nikam dál publikovat, může DNS server běžet pouze lokálně – a aby se zabránilo zmatení nebo zmaštění portů, použije se nějaké jiné číslo než 53, resp. 853, třeba v tomto ukázkovém případě 1053 a 1853.

Nastavení transferů pak bude extrémně přímočaré, protože konfigurace je na rozdíl od BIND9 dost snadná. V remote specifikaci stačí pouze označit DCčka, v šablonách (template) jim do výchozího hned DCčka navolit jako master a zapnout podepisování. Hotovo, dodefinování zón bude doslova na pár zbylých řádků. Tím to funguje a není potřeba se o nic dalšího starat.

knot.conf 762 bajtů
# Knot DNS /etc/knot/knot.conf

server:
    rundir: "/run/knot"
    user: knot:knot
    automatic-acl: on
    listen: [ 127.0.0.1@1053, ::1@1053 ]
    listen-quic: [ 172.0.0.1@1853, ::1@1853 ]

log:
  - target: syslog
    any: info

database:
    storage: "/etc/knot/data"

remote:
  - id: dc1
    address: [ cafe:a:b:c::dc1, 10.0.1.10 ]
  - id: dc2
    address: [ cafe:a:b:c::dc2, 10.0.1.20 ]

template:
  # výchozí nastavení pro DCčka
  - id: default
    storage: "/etc/knot/zones"
    master: [ dc1, dc2 ]
    file: "%s.zone"
    dnssec-signing: on

zone:
  # AD LAN
  - domain: domena.lan
  - domain: _msdcs.domena.lan
  - domain: 0.1.10.in-addr.arpa
  - domain: c.0.0.0.b.0.0.0.a.0.0.0.e.f.a.c.ip6.arpa
  # primární zóny (IN)
  - domain: extranet.ext
Knot DNS

Původně mě zachvátil strach, že Resolver se bude konfigurovat o poznání hůře, zvláště když by měl umět správně používat RPZ, které se už nějakou dobu používají po vzoru PiHole na BINDu, kterýžto byl inspirován podobným setupem pro OpenBSD unboud. Opak je ale pravdou, za pár minut bylo hotovo, protože RPZ má prakticky stejnou strukturu a spravuje se podstatně snáze.

Velmi také potěšilo, že je stejně extrémně snadné udělat DNS hairpin pro lokální služby – kéž by si z toho vzali naši čičmundové ponaučení, pak už by nebylo tak zbytečně složité rozcházet Bakaláře extrémními způsoby. Politika přesměrování je ve skutečnosti tak přímočará, až srdce skáče. Kdykoliv dojde k překladu na konkrétní adresu, kterou je zde myšlena adresa vnějšího rozhraní sítě, provede se její nahrazení na konkrétní adresu obsluhy v LAN. A hotovo.

Stejně tak stačí zadefinovat výčet vnitřních domén a spolu s užitečným zákazem zbytečného cachování odeslat jejich překlad dolu na výše definovaný Knot DNS, tedy na lokální stroj s novým portem.

kresd.conf 1.82 KiB
-- SPDX-License-Identifier: CC0-1.0
-- vim:syntax=lua:set ts=4 sw=4:
-- Refer to manual: https://knot-resolver.readthedocs.org/en/stable/

-- síť
net.listen('127.0.0.53', 53, { kind = 'dns' })
net.listen('127.0.0.53', 853, { kind = 'tls' })

net.listen('127.0.0.1', 53, { kind = 'dns' })
net.listen('127.0.0.1', 853, { kind = 'tls' })

net.listen('::1', 53, { kind = 'dns' })
net.listen('::1', 853, { kind = 'tls' })

net.listen('10.0.1.100', 53, { kind = 'dns' })
net.listen('10.0.1.100', 853, { kind = 'tls' })

net.listen('cafe:a:b:c::100', 53, { kind = 'dns' })
net.listen('cafe:a:b:c::100', 853, { kind = 'tls' })

-- moduly
modules = {
	'hints > iterate',  -- Allow loading /etc/hosts or custom root hints
	'stats',            -- Track internal statistics
	'predict',          -- Prefetch expiring/frequent records
}

predict.config({
    window = 30, 
    period = 24*(60/15)
})

-- cache
cache.size = 100 * MB

-- obecný hairpin pro webserver
policy.add(policy.all(policy.REROUTE({['WAN.IPv4.address.0'] = '10.0.1.60'})), true)

-- RPZ - převzato přímo z PiHole/BIND9
policy.add(policy.rpz(policy.DENY_MSG('Zablokováno RPZ'), '/etc/knot-resolver/rpz.zone', true))

-- vnitřní domény
internalDomains = policy.todnames( {
  'domena.lan', '_domena.eida.lan',
  '1.0.10.in-addr.arpa',
  'c.0.0.0.b.0.0.0.a.0.0.0.e.f.a.c.ip6.arpa', 

  'extranet.ext',
})

-- přesměrování vnitřních domén na knotd
policy.add(policy.suffix(policy.FLAGS({'NO_CACHE'}), internalDomains))
policy.add(policy.suffix(policy.STUB({'127.0.0.1@1053'}), internalDomains))

-- upstream servery - CZ.NIC ODVR přes TLS
policy.add(policy.all(
   policy.TLS_FORWARD({
      {'2001:148f:ffff::1', hostname='odvr.nic.cz'},
      {'2001:148f:fffe::1', hostname='odvr.nic.cz'},
      {'193.17.47.1', hostname='odvr.nic.cz'},
      {'185.43.135.1', hostname='odvr.nic.cz'},
   })
))
Knot Resolver

Pak už zbývá jen vyřídit obsluhu všech ostatních požadavků, ideálně šifrovaným TLS kanálem na otevřené resolvery CZ NIC. Žádná věda, byla to opravdu zábava. Snad by tedy měl Kaluž radost z toho, že mám radost a nemám žádný veřejný pitomý dotaz, ačkoliv mě jich pár uvnitř napadlo. Tímto tedy domácí Knot DNS zatím asi vřele doporučuji, i když je možná ještě brzo přes oheň skákat, ale všechno vypadá opravdu suprově, jednoduše a stabilně. A když porovnám ještě nároky, tak to celé dohromady nebere ani 120 MB RAM, kdežto BIND9 si ukousával okolo 250 MB, aniž by byl pod nějakou zátěží. Což o to, paměti i jader je na tohle dost. Ale višjak, je to inovace.

Tento článek přečetlo již 86 čtenářů (0 dnes).

Komentáře

Nový komentář