រំលងទៅមាតិកាសំខាន់

ម៉ូឌុលដើម (សម្រាប់អ្នកអភិវឌ្ឍន៍)

ម៉ូឌុលមិនត្រូវបានទាមទារសម្រាប់ការប្រើប្រាស់ទូទៅឡើយ។ ការណែនាំនេះគឺសម្រាប់អ្នកអភិវឌ្ឍន៍ និងអ្នកគ្រប់គ្រងដែលចង់ពង្រីកមុខងារនៃសេវាកម្ម Windows ឬ Linux ជាមួយនឹងបណ្ណាល័យដើម (native libraries)។ ម៉ូឌុលដំណើរការនៅក្នុងសេវាកម្មដោយប្រើសិទ្ធិរបស់សេវាកម្ម។ សូមដំឡើងតែកូដដែលអាចទុកចិត្តបានប៉ុណ្ណោះ ហើយត្រូវប្រាកដថាឯកសារម៉ូឌុល ឯកសារអាស្រ័យ និងឯកសារកំណត់រចនាសម្ព័ន្ធត្រូវបានគ្រប់គ្រងដោយអ្នកគ្រប់គ្រងប្រព័ន្ធ។

ការផ្ទុកម៉ូឌុល​

សេវាកម្មអានឯកសារ *.conf ពីថត modules.d ដែលនៅជាប់នឹងឯកសារកំណត់រចនាសម្ព័ន្ធ។ ទីតាំងលំនាំដើមមានដូចខាងក្រោម៖

ប្រព័ន្ធប្រតិបត្តិការទីតាំងកំណត់រចនាសម្ព័ន្ធម៉ូឌុលទម្រង់បណ្ណាល័យ
Linux/etc/mudfish-dns/modules.d/.so
Windows%ProgramData%\Mudfish DNS\modules.d\.dll

នៅក្នុងឯកសារនីមួយៗ សូមសរសេរផ្លូវដាច់ខាត (absolute path) នៃបណ្ណាល័យមួយបន្ទាត់ម្តងៗ។ ឧទាហរណ៍ ខ្លឹមសារនៃ /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 ឡើងវិញពីការគ្រប់គ្រងសេវាកម្ម (Services)។ ចាប់ផ្តើម DNS, បញ្ឈប់ DNS និង អនុវត្តការកំណត់ នៃកម្មវិធីនឹងមិនផ្ទុកម៉ូឌុលឡើងវិញឡើយ។ ប្រសិនបើឯកសារកំណត់រចនាសម្ព័ន្ធមិនអាចអានបាន ផ្លូវមិនត្រឹមត្រូវ ឬមានកំហុសក្នុងការផ្ទុក និងការចាប់ផ្តើមដំបូង សេវាកម្មនឹងមិនចាប់ផ្តើមឡើយ។ វាត្រូវបានអនុញ្ញាតប្រសិនបើថតម៉ូឌុលមិនមាន ឬនៅទទេនោះ។

កំឡុងពេលអភិវឌ្ឍន៍ អ្នកអាចផ្ទុកបណ្ណាល័យតាមលំដាប់អាគុយម៉ង់ ដោយបញ្ជាក់អាគុយម៉ង់ --module ម្តងហើយម្តងទៀត។ ក្នុងករណីនេះ វានឹងជំនួសការផ្ទុកដោយស្វ័យប្រវត្តិនៃ modules.d។ --config FILE ក៏ផ្លាស់ប្តូរទីតាំងថតម៉ូឌុលដែលនៅជាប់នឹងឯកសារកំណត់រចនាសម្ព័ន្ធផងដែរ។ --restore-dns អនុវត្តការស្តារឡើងវិញដោយមិនផ្ទុកម៉ូឌុលឡើយ។

ការអនុវត្ត Hooks​

សូមអាន បឋមកថា mudfish_dns_module.h ឬ ទាញយក mudfish_dns_module.h។ បឋមកថានេះកំណត់អំពីរចនាសម្ព័ន្ធ hooks សកម្មភាព និងវិធានអាយុកាលទិន្នន័យដែលប្រើនៅក្នុងម៉ូឌុល។ នៅក្នុងការណែនាំនេះ យើងប្រើ C ABI v2។ សូមបង្ហាញ mudfish_dns_module_init_v2() ទៅខាងក្រៅ ហើយផ្ទៀងផ្ទាត់ MUDFISH_DNS_MODULE_ABI_V2 ព្រមទាំងទំហំរចនាសម្ព័ន្ធដែលបានបញ្ជូន មុនពេលបំពេញ hooks។ ប្រសិនបើការចាប់ផ្តើមដំបូងជោគជ័យ វានឹងត្រឡប់ 0។

