Нэйтив модулиуд (хөгжүүлэгчдэд зориулсан)
Ердийн хэрэглээнд модулиуд шаардлагагүй. Энэхүү заавар нь нэйтив сангаар дамжуулан 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_BLOCK | REFUSED буцаана. |
MUDFISH_DNS_DROP | DNS хариу илгээлгүйгээр хаяна. |
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 санг үүсгэнэ.