Kresd a PTR zaznamy pro LAN stroje

Zdravim,
chtel bych se zeptat jestli porad jeste trva ten stav, kdy bez pomoci dnsmasq je Foris volba “Enable DHCP clients in DNS” limitovana jen na A zaznamy (t.j. neni PTR, neni CNAME a mam dojem ze neni ani AAAA). A jestli nahodou neexistuje uz nejaky aktualnejsi reseni jak obejit “private_zones” z /usr/lib/kdns_modules/policy.lua?

Zkratka, docela rad bych si pral aby mi bez potreby forwardu/stubu pres dnsmasq fungovalo:

  1. Resolving u lokalnich jmen pro domenu “.lan” (mam jmeno, dostanu privatni IPv4 adresu)
  2. Resolving u lokalnich IP adres (mam privatni IPv4 adresu, dostanu jmeno v ramci “.lan”)
  3. Privatni PTR mimo lokalni site at na to spadne politika “private_zones” (pro co neni lokalni “hint” a je to privat, sup do /dev/null)
  4. Resolving z domeny “ipv6.abc.def” at je ziskavan pres stub ze stroje na LAN. (tahle domena nesouvisi s “.lan”, ale jsou v ni prevazne lokalni stroje, konkretne jejich sestkovy adresy - tyhle jmena musi byt resolvnutelna i bez Internetove konektivity).
  5. Hint pro ‘mail.abc.def’ ze je lokalni IPv4 + IPv6 (“vyreseno” pomoci “NAT loopback” a IPv4 je verejna - nevim jak to dopadne bez Inetu, ale protoze v tu chvili ten mail stejne nepujde prijmout/odeslat, tak je to asi vcelku jedno)

Konfigurace kresd mi v tomhle misty pripomina sendmail.cf - kdyz uz neco funguje, tak se akorat tak modlim aby to fungovalo i po pripadnym upgradu.

Tak zatim jsem na tom:

  1. Tohle je v pohode, to resi ono “Enable DHCP clients in DNS”.
  2. Nejbliz jsem se k tomuhle dostal radkou policy.add(policy.suffix(policy.PASS, {todname('1.168.192.in-addr.arpa.')})), ale tim se objevil problem novy a sice ze PTR, ktery nejsou v hints, tak se to hodla ptat “do sveta” coz jaksi neni uplne to co bych rad. Asi uplne nechapu dokumentaci nebo ‘policy’ nebo kresd obecne, ale “‘policy > hints’” v “modules” neuprednostni hints, policy mi to bez primyho PASSu stejne zablokuje.
  3. Netusim jak tohle zachovat pro IPka co nejsou v hints.
  4. Vyreseno za pomoci radky policy.add(policy.suffix(policy.STUB('2001:db8::2'), {todname('ipv6.abc.def.')})) (otazkou je jestli je to konfiguracne koser)
  5. “Vyreseno” za pomoci:
-- Nevim proc, ale bez nasledujici radky se tam obcas objevila verejna IPv4
hints.del('mail.abc.def')
hints.set('mail.abc.def 192.168.1.2')
hints.set('mail.abc.def 2001:db8::2')
-- Nasledujici je pro uchovani spravnyho PTR, jinak se tam cpe "mail.abc.def"
hints.del('xy.lan 192.168.1.2')
hints.set('xy.lan 192.168.1.2') -- mozna proto, ze uz je v hints, tak musi byt pouzita predchozi radka

(Opet, otazkou je, jestli je to koser)

hints['mail.abc.def']="192.168.1.2" jsem zkousel, chovalo se to zvlastne. I klidne mozna proto, ze uz to bylo ve stadiu “zkouska zkousky, ktera je zkouskou”.