Hookពេលដែលត្រូវបានហៅ
on_dns_queryបន្ទាប់ពីទទួលយកការសាកសួរដែលបាន parse រួច មុនពេលស្វែងរកក្នុងឃ្លាំងសម្ងាត់ ឬបញ្ជូនបន្ត។
on_dns_responseបន្ទាប់ពីការឆ្លើយតបត្រូវបានជ្រើសរើស មុនពេលរក្សាទុកក្នុងឃ្លាំងសម្ងាត់ ឬត្រឡប់ទៅកាន់ម៉ាស៊ីនភ្ញៀវ។ ការឆ្លើយតបដែលបានរក្សាទុកក្នុងឃ្លាំងសម្ងាត់ក៏ឆ្លងកាត់ hook នេះដែរ។
on_web_helloបន្ទាប់ពីការត្រួតពិនិត្យ HTTP Host/TLS SNI ដំបូងបានបញ្ចប់ មុនពេលតភ្ជាប់ ឬដំណើរការទិន្នន័យដំបូង។
on_web_dataបន្ទាប់ពីអានទិន្នន័យម៉ាស៊ីនភ្ញៀវ ឬម៉ាស៊ីនបម្រើជាបន្តបន្ទាប់ មុនពេលបញ្ជូនបន្ត។

សកម្មភាព DNS​

v2 DNS hooks ត្រឡប់ 0 នៅពេលជោគជ័យ និងកំណត់ result->action។

សកម្មភាពប្រសិទ្ធភាព
MUDFISH_DNS_CONTINUEបន្តជាមួយម៉ូឌុលបន្ទាប់ និងដំណើរការធម្មតា។
MUDFISH_DNS_ALLOWបញ្ចប់ខ្សែច្រវាក់ hook បច្ចុប្បន្ន ហើយបន្តការសាកសួរ DNS ធម្មតា ឬត្រឡប់ការឆ្លើយតបដែលបានជ្រើសរើស។
MUDFISH_DNS_BLOCKត្រឡប់ REFUSED។
MUDFISH_DNS_DROPបោះបង់ចោលដោយមិនផ្ញើការឆ្លើយតប DNS ឡើយ។
MUDFISH_DNS_ANSWERបង្កើតការឆ្លើយតបជាមួយនឹងអាសយដ្ឋាន IPv4/IPv6 និង TTL ដែលបានផ្តល់។
MUDFISH_DNS_REPLACEប្រើប្រាស់ការឆ្លើយតបទម្រង់ DNS wire ពេញលេញដែលផ្តល់ដោយម៉ូឌុល។

សូមកុំត្រឡប់តម្លៃថេរនៃសកម្មភាពដោយផ្ទាល់ពី v2 DNS hook។ ប្រសិនបើអនុគមន៍ត្រឡប់តម្លៃដែលមិនមែនជា 0 ឬលទ្ធផលមិនត្រឹមត្រូវ វានឹងបណ្តាលឱ្យមាន SERVFAIL។ ALLOW គ្រាន់តែបញ្ចប់ខ្សែច្រវាក់ hook បច្ចុប្បន្នប៉ុណ្ណោះ ហើយមិនវាងកាត់វិធានឈ្មោះដែន ការអនុញ្ញាតវិធីសាស្ត្រទំនាក់ទំនង ឬការផ្ទៀងផ្ទាត់វិញ្ញាបនបត្រឡើយ។ លទ្ធផលនៃការសាកសួរ លើកលែងតែ DROP ក៏នឹងឆ្លងកាត់ response hook ផងដែរ។

