ماژولهای بومی برای توسعهدهندگان
برای استفادهٔ معمولی، ماژول لازم نیست. این راهنما برای توسعهدهندگان و مدیرانی است که میخواهند قابلیتهای سرویس 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 ارائه نمیشود.
بافرها، رشتهها و حافظهٔ نهان
رویدادها و بافرهای ورودی فقط خواندنی هستند و فقط هنگام اجرای callback اعتبار دارند. پاسخ جایگزین باید در حافظهٔ متعلق به ماژول باشد و تا callback بعدی همان ماژول یا پایان آن معتبر بماند. حافظهٔ پشته یا اشارهگر قرضگرفتهشده از رویداد را برنگردانید. DNS ID، opcode و پرسش پاسخ جایگزین باید با پرسوجوی اصلی منطبق باشند. callbackهای یک نمونه به ترتیب اجرا میشوند، اما ممکن است از رشتههای متفاوت فراخوانی شوند. callback را کوتاه نگه دارید و استثنا را از مرز 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 تولید میکند.