Pro dnesek konec zkousek, vracim zpet cfg s pouzitim dnsmasq.

  1. Zpracovávat hints před policy nejde, tak jak jsou teď moduly napsané, protože policy pracuje už ve fázi příchodu requestu a hints až ve fázi jeho řešení.
  2. Neví se jak dosáhnout ideálního řešení, tedy že jména v hints se použijí a zbytek se zablokuje. Víme o tom, ale asi na to nedojde nijak brzy.
  3. Přijde mi zcela v pořádku.
  4. Pravděpodobně se budou míchat data z dhcp a ručně přidaná. Nejsem si hned jistý co to bude dělat při aktualizaci dhcp dat. Použití hints['foo'] je jen syntaktický cukr za .set() a .get().
1 Like

Dekuju za zkontrolovani.
Ohledne bodu 2.: Jak si teda mam vylozit radku co je uvedena v dokumentaci jako priklad:

   'policy > hints',   -- Policy AFTER hints

Ohledne bodu 5.: To verejny IPko pro mail.abc.def je tak maximalne v DNS v Internetu (t.j. neni v TO - teda je, na wan iface, ale neni nikde v dns/dhcp na TO), takze muselo prijit jedine resolvovanim.
S tim vnitrnim IPkem (pro xy.lan) jsem si to vysvetloval (bez jakehokoliv hledani jak je to doopravdy), ze to muze byt tim, ze dany zaznam uz je do kresd pridany pres drive uvedene hints.config('/tmp/kresd/hints.tmp') (pridane tim “Enable DHCP clients in DNS”) a proto se asi nove zadavany, shodny, hint neprida cimz poslednim hintem pro 192.168.1.2 je mail.abc.def. A protoze dokumentace rika, ze pro PTR se pouzije posledni zadany hint s timhle IPkem, tak musim nejprve z hints smazat xy.lan 192.168.1.2 abych ho tam mohl vzapeti zadat a on se ulozil (tim se stane poslednim on). Samozrejme tohle nema zadny podklad, to jsem si tak jen narychlo vysvetlil sam pro sebe cim to, ze to v tyhle podobe funguje.

Bod 2.: je to taková “interní” záležitost. Každý modul má háčky k různým fázím zpracování. V rámci jednoho háčku se jde v pořadí dle > operátorů, ale mezi fázemi se neskáče.

Bod 5: řekl bych že ano. Neověřoval jsem, že nastává ten daný hints.config() ani obsah hints.tmp. (Dobře znám kresd, jeho “zapojení” do Omnie už ne tak moc.)

Tak 3. bod mam (teoreticky) vyreseny pomoci:

for k,v in pairs(hints.get()) do
        for kk,vv in pairs(v) do
                local val,ret = string.gsub(vv,'(%d+)%.(%d+)%.(%d+)%.(%d+)',"%4.%3.%2.%1.in-addr.arpa.")
                if ret > 0 then
                        policy.add(policy.suffix(policy.PASS, {todname(val)}))
                end
        end
end

Teoreticky. Tedy pouze za predpokladu, ze pripadny update hints by probihal pouze zapisem to /tmp/kresd/hints.tmp s naslednym reloadem kresd (jde vubec knot resolveru rict at si znovu nacte cfg?).

Prakticky mi /etc/resolver/dhcp_host_domain_ng.py znici jakykoliv hints, protoze je nadrsno smaze pres kresd cli socket(?) pomoci hints.config(’/tmp/dhcp.empty’) (proto se mi tam taky objevuje ta verejena IP adresa - on je totiz hint, ze to ma byt privatni IPko, smazany).
No nic, jdu hledat jestli by /tmp/dhcp.empty nemusel byt tak uplne “empty” :slight_smile:
(i kdyz to nebude resit ty policy.add)

P.S.: Priznam se, ze mi neni uplne jasny kde pro policy.del() ziskam id od drive zadanych pravidel (trochu pouzitelneji, ne ze mam 27 pravidel, ale tezko rict co ktery obsahuje). Tady asi kulham na neznalosti Lua, zatim jsem zasekly na:

> policy.rules[36].cb
function: 0x01537278

coz mi o tom pravidlu moc nerekne. V kombinaci s tim ze ty pravidla muze neco pridavat zaziva to dokaze zpusobit jisty pocit bezmoci.
Pripadne jestli je mozny navazat vlastni chain do pravidel (ktery by se pri updatu hints.tmp vyplachl a zadal od nuly stejne jako to ted dela dhcp_host_domain_ng.py u hints).

