Sari la conținutul principal

Module native (pentru dezvoltatori)

Utilizarea obișnuită nu necesită module. Acest ghid se adresează dezvoltatorilor și administratorilor care extind serviciul Windows sau Linux cu biblioteci native. Modulele rulează în interiorul serviciului, cu privilegiile acestuia. Instalați numai cod de încredere și păstrați fișierele modulelor, dependențele și configurația în proprietatea administratorului.

Încărcarea unui modul​

Serviciul citește fișierele *.conf din directorul modules.d aflat lângă fișierul de configurare. Locațiile implicite sunt:

SistemConfigurația modulelorFormat bibliotecă
Linux/etc/mudfish-dns/modules.d/.so
Windows%ProgramData%\Mudfish DNS\modules.d\.dll

În fiecare fișier, introduceți câte o cale absolută de bibliotecă pe linie. De exemplu, /etc/mudfish-dns/modules.d/10-policy.conf poate conține:

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

Fișierele sunt citite în ordinea numelor, iar liniile în ordinea din fiecare fișier. Liniile goale și cele care încep cu # sunt ignorate. Nu folosiți ghilimele în jurul căilor, variabile de mediu sau comentarii la sfârșitul liniei: acestea nu sunt interpretate. Și în Windows trebuie introdusă calea absolută completă, inclusiv dacă are spații.

După adăugarea, modificarea sau eliminarea unui modul, reporniți serviciul. În Linux:

sudo systemctl restart mudfish-dns.service

În Windows, reporniți serviciul Mudfish DNS din administrarea serviciilor. Pornește DNS, Oprește DNS și Aplică setările din aplicație nu reîncarcă modulele. Dacă fișierul de configurare nu poate fi citit, calea este greșită sau încărcarea ori inițializarea eșuează, serviciul nu pornește. Absența directorului de module sau un director gol sunt permise.

În timpul dezvoltării, puteți repeta argumentul --module pentru încărcarea bibliotecilor în ordinea argumentelor, înlocuind încărcarea automată din modules.d. --config FILE schimbă și locația directorului de module de lângă configurație. --restore-dns efectuează restabilirea fără încărcarea modulelor.

Implementarea hook-urilor​

Consultați antetul mudfish_dns_module.h sau descărcați mudfish_dns_module.h. Antetul definește structurile, hook-urile, acțiunile și regulile de durată de viață a datelor. Acest ghid folosește C ABI v2. Exportați mudfish_dns_module_init_v2() și verificați MUDFISH_DNS_MODULE_ABI_V2 și dimensiunea structurii primite înainte de completarea hook-urilor. Returnați 0 la inițializarea reușită.

HookMomentul apelării
on_dns_queryDupă acceptarea interogării parsate, înainte de consultarea cache-ului sau transmitere.
on_dns_responseDupă selectarea răspunsului, înainte de stocarea în cache sau returnarea către client. Și răspunsurile din cache trec prin acest hook.
on_web_helloDupă verificarea inițială HTTP Host/TLS SNI, înainte de conectare sau procesarea datelor inițiale.
on_web_dataDupă citirea datelor ulterioare de la client sau server, înainte de transmitere.

Acțiuni DNS​

Hook-urile DNS v2 returnează 0 la succes și setează result->action.

AcțiuneEfect
MUDFISH_DNS_CONTINUEContinuă cu următorul modul și procesarea obișnuită.
MUDFISH_DNS_ALLOWÎncheie lanțul curent de hook-uri și continuă interogarea DNS obișnuită sau returnează răspunsul selectat.
MUDFISH_DNS_BLOCKReturnează REFUSED.
MUDFISH_DNS_DROPElimină cererea fără răspuns DNS.
MUDFISH_DNS_ANSWERGenerează un răspuns cu adresa IPv4/IPv6 și TTL-ul furnizate.
MUDFISH_DNS_REPLACEFolosește răspunsul DNS complet în format de rețea furnizat de modul.

Nu returnați direct constantele acțiunilor din hook-urile DNS v2. O valoare de retur diferită de 0 sau un rezultat nevalid produce SERVFAIL. ALLOW încheie numai lanțul curent; nu ocolește regulile de domeniu, permisiunile metodelor de transport sau verificarea certificatelor. Rezultatele interogărilor, cu excepția DROP, trec și prin hook-urile de răspuns.

Hook-urile web returnează direct MUDFISH_DNS_CONTINUE sau MUDFISH_DNS_REJECT. Respingerea unei cereri web închide conexiunea. Hook-urile web necesită protecția web activată și nu primesc conținut HTTPS decriptat.

Buffere, fire de execuție și cache​

Evenimentele și bufferele de intrare sunt doar pentru citire și valabile numai în timpul callback-ului. Răspunsurile de înlocuire trebuie să folosească memorie deținută de modul, valabilă până la următorul callback al modulului sau la distrugere. Nu returnați memorie de pe stivă sau pointeri împrumutați din eveniment. ID-ul DNS, opcode-ul și întrebarea din răspunsul înlocuit trebuie să corespundă interogării originale. Callback-urile unei instanțe rulează secvențial, dar pot fi apelate din fire diferite. Încheiați-le rapid și nu propagați excepții peste limita ABI.

Rezultatele generate, înlocuite, blocate sau eliminate nu sunt stocate în cache-ul gazdei. Înlocuirea unui răspuns din cache nu modifică intrarea originală. Gazda șterge indicatorul AD din răspunsurile înlocuite și nu verifică sau resemnează DNSSEC. Modulele care modifică date semnate trebuie să gestioneze semnăturile invalidate.

Exemplu și antet​

Paginile următoare conțin exemplul complet și antetul necesar. Nu trebuie să descărcați separat arborele sursă Mudfish DNS.

FișierConținut
policy.c — exemplu de politică DNSPermiterea, blocarea și eliminarea interogărilor, generarea răspunsurilor IP, modificarea adreselor și TTL-ului. Include comenzi de compilare și testare Linux.
mudfish_dns_module.h — antetul modululuiDeclarații ABI, semnături de hook-uri, constante de acțiune și reguli de proprietate a bufferelor.

Înainte de compilare, descărcați policy.c și mudfish_dns_module.h în același director. Comanda exemplului generează o bibliotecă Linux .so.