মূল বিষয়বস্তুতে যান

নেটিভ মডিউল (ডেভেলপারদের জন্য)

সাধারণ ব্যবহারের জন্য মডিউলের প্রয়োজন হয় না। এই নির্দেশিকাটি মূলত ডেভেলপার এবং অ্যাডমিনিস্ট্রেটরদের জন্য, যারা নেটিভ লাইব্রেরি ব্যবহার করে Windows বা Linux সার্ভিসের কার্যক্ষমতা বাড়াতে চান। মডিউলগুলো সার্ভিসের ভেতর সার্ভিসের নিজস্ব অধিকার (privilege) নিয়ে চলে। তাই কেবল বিশ্বস্ত কোড ইনস্টল করুন এবং মডিউল ফাইল, ডিপেন্ডেন্সি ও কনফিগারেশন ফাইলগুলোর মালিকানা প্রশাসকের (administrator) অধীনে রাখুন।

মডিউল লোড করা​

সার্ভিসটি তার কনফিগারেশন ফাইলের পাশে থাকা modules.d ডিরেক্টরি থেকে *.conf ফাইলগুলো পড়ে। ডিফল্ট অবস্থানগুলো নিম্নরূপ:

অপারেটিং সিস্টেমমডিউল কনফিগারেশনের অবস্থানলাইব্রেরির ধরন
Linux/etc/mudfish-dns/modules.d/.so
Windows%ProgramData%\Mudfish DNS\modules.d\.dll

প্রতিটি ফাইলে লাইব্রেরির পূর্ণ (absolute) পাথ প্রতি লাইনে একটি করে লিখতে হয়। উদাহরণস্বরূপ, /etc/mudfish-dns/modules.d/10-policy.conf-এর বিষয়বস্তু হতে পারে:

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

ফাইলগুলো নামের ক্রমানুসারে এবং প্রতিটি ফাইলের ভেতরে লাইনের ক্রমানুসারে পড়া হয়। ফাঁকা লাইন এবং # দিয়ে শুরু হওয়া লাইনগুলো উপেক্ষা করা হয়। পাথ উদ্ধৃতিচিহ্ন (quotes) দিয়ে ঘেরাও করবেন না বা পরিবেশ পরিবর্তনশীল (environment variable) কিংবা লাইনের শেষে মন্তব্য ব্যবহার করবেন না; এগুলো পার্স করা হয় না। Windows-এ স্পেসযুক্ত পাথসহ পুরো পরম পাথ ফাইলের ভেতরে লিখুন।

মডিউল যোগ, পরিবর্তন বা মুছে ফেলার পর সার্ভিসটি পুনরায় চালু করুন। Linux-এ নিচের কমান্ড ব্যবহার করুন:

sudo systemctl restart mudfish-dns.service

Windows-এ সার্ভিসেস (Services) ব্যবস্থাপনা থেকে Mudfish DNS সার্ভিসটি পুনরায় চালু করুন। অ্যাপের DNS শুরু করুন, DNS বন্ধ করুন বা সেটিংস প্রয়োগ করুন অ্যাকশনগুলো মডিউল পুনরায় লোড করে না। কনফিগারেশন ফাইল অপাঠ্য হলে, পাথ ভুল হলে অথবা লোড ও ইনিশিয়ালাইজেশন ত্রুটি ঘটলে সার্ভিস শুরু হবে না। মডিউল ডিরেক্টরি না থাকা বা খালি থাকা অনুমোদিত।

ডেভেলপমেন্ট চলাকালীন বারবার --module আর্গুমেন্ট ব্যবহার করে আর্গুমেন্টের ক্রমানুসারে লাইব্রেরি লোড করা যেতে পারে, যা modules.d-এর স্বয়ংক্রিয় লোডিংকে প্রতিস্থাপন করে। --config FILE কনফিগারেশন ফাইলের পাশের মডিউল ডিরেক্টরির অবস্থানও পরিবর্তন করে। --restore-dns কোনো মডিউল লোড না করেই পুনরুদ্ধার কাজ সম্পন্ন করে।

হুক বাস্তবায়ন​

mudfish_dns_module.h হেডার পড়ুন অথবা mudfish_dns_module.h ডাউনলোড করুন। এই হেডারটি মডিউলে ব্যবহৃত কাঠামো (structures), হুক, অ্যাকশন এবং ডেটার লাইফটাইম নিয়মাবলী সংজ্ঞায়িত করে। এই নির্দেশিকায় 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_BLOCKREFUSED প্রদান করুন।
MUDFISH_DNS_DROPকোনো DNS উত্তর না পাঠিয়ে ফেলে দিন (ড্রপ করুন)।
MUDFISH_DNS_ANSWERপ্রদত্ত IPv4/IPv6 ঠিকানা ও TTL দিয়ে একটি উত্তর তৈরি করুন।
MUDFISH_DNS_REPLACEমডিউল কর্তৃক সরবরাহকৃত সম্পূর্ণ ওয়্যার-ফরম্যাট DNS উত্তর ব্যবহার করুন।