P.P.S.: Tohle bych asi mel poslat spis na kresd jako takovy, ne sem: V dokumentaci kresd je zajimavy priklad vlastniho pravidla:

policy.add(function (req, query)
        if query:qname():find('%d.%d.%d.224\7in-addr\4arpa') then
                return policy.DENY
        end
end)

ktery ale v praxi skonci s:

error: /usr/local/etc/kresd/config:49: 'struct kr_query' has no member named 'qname'

(verze 2.2.0, dokumentace pro 2.2.0)
V pripade ve 1.5.1, pouzite v TO 3.9.6, to sice nezanadava, ale ani se nezda ze by to provedlo to, co priklad tvrdi.
Ted to bude znit asi hodne osklive, ale ono obecne dokumentace ke kresd se nezda uplne pouzitelna ve chvili kdy bych se mel drzet jen dokumentace (vic mi pomohlo prolejzani lua scriptu v /usr/lib/kdns_modules nez dokumentace). Nerikam ze to nutne musi byt chyba jen na strane dokumentace, ale …

policy.add(...) vrací tabulku, jednou z položek je “id”. Přidaná pravidla jsou ve skutečnosti spustitelné funkce (s nějakou closure), což pokud vím nejde dobře “introspectovat”.

Souhlasím že pouze podle dokumentace složitější vlastní pravidla (a moduly) napsat nejde. Většinou to vyžaduje nějakou znalost vnitřností resolveru. Děkuji za ten chybný příklad z dokumentace, opravíme.

Příklad jsem nahradil jiným v https://gitlab.labs.nic.cz/knot/knot-resolver/merge_requests/568

To jo, u mnou prave pridaneho pravidla si to id jeste muzu schovat. Ale v pripade ze jsem se pripojil na ten socket a koukam na hrst pravidel, at uz pridanych konfigraci, za ziva mnou ci nekym jinym, tak … vlastne nemam vubec nic.

No, toho jsem se bal :frowning:

Jo, šlo by asi udělat to, že by každý generátor pravidel mohl navíc přidat nějaký textový popis který by tam v té tabulce byl vidět. EDIT: takové detaily jsme zatím prostě neřešili – je nás jen pár a práce je spousta.

Tak 5. bod je nakonec prasacky pres zapis do /tmp/dhcp.empty (a aby to nebylo malo spinavy, tak je to v pridavny konfiguraci kresd :slight_smile: - Slo to a navic to zajistuje tu podminku aby se tak stalo pred spustenim /etc/resolver/dhcp_host_domain_ng.py).
Takze az na doplnovani/umazavani politik skrz zakazany privatni PTR je to myslim funkcni. pridavny konfigurak pro kresd tak vypada takhle:

-- Lokalni upravy

-- Puvodne to bylo pres hints.del/set.
-- Ale protoze mi to premazava /etc/resolver/dhcp_host_domain_ng.py, tak je to takhle
f = io.open("/tmp/dhcp.empty","w")
f:write("# Needitovat, vygenerovany z /etc/config-moje/kresd.custom.conf\n")
f:write("# Mel by bejt prazdnej, ale tyhle \"hints\" potrebuju.\n")
f:write("192.168.1.2 xy.lan mail.abc.def\n")
f:write("2001:db8::2 mail.abc.def\n")
f:close()

-- Povoleni PTR alespon pro dopredu nadefinovany hints
for k,v in pairs(hints.get()) do
	for kk,vv in pairs(v) do
		local val,ret = string.gsub(vv,'(%d+)%.(%d+)%.(%d+)%.(%d+)',"%4.%3.%2.%1.in-addr.arpa.")
		if ret > 0 then
			policy.add(policy.suffix(policy.PASS, {todname(val)}))
		end
	end
end

-- Tahle zona ma auth NS na LANce
policy.add(policy.suffix(policy.STUB('2001:db8::2'), {todname('ipv6.abc.def.')}))
1 Like