Нативни модули (за програмере)
За уобичајену употребу модули нису потребни. Овај водич је намењен програмерима и администраторима који желе да нативним библиотекама прошире Windows или Linux услугу. Модули раде унутар услуге, са њеним овлашћењима. Инсталирајте само поуздан код и обезбедите да датотеке модула, зависности и конфигурације остану у власништву администратора.
Учитавање модула
Услуга чита *.conf датотеке из директоријума modules.d поред конфигурационе датотеке. Подразумеване локације су следеће.
| Оперативни систем | Локација конфигурације модула | Формат библиотеке |
|---|---|---|
| Linux | /etc/mudfish-dns/modules.d/ | .so |
| Windows | %ProgramData%\Mudfish DNS\modules.d\ | .dll |
У сваку датотеку упишите апсолутне путање библиотека, по једну у реду. На пример, /etc/mudfish-dns/modules.d/10-policy.conf садржи:
/usr/lib/mudfish-dns/modules/policy.so
Датотеке се читају редом по називу, а у свакој датотеци редом по линијама. Празни редови и редови који почињу са # се игноришу. Не стављајте путање под наводнике и не користите променљиве окружења или коментаре на крају реда: они се не тумаче. И на Windows-у у датотеку упишите целу апсолутну путању, укључујући размаке.
После додавања, измене или уклањања модула поново покрените услугу. На Linux-у користите:
sudo systemctl restart mudfish-dns.service
На Windows-у поново покрените услугу Mudfish DNS у управљању услугама. Дугмад Покрени DNS, Заустави DNS и Примени подешавања у апликацији не учитавају модуле поново. Ако конфигурациона датотека не може да се прочита, путања је погрешна или настане грешка учитавања или иницијализације, услуга се не покреће. Дозвољено је да директоријум модула не постоји или буде празан.
Током развоја можете више пута задати --module да бисте библиотеке учитали редом по аргументима. То замењује аутоматско учитавање из modules.d. --config FILE мења и локацију директоријума модула поред конфигурационе датотеке. --restore-dns обавља враћање без учитавања модула.
Имплементација кука
Прочитајте заглавље mudfish_dns_module.h или преузмите mudfish_dns_module.h. Оно дефинише структуре, куке, радње и правила животног века података. Овај водич користи C ABI v2. Извезите mudfish_dns_module_init_v2() и пре попуњавања кука проверите MUDFISH_DNS_MODULE_ABI_V2 и прослеђену величину структуре. Ако иницијализација успе, вратите 0.
| Кука | Тренутак позива |
|---|---|
on_dns_query | После прихватања парсираног упита, пре провере кеша или прослеђивања. |
on_dns_response | После избора одговора, пре чувања у кешу или враћања клијенту. И кеширани одговори пролазе ову куку. |
on_web_hello | После почетне провере HTTP Host/TLS SNI, пре повезивања или обраде почетних података. |
on_web_data | После читања наредних података клијента или сервера, пре прослеђивања. |
DNS радње
DNS куке v2 враћају 0 при успеху и постављају result->action.
| Радња | Ефекат |
|---|---|
MUDFISH_DNS_CONTINUE | Наставља следећи модул и уобичајену обраду. |
MUDFISH_DNS_ALLOW | Завршава тренутни ланац кука и наставља уобичајени DNS упит или враћа изабрани одговор. |
MUDFISH_DNS_BLOCK | Враћа REFUSED. |
MUDFISH_DNS_DROP | Одбацује без слања DNS одговора. |
MUDFISH_DNS_ANSWER | Прави одговор са датом IPv4/IPv6 адресом и TTL-ом. |
MUDFISH_DNS_REPLACE | Користи комплетан DNS одговор у wire формату који је дао модул. |
Не враћајте константу радње непосредно из DNS куке v2. Ненулта повратна вредност или неважећи резултат изазива SERVFAIL. ALLOW завршава само тренутни ланац кука и не заобилази правила домена, дозволе транспорта или проверу сертификата. Резултати упита осим DROP пролазе и кроз куке одговора.
Веб-куке непосредно враћају MUDFISH_DNS_CONTINUE или MUDFISH_DNS_REJECT. Одбијање веб-захтева затвара везу. За веб-куке мора бити укључена веб-заштита; дешифровани HTTPS садржај није доступан.
Бафери, нити и кеш
Улазни догађаји и бафери су само за читање и важе само током повратног позива. Заменски одговор мора користити меморију у власништву модула и остати важећи до следећег повратног позива тог модула или његовог гашења. Не враћајте меморију са стека или показиваче позајмљене из догађаја. DNS ID, opcode и питање заменског одговора морају одговарати изворном упиту. Позиви једне инстанце извршавају се редом, али могу долазити са различитих нити. Позиви треба да се брзо заврше и не смеју пропуштати изузетке преко ABI границе.
Генерисани, замењени, блокирани и одбачени резултати не чувају се у кешу домаћина. Замена кешираног одговора не мења изворну ставку кеша. Домаћин уклања AD заставицу заменског одговора и не проверава DNSSEC нити поново потписује податке. Модул који мења потписане податке мора сам обрадити потписе који су постали неважећи.
Пример и заглавље
Следеће странице садрже цео изворни пример и потребно заглавље. Није потребно засебно преузимати стабло изворног кода Mudfish DNS-а.
| Датотека | Садржај |
|---|---|
| policy.c — пример DNS политике | Дозвољавање, блокирање и одбацивање DNS упита, генерисање IP одговора, промена адресе и TTL-а одговора. Укључује Linux команде за изградњу и тестирање. |
| mudfish_dns_module.h — заглавље модула | ABI декларације, потписи кука, константе радњи и правила власништва бафера. |
Пре изградње преузмите policy.c и mudfish_dns_module.h у исти директоријум. Команде примера праве Linux .so библиотеку.