ပင်မအကြောင်းအရာသို့ ကျော်သွားရန်

Native Modules (ဆော့ဖ်ဝဲရေးသားသူများအတွက်)

ပုံမှန် အသုံးပြုမှုများတွင် module များ မလိုအပ်ပါ။ ဤလမ်းညွှန်သည် native library များဖြင့် Windows သို့မဟုတ် Linux service ၏ လုပ်ဆောင်ချက်များကို တိုးချဲ့လိုသော developer များနှင့် စနစ်စီမံခန့်ခွဲသူများအတွက် ရည်ရွယ်ပါသည်။ Module များသည် service အတွင်း၌ service ခွင့်ပြုချက်များဖြင့် လည်ပတ်ပါသည်။ ယုံကြည်စိတ်ချရသော code များကိုသာ ထည့်သွင်းပြီး module ဖိုင်များ၊ မှီခိုမှု ဖိုင်များနှင့် ဖွဲ့စည်းပုံ ဆက်တင်ဖိုင်များကို စီမံခန့်ခွဲသူ (administrator) သာ ပိုင်ဆိုင်စေရန် ထိန်းသိမ်းပါ။

Module ရယူထည့်သွင်းခြင်း​

Service သည် configuration ဖိုင်ဘေးရှိ modules.d directory မှ *.conf ဖိုင်များကို ဖတ်ရှုပါသည်။ မူရင်း တည်နေရာများမှာ အောက်ပါအတိုင်း ဖြစ်ပါသည်-

လည်ပတ်မှုစနစ်Module ဆက်တင် တည်နေရာLibrary ပုံစံ
Linux/etc/mudfish-dns/modules.d/.so
Windows%ProgramData%\Mudfish DNS\modules.d\.dll

ဖိုင်တစ်ခုချင်းစီတွင် library ၏ absolute path ကို တစ်ကြောင်းလျှင် တစ်ခုစီ ရေးသားရပါမည်။ ဥပမာအားဖြင့် /etc/mudfish-dns/modules.d/10-policy.conf ၏ အကြောင်းအရာမှာ အောက်ပါအတိုင်း ဖြစ်ပါသည်-

/usr/lib/mudfish-dns/modules/policy.so

ဖိုင်အမည် အက္ခရာစဉ်အလိုက် ဖတ်ရှုပြီး ဖိုင်တစ်ခုချင်းစီအတွင်း စာကြောင်းအစဉ်အတိုင်း ဖတ်ရှုပါသည်။ စာကြောင်းဗလာများနှင့် # ဖြင့် စတင်သော စာကြောင်းများကို လျစ်လျူရှုပါမည်။ လမ်းကြောင်းများကို quotes ဖြင့် အုပ်ခြင်း၊ ပတ်ဝန်းကျင် ပြောင်းလဲနိုင်သော တန်ဖိုးများ (environment variables) သို့မဟုတ် စာကြောင်းအဆုံး မှတ်ချက်များကို မသုံးပါနှင့်။ ၎င်းတို့ကို အဓိပ္ပာယ်ဖော်ဆောင်မည် မဟုတ်ပါ။ Windows တွင်လည်း space ပါဝင်သော လမ်းကြောင်းများ အပါအဝင် absolute path အပြည့်အစုံကို ဖိုင်ထဲတွင် ရေးသားပါ။

Module များကို ထည့်သွင်းခြင်း၊ ပြောင်းလဲခြင်း သို့မဟုတ် ဖယ်ရှားခြင်း ပြုလုပ်ပြီးနောက် service ကို ပြန်လည်စတင်ပါ။ Linux တွင် အောက်ပါ command ကို အသုံးပြုပါ-

sudo systemctl restart mudfish-dns.service

Windows တွင် Services စီမံခန့်ခွဲမှုမှ Mudfish DNS service ကို ပြန်လည်စတင်ပါ။ အက်ပ်၏ Start DNS၊ Stop DNS သို့မဟုတ် Apply settings တို့သည် module များကို ပြန်လည်ရယူမည် မဟုတ်ပါ။ Configuration ဖိုင်ကို ဖတ်၍မရခြင်း၊ လမ်းကြောင်း မှားယွင်းနေခြင်း သို့မဟုတ် loading နှင့် initialization အမှားများ ဖြစ်ပေါ်ပါက service စတင်နိုင်မည် မဟုတ်ပါ။ Module directory မရှိခြင်း သို့မဟုတ် ဗလာဖြစ်နေခြင်းကို ခွင့်ပြုပါသည်။

