डीएनएस रिज़ॉल्वर मॉड्यूल, डीएनएस इंटरसेप्शन और कॉन्फ़िगरेशन अपडेट हमलों से उपयोगकर्ता को सुरक्षा देता है. साथ ही, डीएनएस रिज़ॉल्यूशन के लिए नेटवर्क की परफ़ॉर्मेंस को बेहतर बनाता है. इस मॉड्यूल में वह कोड होता है जो डीएनएस स्टब रिज़ॉल्वर को लागू करता है. यह कोड, www.google.com जैसे नामों को 2001:db8::1 जैसे आईपी पतों में बदल देता है. डीएनएस स्टब रिज़ॉल्वर, InetAddress#getAllByName और Network#getAllByName जैसे Java API एलिमेंट के साथ-साथ नेटिव नेटवर्किंग फ़ंक्शन के साथ काम करता है. साथ ही, डीएनएस क्वेरी भेजने और पाने के साथ-साथ नतीजों को कैश मेमोरी में सेव करता है.
Android 10 में हुए बदलाव
Android 9 और इससे पहले के वर्शन वाले डिवाइसों पर, डीएनएस रिज़ॉल्वर कोड, Bionic और netd
में मौजूद होता है. डीएनएस लुकअप को netd
डेमन में एक ही जगह पर रखा जाता है, ताकि सिस्टम-वाइड कैश मेमोरी का इस्तेमाल किया जा सके. वहीं, ऐप्लिकेशन Bionic में getaddrinfo
जैसे फ़ंक्शन को कॉल करते हैं. क्वेरी को यूनिक्स सॉकेट के ज़रिए /dev/socket/dnsproxyd
में netd
डेमन को भेजा जाता है. यह अनुरोध को पार्स करता है और डीएनएस लुकअप जारी करने के लिए, getaddrinfo
को फिर से कॉल करता है. इसके बाद, नतीजों को कैश मेमोरी में सेव करता है, ताकि दूसरे ऐप्लिकेशन उनका इस्तेमाल कर सकें. डीएनएस रिज़ॉल्वर को लागू करने का ज़्यादातर हिस्सा
bionic/libc/dns/
में और कुछ हिस्सा
system/netd/server/dns
में था.
Android 10, डीएनएस रिज़ॉल्वर कोड को system/netd/resolv,
में ले जाता है और उसे C++ में बदल देता है. इसके बाद, कोड को आधुनिक बनाता है और उसे फिर से लिखता है. ऐप्लिकेशन के साथ काम करने की वजह से, Bionic में कोड मौजूद रहेगा. हालांकि, सिस्टम अब इसे कॉल नहीं करेगा. रीफ़ैक्टर करने से इन सोर्स पाथ पर असर पड़ता है:
bionic/libc/dns
system/netd/client
system/netd/server/dns
system/netd/server/DnsProxyListener
system/netd/server/ResolverController
system/netd/resolv
फ़ॉर्मैट और डिपेंडेंसी
डीएनएस रिज़ॉल्वर मॉड्यूल (`com.android.resolv`) को APEX फ़ाइल के तौर पर डिलीवर किया जाता है और इसे netd
से डाइनैमिक तौर पर लिंक किया जाता है. हालांकि, netd
एक डिपेंडेंसी नहीं है, क्योंकि मॉड्यूल सीधे तौर पर लोकल सॉकेट /dev/socket/dnsproxyd
को सेवा देता है. रिज़ॉल्वर कॉन्फ़िगरेशन के लिए, बिंडर एंडपॉइंट को netd
से रिज़ॉल्वर पर ले जाया गया था. इसका मतलब है कि सिस्टम सेवा, netd
से गुज़रे बिना सीधे रिज़ॉल्वर मॉड्यूल को कॉल कर सकती है.
डीएनएस रिज़ॉल्वर मॉड्यूल, libc
(Bionic) पर निर्भर करता है और अपनी डिपेंडेंसी को स्टैटिक तौर पर लिंक करता है. इसके लिए, किसी अन्य लाइब्रेरी की ज़रूरत नहीं होती.
mDNS .local रिज़ॉल्यूशन
नवंबर 2021 से, Android रिज़ॉल्वर में mDNS .local रिज़ॉल्यूशन की सुविधा काम करती है. यह सुविधा, RFC 6762 में "5.1 वन-शॉट मल्टीकास्ट डीएनएस क्वेरी" को लागू करती है, ताकि 224.0.0.251:5353 या [FF02::FB]:5353 पर स्टैंडर्ड डीएनएस क्वेरी भेजी जा सकें. mDNS रिज़ॉल्यूशन की सुविधा, *.local
पर खत्म होने वाले होस्टनेम के साथ getaddrinfo()
को कॉल करके काम करती है.
mDNS .local रिज़ॉल्यूशन, पते पाने के लिए getaddrinfo()
के मौजूदा फ़ंक्शन को बेहतर बनाता है. अगर कोई डिवाइस mDNS .local रिज़ॉल्यूशन के साथ काम करता है, तो getaddrinfo()
एपीआई, 224.0.0.251:5353 या [FF02::FB]:5353 पर mDNS क्वेरी भेजता है और स्थानीय पते दिखाता है. अगर कोई डिवाइस mDNS .local रिज़ॉल्यूशन के साथ काम नहीं करता है, तो getaddrinfo()
एपीआई का तरीका, डीएनएस सर्वर पर डीएनएस क्वेरी भेजता है.
यह कोड AOSP में मौजूद है, जो packages/modules/DnsResolver
में मौजूद है. पते पाने के लिए, उपयोगकर्ता अपने मौजूदा mDNS डिज़ाइन को बनाए रख सकते हैं या इसके बजाय getaddrinfo()
का इस्तेमाल कर सकते हैं. इस सुविधा का काम करने का तरीका, mDNS मल्टीकास्ट पतों पर भेजी गई सामान्य डीएनएस क्वेरी जैसा ही है. इस सुविधा का सिस्टम की परफ़ॉर्मेंस पर कोई असर नहीं पड़ता.
उपयोगकर्ता, adb shell ping6 HOSTNAME.local
कमांड का इस्तेमाल कर सकते हैं. इसमें HOSTNAME, adb shell ping6 ipad.local
जैसे टारगेट किए गए डिवाइस का होस्टनेम होता है.
वीपीएन और मोबाइल डेटा कनेक्शन, .local रिज़ॉल्यूशन में शामिल नहीं किए जाते.