Přeskočit na hlavní obsah

Nativní moduly (pro vývojáře)

Pro běžné používání nejsou moduly potřeba. Tento návod je určen vývojářům a správcům, kteří chtějí rozšířit službu pro Windows nebo Linux pomocí nativních knihoven. Moduly běží uvnitř služby s jejími oprávněními. Instalujte pouze důvěryhodný kód a zajistěte, aby soubory modulů, závislostí a konfigurace vlastnil správce.

Načtení modulu​

Služba čte soubory *.conf v adresáři modules.d vedle konfiguračního souboru. Výchozí umístění jsou:

Operační systémUmístění konfigurace modulůFormát knihovny
Linux/etc/mudfish-dns/modules.d/.so
Windows%ProgramData%\Mudfish DNS\modules.d\.dll

Do každého souboru zadejte jednu absolutní cestu ke knihovně na řádek. Například /etc/mudfish-dns/modules.d/10-policy.conf obsahuje:

/usr/lib/mudfish-dns/modules/policy.so

Soubory se čtou v pořadí názvů a uvnitř souboru v pořadí řádků. Prázdné řádky a řádky začínající # se ignorují. Nepoužívejte uvozovky kolem cest, proměnné prostředí ani komentáře na konci řádku; tyto zápisy se nevyhodnocují. I ve Windows zapisujte celou absolutní cestu, včetně případných mezer.

Po přidání, změně nebo odebrání modulu restartujte službu. V Linuxu použijte:

sudo systemctl restart mudfish-dns.service

Ve Windows restartujte službu Mudfish DNS ve správě služeb. Volby Spustit DNS, Zastavit DNS a Použít nastavení v aplikaci moduly znovu nenačítají. Pokud nelze přečíst konfigurační soubor, cesta je nesprávná nebo dojde k chybě načtení či inicializace, služba se nespustí. Chybějící nebo prázdný adresář modulů je povolen.

Při vývoji můžete opakovat argument --module a načíst knihovny v pořadí argumentů. Tím se nahradí automatické načítání z modules.d. --config FILE mění také umístění adresáře modulů vedle konfigurace. --restore-dns provede obnovu bez načítání modulů.

Implementace hooků​

Přečtěte si hlavičku mudfish_dns_module.h nebo stáhněte mudfish_dns_module.h. Hlavička definuje struktury, hooky, akce a pravidla životnosti dat používaná modulem. Tento návod používá C ABI v2. Exportujte mudfish_dns_module_init_v2() a před vyplněním hooků ověřte MUDFISH_DNS_MODULE_ABI_V2 a předanou velikost struktury. Při úspěšné inicializaci vraťte 0.

HookOkamžik volání
on_dns_queryPo přijetí rozparsovaného dotazu, před vyhledáním v mezipaměti nebo předáním dál.
on_dns_responsePo výběru odpovědi, před uložením do mezipaměti nebo vrácením klientovi. Procházejí jím i odpovědi z mezipaměti.
on_web_helloPo počáteční kontrole HTTP Host/TLS SNI, před připojením nebo zpracováním počátečních dat.
on_web_dataPo načtení následných dat klienta nebo serveru, před jejich předáním dál.

Akce DNS​

Hooky DNS v2 vracejí při úspěchu 0 a nastavují result->action.

AkceÚčinek
MUDFISH_DNS_CONTINUEPokračuje dalším modulem a běžným zpracováním.
MUDFISH_DNS_ALLOWUkončí aktuální řetězec hooků a pokračuje běžným dotazem DNS nebo vrátí vybranou odpověď.
MUDFISH_DNS_BLOCKVrátí REFUSED.
MUDFISH_DNS_DROPZahodí požadavek bez odeslání odpovědi DNS.
MUDFISH_DNS_ANSWERVytvoří odpověď z poskytnuté adresy IPv4/IPv6 a TTL.
MUDFISH_DNS_REPLACEPoužije úplnou odpověď DNS v přenosovém formátu dodanou modulem.

V hooku DNS v2 nevracejte přímo konstantu akce. Nenulová návratová hodnota nebo neplatný výsledek způsobí SERVFAIL. ALLOW ukončí pouze aktuální řetězec hooků; neobchází pravidla domén, povolení způsobů přenosu ani kontroly certifikátů. Výsledky dotazů kromě DROP procházejí také hookem odpovědi.

Webové hooky přímo vracejí MUDFISH_DNS_CONTINUE nebo MUDFISH_DNS_REJECT. Odmítnutí webového požadavku ukončí spojení. Pro použití webových hooků musí být zapnutá ochrana webu; dešifrovaný obsah HTTPS není poskytován.

Buffery, vlákna a mezipaměť​

Vstupní události a buffery jsou pouze pro čtení a platí jen po dobu callbacku. Náhradní odpověď musí používat paměť vlastněnou modulem a zůstat platná do dalšího callbacku tohoto modulu nebo jeho ukončení. Nevracejte paměť na zásobníku ani ukazatel vypůjčený z události. DNS ID, opcode a otázka náhradní odpovědi musí odpovídat původnímu dotazu. Callbacky jedné instance se provádějí postupně, mohou však být volány z různých vláken. Dokončujte je rychle a nenechte výjimky překročit hranici ABI.

Vytvořené, nahrazené, blokované a zahozené výsledky se neukládají do mezipaměti hostitele. Nahrazení odpovědi z mezipaměti nemění původní záznam. Hostitel u náhradních odpovědí maže příznak AD a neprovádí ověření ani nové podepsání DNSSEC. Modul upravující podepsaná data musí sám ošetřit zneplatněné podpisy.

Příklad a hlavička​

Následující stránky obsahují celý příklad a potřebnou hlavičku. Není třeba samostatně stahovat zdrojový strom Mudfish DNS.

SouborObsah
policy.c — příklad politiky DNSPovolení, blokování a zahození dotazů DNS, generování IP odpovědí, změny adres a TTL. Obsahuje také příkazy sestavení a testování v Linuxu.
mudfish_dns_module.h — hlavička moduluDeklarace ABI, signatury hooků, konstanty akcí a pravidla vlastnictví bufferů.

Před sestavením stáhněte policy.c a mudfish_dns_module.h do stejného adresáře. Příkazy v příkladu vytvářejí linuxovou knihovnu .so.