Web hooks ត្រឡប់ MUDFISH_DNS_CONTINUE ឬ MUDFISH_DNS_REJECT ដោយផ្ទាល់។ ប្រសិនបើសំណើគេហទំព័រត្រូវបានបដិសេធ ការតភ្ជាប់នឹងត្រូវបានបញ្ចប់។ ដើម្បីប្រើ web hooks ការការពារគេហទំព័រត្រូវតែបើកដំណើរការ ហើយខ្លឹមសារ HTTPS ដែលបានឌិគ្រីបនឹងមិនត្រូវបានផ្តល់ជូនឡើយ។

Buffers, ខ្សែស្រឡាយ និង Caching​

ព្រឹត្តិការណ៍បញ្ចូល និង buffers គឺសម្រាប់តែអាន (read-only) និងមានសុពលភាពអំឡុងពេលការប្រតិបត្តិ callback ប៉ុណ្ណោះ។ ការឆ្លើយតបជំនួសត្រូវតែប្រើអង្គចងចាំដែលជាកម្មសិទ្ធិរបស់ម៉ូឌុល ហើយត្រូវតែមានសុពលភាពរហូតដល់ callback បន្ទាប់ ឬរហូតដល់ពេលបញ្ចប់នៃម៉ូឌុលនោះ។ សូមកុំត្រឡប់អង្គចងចាំ stack ឬ pointers ដែលខ្ចីពីព្រឹត្តិការណ៍។ DNS ID, opcode និងសំណួរនៃការឆ្លើយតបជំនួសត្រូវតែត្រូវគ្នាទៅនឹងការសាកសួរដើម។ Callbacks នៃ instance មួយត្រូវបានប្រតិបត្តិតាមលំដាប់លំដោយ ប៉ុន្តែអាចត្រូវបានហៅពីខ្សែស្រឡាយ (threads) ផ្សេងៗគ្នា។ សូមបញ្ចប់ callback ឱ្យបានរហ័ស និងកុំបញ្ជូនករណីលើកលែង (exceptions) ឆ្លងកាត់ព្រំដែន ABI។

លទ្ធផលដែលបានបង្កើត ជំនួស ទប់ស្កាត់ ឬបោះបង់ចោល មិនត្រូវបានរក្សាទុកក្នុងឃ្លាំងសម្ងាត់របស់ host ឡើយ។ ការជំនួសការឆ្លើយតបដែលបានរក្សាទុកក្នុងឃ្លាំងសម្ងាត់ មិនផ្លាស់ប្តូរធាតុឃ្លាំងសម្ងាត់ដើមឡើយ។ Host នឹងសម្អាតទង់ AD នៃការឆ្លើយតបជំនួស ហើយមិនអនុវត្តការផ្ទៀងផ្ទាត់ ឬចុះហត្ថលេខាឡើងវិញនៃ DNSSEC ឡើយ។ ម៉ូឌុលដែលកែប្រែទិន្នន័យដែលបានចុះហត្ថលេខា ត្រូវតែដោះស្រាយហត្ថលេខាដែលត្រូវបានធ្វើឱ្យអសពលភាពដោយផ្ទាល់។

ឧទាហរណ៍ និងបឋមកថា (Header)​

ទំព័រខាងក្រោមមានប្រភពកូដឧទាហរណ៍ពេញលេញ និងបឋមកថាចាំបាច់។ មិនចាំបាច់ទាញយក source tree នៃ Mudfish DNS ដាច់ដោយឡែកនោះទេ។

ឯកសារខ្លឹមសារ
policy.c — ឧទាហរណ៍គោលការណ៍ DNSអនុញ្ញាត ទប់ស្កាត់ បោះបង់ការសាកសួរ DNS បង្កើតការឆ្លើយតប IP និងផ្លាស់ប្តូរអាសយដ្ឋានឆ្លើយតបព្រមទាំង TTL។ វាក៏រួមបញ្ចូលពាក្យបញ្ជាបង្កើត (build) និងធ្វើតេស្តលើ Linux ផងដែរ។
mudfish_dns_module.h — បឋមកថាម៉ូឌុលការប្រកាស ABI, ហត្ថលេខា hook, តម្លៃថេរសកម្មភាព, វិធានភាពជាម្ចាស់ buffer។

មុនពេលបង្កើត សូមទាញយក policy.c និង mudfish_dns_module.h ទៅក្នុងថតតែមួយ។ ពាក្យបញ្ជាបង្កើតនៃឧទាហរណ៍បង្កើតបណ្ណាល័យ .so លើ Linux។