v2 DNS হুক থেকে সরাসরি কোনো অ্যাকশন কনস্ট্যান্ট রিটার্ন করবেন না। ফাংশনটি শূন্য ব্যতীত অন্য কোনো মান রিটার্ন করলে বা ফলাফল অবৈধ হলে SERVFAIL ঘটবে। ALLOW শুধুমাত্র বর্তমান হুক চেইন সমাপ্ত করে; এটি ডোমেন নিয়ম, ট্রান্সপোর্ট অনুমতি বা সার্টিফিকেট যাচাইকে বাইপাস করে না। DROP ব্যতীত অন্যান্য কুয়েরির ফলাফল রেসপন্স হুকের মধ্য দিয়েও যায়।

ওয়েব হুকগুলো সরাসরি MUDFISH_DNS_CONTINUE বা MUDFISH_DNS_REJECT রিটার্ন করে। ওয়েব অনুরোধ প্রত্যাখ্যান করলে সংযোগটি বন্ধ হয়ে যায়। ওয়েব হুক ব্যবহারের জন্য ওয়েব সুরক্ষা চালু থাকা আবশ্যক, এবং ডিক্রিপ্ট করা HTTPS বিষয়বস্তু প্রদান করা হয় না।

বাফার, থ্রেডিং এবং ক্যাশিং​

ইনপুট ইভেন্ট ও বাফারগুলো কেবল পাঠযোগ্য (read-only) এবং শুধুমাত্র কলব্যাকের কার্যকালে বৈধ। প্রতিস্থাপিত উত্তরের জন্য মডিউলের নিজস্ব মেমরি ব্যবহার করতে হবে যা মডিউলের পরবর্তী কলব্যাক বা নিষ্ক্রিয় হওয়া পর্যন্ত বৈধ থাকবে; স্ট্যাক মেমরি বা কোনো ইভেন্ট থেকে ধার করা পয়েন্টার ফেরত দেবেন না। প্রতিস্থাপিত উত্তরের DNS ID, opcode এবং প্রশ্ন অবশ্যই মূল কুয়েরির সাথে মিলতে হবে। একটি ইনস্ট্যান্সের কলব্যাকগুলো ক্রমানুসারে চলে তবে বিভিন্ন থ্রেড থেকে কল করা হতে পারে। কলব্যাকগুলো সংক্ষিপ্ত রাখুন এবং ABI সীমানা পেরিয়ে ব্যতিক্রম (exception) ছড়াবেন না।

কৃত্রিমভাবে তৈরি (synthetic), প্রতিস্থাপিত, অবরুদ্ধ (blocked) বা বাতিল (dropped) ফলাফলগুলো হোস্ট ক্যাশে সংরক্ষণ করা হয় না। কোনো ক্যাশ করা উত্তর প্রতিস্থাপন করলে মূল ক্যাশ এন্ট্রি পরিবর্তিত হয় না। হোস্ট প্রতিস্থাপিত উত্তরের AD ফ্ল্যাগ মুছে দেয় এবং কোনো DNSSEC যাচাই বা পুনরায় স্বাক্ষর করে না; স্বাক্ষরিত ডেটা পরিবর্তনকারী মডিউলগুলোকে বাতিল হওয়া স্বাক্ষরগুলো নিজেদেরই পরিচালনা করতে হবে।

উদাহরণ এবং হেডার​

নিচের পৃষ্ঠাগুলোতে সম্পূর্ণ উদাহরণ সোর্স এবং প্রয়োজনীয় হেডার রয়েছে। আলাদাভাবে Mudfish DNS সোর্স কোড ডাউনলোড করার প্রয়োজন নেই।

ফাইলবিষয়বস্তু
policy.c — DNS নীতি উদাহরণDNS কুয়েরি অনুমোদন, অবরুদ্ধ বা বাতিল করা; IP উত্তর তৈরি করা; উত্তরের ঠিকানা ও TTL পুনর্লিখন। Linux বিল্ড ও টেস্ট কমান্ড অন্তর্ভুক্ত রয়েছে।
mudfish_dns_module.h — মডিউল হেডারABI ঘোষণা, হুক সিগনেচার, অ্যাকশন কনস্ট্যান্ট এবং বাফার মালিকানার নিয়মাবলী।

বিল্ড করার পূর্বে policy.c এবং mudfish_dns_module.h একই ডিরেক্টরিতে ডাউনলোড করুন। উদাহরণের বিল্ড কমান্ডটি একটি Linux .so লাইব্রেরি তৈরি করে।