ডিএনএস ইন্টারসেপশন ও কনফিগারেশন আপডেট অ্যাটাকের জন্য ডিএনএস রিজলভার মডিউল ব্যবহারকারীকে সুরক্ষা প্রদান করে এবং ডিএনএস রেজোলিউশনের জন্য উন্নত নেটওয়ার্ক পারফর্ম্যান্স প্রদান করে। মডিউলে এমন কোড থাকে যা DNS স্টাব রেজোলভার প্রয়োগ করে, যা www.google.com-এর মতো নামকে 2001:db8::1-এর মতো IP অ্যাড্রেসে ট্রান্সলেট করে। DNS স্টাব রিজলভার Java API এলিমেন্ট যেমন InetAddress#getAllByName এবং Network#getAllByName, সেইসাথে নেটিভ নেটওয়ার্কিং ফাংশন ব্যাক করে এবং DNS কোয়েরি পাঠানো ও পাওয়ার পাশাপাশি ফলাফল ক্যাশে করা প্রয়োগ করে।
Android 10-এ পরিবর্তন
Android 9 এবং তার আগের ভার্সনে চলা ডিভাইসে, DNS সমাধানকারী কোড
Bionic এবং netd জুড়ে ছড়িয়ে থাকে। সিস্টেম-ব্যাপী ক্যাশিংয়ের অনুমতি দিতে, DNS লুক-আপগুলি
netd ডেমনে সেন্ট্রালাইজ করা হয়, যেখানে অ্যাপগুলি
Bionic-এ ফাংশন (যেমন getaddrinfo) কল করে। netd ডেমনে
কোয়েরিটি UNIX সকেটের মাধ্যমে /dev/socket/dnsproxyd-এ
পাঠানো হয়, যা অনুরোধটি পার্স করে এবং DNS লুক-আপ ইস্যু করার জন্য
getaddrinfo-কে আবার কল করে, তারপর ফলাফল ক্যাশে করে
যাতে অন্যান্য অ্যাপ সেগুলি ব্যবহার করতে পারে। DNS রিজলভারের প্রয়োগ বেশিরভাগই
bionic/libc/dns/-এ এবং আংশিকভাবে
system/netd/server/dns-এ করা হয়েছে।
Android 10, DNS রেজলভার কোডকে
system/netd/resolv, C++-এ কনভার্ট করে, তারপর সেটিকে আধুনিক করে এবং
কোড রিফ্যাক্টর করে। অ্যাপের
সাথে মানানসই হওয়ার কারণে Bionic-এ কোডটি এখনও আছে, তবে সিস্টেম আর এটি কল করে না। এইসব সোর্স
পাথ রিফ্যাক্টরিংয়ের ফলে প্রভাবিত হয়:
bionic/libc/dnssystem/netd/clientsystem/netd/server/dnssystem/netd/server/DnsProxyListenersystem/netd/server/ResolverControllersystem/netd/resolv
ফর্ম্যাট ও ডিপেনডেন্সি
DNS Resolver মডিউল (`com.android.resolv`) একটি
APEX ফাইল হিসেবে ডেলিভার করা হয় এবং netd-এর মাধ্যমে
ডায়নামিক্যালি লিঙ্ক করা হয়; তবে, netd কোনও
ডিপেন্ডেন্সি নয় কারণ মডিউলটি সরাসরি লোকাল সকেট
/dev/socket/dnsproxyd-কে পরিষেবা দেয়। রিজলভার কনফিগারেশনের জন্য
বাইন্ডার এন্ডপয়েন্ট netd থেকে রিজলভারে সরানো হয়েছে,
যার অর্থ হল সিস্টেম সার্ভিস netd-এ না গিয়ে সরাসরি
রিজলভার মডিউলে কল করতে পারে।
DNS Resolver মডিউল libc (Bionic)-এর উপর নির্ভর করে এবং
এর নির্ভরতা স্ট্যাটিক লিঙ্ক করে; অন্য কোনও লাইব্রেরির প্রয়োজন নেই।
mDNS .local রেজোলিউশন
নভেম্বর ২০২১ থেকে, Android resolver mDNS .local রেজোলিউশন সমর্থন করে, যা
RFC 6762-এ "৫.১ ওয়ান-শট মাল্টিকাস্ট ডিএনএস কোয়েরি" প্রয়োগ করে
২২৪.০.০.২৫১:৫৩৫৩ বা [FF02::FB]:৫৩৫৩-এ স্ট্যান্ডার্ড ডিএনএস কোয়েরি অন্ধভাবে পাঠায়। mDNS রেজোলিউশন *.local-এ শেষ হওয়া হোস্টনেম সহ getaddrinfo() কল করে স্বচ্ছভাবে
সমর্থিত হয়।
mDNS .local রেজোলিউশন, getaddrinfo()
থেকে অ্যাড্রেস পাওয়ার জন্য আগে থেকে থাকা ফাংশনালিটিকে আরও উন্নত করে। কোনও ডিভাইস mDNS .local রেজোলিউশন সমর্থন করলে, তাহলে
getaddrinfo() API 224.0.0.251:5353 বা [FF02::FB]:5353-এ mDNS কোয়েরি পাঠায়
এবং লোকাল অ্যাড্রেস রিটার্ন করে। কোনও ডিভাইস mDNS .local
রেজোলিউশন সাপোর্ট না করলে, getaddrinfo() API পদ্ধতি DNS
সার্ভারে একটি DNS কোয়েরি পাঠায়।
কোডটি AOSP-তে আছে, যা packages/modules/DnsResolver-এ অবস্থিত। ব্যবহারকারীরা অ্যাড্রেস পেতে তাদের
বর্তমান mDNS ডিজাইন রাখতে পারেন অথবা এর পরিবর্তে getaddrinfo() ব্যবহার করতে পারেন। এই ফিচারের
ব্যবহার mDNS মাল্টিকাস্ট অ্যাড্রেসে পাঠানো সাধারণ DNS কোয়েরির মতো। সিস্টেমের স্বাস্থ্যের উপর এই ফিচারের কোনও
প্রভাব পড়ে না।
ব্যবহারকারী adb shell ping6 HOSTNAME.local কমান্ড ব্যবহার করতে পারবেন,
যেখানে HOSTNAME হল LAN-এ টার্গেট ডিভাইসের হোস্টনেম, যেমন,
adb shell ping6 ipad.local।
VPN ও মোবাইল ডেটা কানেকশন .local রেজোলিউশন থেকে বাদ দেওয়া হয়।