رفتن به محتوای اصلی

ماژول‌های بومی برای توسعه‌دهندگان

برای استفادهٔ معمولی، ماژول لازم نیست. این راهنما برای توسعه‌دهندگان و مدیرانی است که می‌خواهند قابلیت‌های سرویس 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_BLOCKREFUSED برگردانده می‌شود.
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 تولید می‌کند.