ဖွံ့ဖြိုးတိုးတက်ရေး လုပ်ဆောင်စဉ်အတွင်း --module parameter ကို အကြိမ်ကြိမ် သတ်မှတ်၍ parameter အစဉ်အတိုင်း library များကို ရယူနိုင်ပါသည်။ ဤသို့ ပြုလုပ်ပါက modules.d အလိုအလျောက် ရယူမှုကို အစားထိုးပါမည်။ --config FILE သည် configuration ဖိုင်ဘေးရှိ module directory တည်နေရာကိုလည်း ပြောင်းလဲပေးပါသည်။ --restore-dns သည် module များကို ရယူခြင်း မပြုဘဲ ပြန်လည်ရယူခြင်းကို ဆောင်ရွက်ပါသည်။

Hook များကို အကောင်အထည်ဖော်ခြင်း​

mudfish_dns_module.h header ကို ဖတ်ရှုပါ သို့မဟုတ် mudfish_dns_module.h ကို ဒေါင်းလုဒ်လုပ်ပါ။ ဤ header သည် module များတွင် အသုံးပြုသော structures, hooks, actions နှင့် data lifetime စည်းမျဉ်းများကို သတ်မှတ်ပေးထားပါသည်။ ဤလမ်းညွှန်တွင် C ABI v2 ကို အသုံးပြုပါသည်။ mudfish_dns_module_init_v2() ကို အပြင်သို့ ထုတ်ဖော်ပေးရမည်ဖြစ်ပြီး hook များကို မဖြည့်မီ MUDFISH_DNS_MODULE_ABI_V2 နှင့် ပေးပို့လာသော structure အရွယ်အစားကို စစ်ဆေးပါ။ အောင်မြင်စွာ initialize လုပ်နိုင်ပါက 0 ကို ပြန်ပို့ပေးရပါမည်။

Hookခေါ်ယူသည့် အချိန်
on_dns_queryParse လုပ်ထားသော query ကို လက်ခံရရှိပြီးနောက် cache စစ်ဆေးခြင်း သို့မဟုတ် forward မလုပ်မီ။
on_dns_responseResponse ကို ရွေးချယ်ပြီးနောက် cache တွင် သိမ်းဆည်းခြင်း သို့မဟုတ် client ထံသို့ ပြန်မပို့မီ။ Cache လုပ်ထားသော response သည်လည်း ဤ hook ကို ဖြတ်သန်းပါသည်။
on_web_helloကနဦး HTTP Host/TLS SNI စစ်ဆေးမှု ပြီးဆုံးပြီးနောက် ချိတ်ဆက်ခြင်း သို့မဟုတ် ကနဦးဒေတာကို မစီမံမီ။
on_web_dataနောက်ဆက်တွဲ client data သို့မဟုတ် server data ကို ဖတ်ရှုပြီးနောက် forward မလုပ်မီ။

DNS Actions​

v2 DNS hook များသည် အောင်မြင်ပါက 0 ကို ပြန်ပို့ပေးပြီး result->action ကို သတ်မှတ်ပေးရပါသည်-

Actionသက်ရောက်မှု
MUDFISH_DNS_CONTINUEနောက် module နှင့် ပုံမှန် လုပ်ငန်းစဉ်ကို ဆက်လက်လုပ်ဆောင်ပါမည်။
MUDFISH_DNS_ALLOWလက်ရှိ hook chain ကို အဆုံးသတ်ပြီး ပုံမှန် DNS စုံစမ်းမှုကို ဆက်လက်လုပ်ဆောင်ပါမည် သို့မဟုတ် ရွေးချယ်ထားသော response ကို ပြန်ပို့ပါမည်။
MUDFISH_DNS_BLOCKREFUSED ကို ပြန်ပို့ပါမည်။
MUDFISH_DNS_DROPDNS response ကို မပေးပို့ဘဲ စွန့်ပစ်လိုက်ပါမည်။
MUDFISH_DNS_ANSWERပေးထားသော IPv4/IPv6 address နှင့် TTL ဖြင့် response ကို ဖန်တီးပေးပါမည်။
MUDFISH_DNS_REPLACEModule မှ ထောက်ပံ့ပေးသော ပြီးပြည့်စုံသည့် DNS wire format response ကို အသုံးပြုပါမည်။

v2 DNS hook များတွင် action constants များကို တိုက်ရိုက် return မလုပ်ပါနှင့်။ Function သည် 0 မဟုတ်သော တန်ဖိုးကို return လုပ်ပါက သို့မဟုတ် ရလဒ် မမှန်ကန်ပါက SERVFAIL ဖြစ်ပေါ်ပါမည်။ ALLOW သည် လက်ရှိ hook chain ကိုသာ အဆုံးသတ်စေပြီး domain စည်းမျဉ်းများ၊ transport ခွင့်ပြုချက်များ သို့မဟုတ် certificate စစ်ဆေးမှုများကို ကျော်လွှားမည် မဟုတ်ပါ။ DROP မှလွဲ၍ query ရလဒ်များသည် response hook များကိုလည်း ဖြတ်သန်းပါမည်။

