Үндсэн агуулга руу алгасах

Нэйтив модулиуд (хөгжүүлэгчдэд зориулсан)

Ердийн хэрэглээнд модулиуд шаардлагагүй. Энэхүү заавар нь нэйтив сангаар дамжуулан Windows эсвэл Linux үйлчилгээний боломжийг өргөтгөхийг хүссэн хөгжүүлэгчид болон админуудад зориулагдсан болно. Модулиуд нь үйлчилгээний дотор үйлчилгээний эрхээр ажилладаг. Зөвхөн найдвартай кодыг суулгаж, модуль файл, хамаарал бүхий файлууд болон тохиргооны файлуудыг администраторын эзэмшилд байлгах хэрэгтэй.

Модуль ачаалах​

Үйлчилгээ нь тохиргооны файлын хажууд байрлах modules.d директороос *.conf файлуудыг уншдаг. Үндсэн байршил дараах байдалтай байна.

Үйлдлийн системМодулийн тохиргооны байршилСангийн формат
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 үйлдлүүд​

v2 DNS хук нь амжилттай үед 0-ийг буцаах бөгөөд result->action-ийг тохируулна.

ҮйлдэлҮр дүн
MUDFISH_DNS_CONTINUEДараагийн модуль болон ердийн боловсруулалтыг үргэлжлүүлнэ.
MUDFISH_DNS_ALLOWОдоогийн хук гинжийг төгсгөж ердийн DNS хайлтыг үргэлжлүүлэх эсвэл сонгосон хариуг буцаана.
MUDFISH_DNS_BLOCKREFUSED буцаана.
MUDFISH_DNS_DROPDNS хариу илгээлгүйгээр хаяна.
MUDFISH_DNS_ANSWERӨгөгдсөн IPv4/IPv6 хаяг болон TTL-ээр хариу үүсгэнэ.
MUDFISH_DNS_REPLACEМодулийн нийлүүлсэн бүрэн DNS wire форматын хариуг ашиглана.

v2 DNS хукаас үйлдлийн тогтмол утгыг шууд бүү буцаагаарай. Функц 0-ээс өөр утга буцаах эсвэл үр дүн хүчингүй болбол SERVFAIL үүснэ. ALLOW нь зөвхөн одоогийн хук гинжийг төгсгөх бөгөөд домэйны дүрэм, дамжуулах аргын зөвшөөрөл, сертификатын шалгалтыг тойрохгүй. DROP-оос бусад бүх асуулгын үр дүн хариуны хукаар мөн дамжина.

Вэб хук нь MUDFISH_DNS_CONTINUE эсвэл MUDFISH_DNS_REJECT-ийг шууд буцаана. Вэб хүсэлтийг татгалзвал холболтыг тасална. Вэб хук ашиглахын тулд вэб хамгаалалт асаалттай байх ёстой бөгөөд тайлагдсан HTTPS контент олгогдохгүй.

Буфер, урсгал (threading) болон кэш​

Оролтын эвент болон буфер нь зөвхөн унших зориулалттай бөгөөд зөвхөн callback гүйцэтгэгдэх хугацаанд хүчинтэй байна. Орлуулах хариу нь модулийн өөрийн эзэмшлийн санах ойг ашиглах ёстой бөгөөд тухайн модулийн дараагийн callback эсвэл дуусах хугацаа хүртэл хүчинтэй байх ёстой. Стек санах ой эсвэл эвентээс зээлж авсан заагчийг бүү буцаагаарай. Орлуулах хариуны DNS ID, opcode, асуулга нь анхны асуулгатай тохирох ёстой. Нэг инстанцын callback-ууд дараалж ажиллах боловч өөр өөр thread-ээс дуудагдаж болно. Callback-ийг хурдан дуусгаж, ABI заагийг давуулан exception бүү дамжуулаарай.

Үүсгэсэн, орлуулсан, хаасан, хаясан үр дүнг хостын кэшид хадгалахгүй. Кэшлэгдсэн хариуг орлуулсан ч анхны кэшийн бичилт өөрчлөгдөхгүй. Хост нь орлуулсан хариуны AD тугийг арилгах бөгөөд DNSSEC баталгаажуулалт эсвэл дахин гарын үсэг зурах үйлдэл хийхгүй. Гарын үсэгтэй өгөгдлийг өөрчилдөг модуль нь хүчингүй болсон гарын үсгийг өөрөө хариуцах ёстой.

Жишээ болон толгой файл​

Доорх хуудсуудад бүрэн жишээний эх код болон шаардлагатай толгой файл бий. Mudfish DNS-ийн эх кодыг бүхэлд нь татаж авах шаардлагагүй.

ФайлАгуулга
policy.c — DNS бодлогын жишээDNS асуулгыг зөвшөөрөх, хаах, хаях, IP хариу үүсгэх, хариуны хаяг болон TTL-ийг өөрчлөх. Linux-ийн build болон тестлэх тушаалуудыг мөн багтаасан.
mudfish_dns_module.h — Модулийн толгой файлABI зарлал, хук сигнатур, үйлдлийн тогтмолууд, буфер эзэмшлийн дүрмүүд.

Бүтээхийн өмнө policy.c болон mudfish_dns_module.h-ийг нэг директорт татаж авна уу. Жишээний build тушаал нь Linux .so санг үүсгэнэ.