Web hook များသည် MUDFISH_DNS_CONTINUE သို့မဟုတ် MUDFISH_DNS_REJECT ကို တိုက်ရိုက် return လုပ်ပါသည်။ ဝဘ်တောင်းဆိုမှုကို ငြင်းပယ်ပါက ချိတ်ဆက်မှုကို အဆုံးသတ်ပါမည်။ Web hook များကို အသုံးပြုရန်အတွက် ဝဘ် အကာအကွယ် ဖွင့်ထားရမည်ဖြစ်ပြီး ကုဒ်ဖော်ထုတ်ထားသော HTTPS အကြောင်းအရာများကို ထောက်ပံ့ပေးမည် မဟုတ်ပါ။

Buffers, Threading နှင့် Caching​

Input events နှင့် buffers များသည် read-only ဖြစ်ပြီး callback လုပ်ဆောင်နေစဉ်အတွင်းသာ တရားဝင်ပါသည်။ အစားထိုး response များသည် module ပိုင် memory ကို အသုံးပြုရမည်ဖြစ်ပြီး အဆိုပါ module ၏ နောက်ထပ် callback သို့မဟုတ် ပြီးဆုံးချိန်အထိ တရားဝင်နေရပါမည်။ Stack memory သို့မဟုတ် event မှ ငှားရမ်းထားသော pointer များကို return မလုပ်ပါနှင့်။ အစားထိုး response ၏ DNS ID, opcode နှင့် question တို့သည် မူလ query နှင့် ကိုက်ညီရပါမည်။ Instance တစ်ခု၏ callback များသည် အစဉ်လိုက် လည်ပတ်သော်လည်း မတူညီသော thread များမှ ခေါ်ယူခံရနိုင်ပါသည်။ Callback များကို အချိန်တိုအတွင်း ပြီးစီးစေပြီး ABI နယ်နိမိတ်ကို ကျော်လွန်၍ exceptions များကို မပျံ့နှံ့စေပါနှင့်။

ဖန်တီးခြင်း၊ အစားထိုးခြင်း၊ ပိတ်ပင်ခြင်း သို့မဟုတ် စွန့်ပစ်ခြင်း ပြုလုပ်ထားသော ရလဒ်များကို host cache တွင် သိမ်းဆည်းမည် မဟုတ်ပါ။ Cache လုပ်ထားသော response ကို အစားထိုးသော်လည်း မူလ cache entry သည် ပြောင်းလဲမည် မဟုတ်ပါ။ Host သည် အစားထိုး response များ၏ AD flag ကို ရှင်းလင်းပေးမည်ဖြစ်ပြီး DNSSEC အတည်ပြုခြင်း သို့မဟုတ် ပြန်လည်လက်မှတ်ထိုးခြင်း ပြုလုပ်မည် မဟုတ်ပါ။ လက်မှတ်ထိုးထားသော data များကို ပြင်ဆင်သည့် module များသည် ပျက်ပြယ်သွားသော လက်မှတ်များကို ကိုယ်တိုင် ကိုင်တွယ်ဖြေရှင်းရပါမည်။

နမူနာများနှင့် Header​

အောက်ပါ စာမျက်နှာများတွင် နမူနာ source အပြည့်အစုံနှင့် လိုအပ်သော header များ ရှိပါသည်။ Mudfish DNS source tree ကို သီးခြား ဒေါင်းလုဒ်လုပ်ရန် မလိုအပ်ပါ။

ဖိုင်အကြောင်းအရာ
policy.c — DNS မူဝါဒ နမူနာDNS query ခွင့်ပြုခြင်း၊ ပိတ်ပင်ခြင်း၊ စွန့်ပစ်ခြင်း၊ IP response ဖန်တီးခြင်း၊ response address နှင့် TTL ပြောင်းလဲခြင်း။ Linux build နှင့် test commands များလည်း ပါဝင်ပါသည်။
mudfish_dns_module.h — module headerABI ကြေညာချက်များ၊ hook signatures၊ action constants နှင့် buffer ownership စည်းမျဉ်းများ။

Build မလုပ်မီ policy.c နှင့် mudfish_dns_module.h တို့ကို directory တစ်ခုတည်းတွင် ဒေါင်းလုဒ်လုပ်ပါ။ နမူနာ၏ build command သည် Linux .so library ကို ထုတ်လုပ်ပေးပါမည်။