
फ़ास्ट DNS लुकअप लाइब्रेरी और CLI टूल
ZDNS एक हाई-स्पीड DNS रिज़ॉल्वर और कमांड लाइन उपयोगिता है जो बड़े पैमाने पर DNS मापन करने के लिए है। ZDNS Go में लिखा गया है और इसमें अपना स्वयं का रिकर्सिव रिज़ॉल्यूशन कोड और एक कैश है जो विविध नामों के लुकअप को अनुकूलित करता है। हम कच्चे DNS पैकेटों को बनाने और पार्स करने के लिए https://github.com/zmap/dns का उपयोग करते हैं। ZDNS की आर्किटेक्चर और प्रदर्शन के बारे में अधिक जानकारी के लिए, ACM के Internet Measurement Conference '22 में प्रकाशित निम्नलिखित पेपर देखें।
[!TIP] ZDNS Wiki में ZDNS के बारे में अतिरिक्त जानकारी है और उपयोग-मामलों और उदाहरणों के माध्यम से चलता है।
ZDNS को रिपॉजिटरी को चेक आउट करके और make install चलाकर स्थापित किया जा सकता है।
git clone https://github.com/zmap/zdns.git
cd zdns
make install
ZDNS में एक रिकर्सिव रिज़ॉल्वर लाइब्रेरी और CLI रैपर शामिल है।
लाइब्रेरी में एक ResolverConfig स्ट्रक्ट है जिसमें सभी लुकअप के लिए सभी कॉन्फ़िग विकल्प होंगे।
ResolverConfig का उपयोग 1+ Resolver स्ट्रक्ट बनाने के लिए किया जाता है जो सभी लुकअप करेंगे। एक Resolver
को एक समय में केवल एक लुकअप करना चाहिए (यह थ्रेड-सेफ नहीं है) और समानांतरता के लिए कई Resolver स्ट्रक्ट का उपयोग किया जाना चाहिए।
लाइब्रेरी का उपयोग करने के तरीके के लिए हमारे उदाहरण देखें। मॉड्यूल लुकअप के व्यवहार को परिभाषित करने के लिए उपयोग किए जाते हैं।
ZDNS कई प्रकार के मॉड्यूल प्रदान करता है:
रॉ DNS मॉड्यूल सर्वर से रॉ DNS प्रतिक्रिया प्रदान करते हैं जैसे dig, लेकिन JSON में। (लगभग) हर प्रकार के DNS रिकॉर्ड के लिए एक मॉड्यूल है
लुकअप मॉड्यूल अधिक सहायक प्रतिक्रियाएं प्रदान करते हैं जब कई क्वेरी की आवश्यकता होती है (जैसे, NSLOOKUP में NS प्राप्त होने पर IP पतों के लिए अतिरिक्त A लुकअप पूरा करना)
विविध मॉड्यूल सर्वरों से पूछताछ करने के अन्य अतिरिक्त तरीके प्रदान करते हैं (जैसे, bind.version)
हम मॉड्यूल को नीचे विस्तार से बताते हैं:
A, AAAA, AFSDB, ANY, ATMA, AVC, AXFR, BINDVERSION, CAA, CDNSKEY, CDS, CERT, CNAME, CSYNC, DHCID, DMARC, DNSKEY, DS, EID, EUI48, EUI64, GID, GPOS, HINFO, HIP, HTTPS, ISDN, KEY, KX, L32, L64, LOC, LP, MB, MD, MF, MG, MR, MX, NAPTR, NID, NINFO, NS, NSAPPTR, NSEC, NSEC3, NSEC3PARAM, NSLOOKUP, NULL, NXT, OPENPGPKEY, PTR, PX, RP, RRSIG, RT, SVCBS, MIMEA, SOA, SPF, SRV, SSHFP, TALINK, TKEY, TLSA, TXT, UID, UINFO, UNSPEC, और URI मॉड्यूल dig के समान JSON रूप में रॉ DNS प्रतिक्रिया प्रदान करते हैं।
उदाहरण के लिए, कमांड:
echo "censys.io" | zdns A
लौटाता है:
{
"name": "censys.io",
"results": {
"A": {
"data": {
"additionals": [
{
"flags": "",
"type": "EDNS0",
"udpsize": 512,
"version": 0
}
],
"answers": [
{
"answer": "104.18.10.85",
"class": "IN",
"name": "censys.io",
"ttl": 300,
"type": "A"
},
{
"answer": "104.18.11.85",
"class": "IN",
"name": "censys.io",
"ttl": 300,
"type": "A"
}
],
"protocol": "udp",
"resolver": "[2603:6013:9d00:3302::1]:53"
},
"duration": 0.285295416,
"status": "NOERROR",
"timestamp": "2024-08-23T13:12:43-04:00"
}
}
}
रॉ DNS प्रतिक्रियाएं अक्सर वह डेटा प्रदान नहीं करतीं जो आप चाहते हैं. उदाहरण के लिए,
एक MX प्रतिक्रिया में अतिरिक्त अनुभाग में संबंधित A रिकॉर्ड शामिल नहीं हो सकते हैं,
जिसके लिए अतिरिक्त लुकअप की आवश्यकता होती है। इस अंतर को दूर करने और एक अधिक अनुकूल इंटरफ़ेस प्रदान करने के लिए,
हम कई लुकअप मॉड्यूल भी प्रदान करते हैं: alookup, mxlookup, और nslookup।
alookup nslookup के समान कार्य करता है और CNAME रिकॉर्ड का अनुसरण करेगा।
mxlookup एक्सचेंज रिकॉर्ड के अनुरूप IP पतों के लिए अतिरिक्त रूप से एक A लुकअप करेगा।
nslookup NS रिकॉर्ड के अनुरूप IP पतों के लिए अतिरिक्त रूप से एक A/AAAA लुकअप करेगा।
उदाहरण के लिए,
echo "censys.io" | zdns mxlookup --ipv4-lookup
लौटाता है:
{
"name": "censys.io",
"results": {
"MXLOOKUP": {
"data": {
"exchanges": [
{
"class": "IN",
"ipv4_addresses": [
"209.85.202.27"
],
"name": "alt1.aspmx.l.google.com",
"preference": 5,
"ttl": 300,
"type": "MX"
},
{
"class": "IN",
"ipv4_addresses": [
"142.250.31.26"
],
"name": "aspmx.l.google.com",
"preference": 1,
"ttl": 300,
"type": "MX"
}
]
},
"duration": 0.154786958,
"status": "NOERROR",
"timestamp": "2024-08-23T13:10:11-04:00"
}
}
}
ZDNS विशेष "डीबग" DNS क्वेरी भी समर्थन करता है। मॉड्यूल में शामिल हैं: BINDVERSION।
ZDNS वांछित व्यवहार के आधार पर विभिन्न प्रारूपों में इनपुट प्रदान करने का समर्थन करता है।
सबसे बुनियादी इनपुट न्यूलाइन द्वारा अलग किए गए नामों की एक सूची है। उदाहरण के लिए:
stdin से:
echo "google.com\nyahoo.com" | zdns A
cat list_of_domains.txt | zdns A
फ़ाइल से
zdns A --input-file=list_of_domains.txt
यदि आपको कई डोमेन हल करने की आवश्यकता नहीं है, तो उपयोग में आसानी के लिए CLI तर्क के रूप में डोमेन प्रदान करना, dig के समान, समर्थित है।
उदाहरण के लिए:
zdns A google.com --name-servers=1.1.1.1
dig -t A google.com @1.1.1.1 के बराबर
सामान्यतः, ZDNS --name-servers से प्रत्येक डोमेन लुकअप के लिए एक यादृच्छिक नेमसर्वर चुनेगा। यदि इसके बजाय आप प्रत्येक डोमेन के लिए एक अलग नेम सर्वर निर्दिष्ट करना चाहते हैं, तो आप न्यूलाइन द्वारा अलग किए गए domainName,nameServerIP जोड़े प्रदान करके ऐसा कर सकते हैं।
यह --name-servers के साथ प्रदान किए गए किसी भी नेमसर्वर को ओवरराइड करेगा।
उदाहरण के लिए:
echo "google.com,1.1.1.1\nfacebook.com,8.8.8.8" | zdns A
आप आउटपुट में प्रत्येक डोमेन के लिए resolver को निर्दिष्ट के रूप में देख सकते हैं (संक्षिप्तता के लिए अतिरिक्त/उत्तर संपादित):
$ echo "google.com,1.1.1.1\nfacebook.com,8.8.8.8" | zdns A
{"name":"google.com","results":{"A":{"data":{"additionals":...,"answers":[...],"protocol":"udp","resolver":"1.1.1.1:53"},"duration":0.030490042,"status":"NOERROR","timestamp":"2024-09-13T09:51:34-04:00"}}}
{"name":"facebook.com","results":{"A":{"data":{"additionals":[...],"answers":[...],"protocol":"udp","resolver":"8.8.8.8:53"},"duration":0.061365459,"status":"NOERROR","timestamp":"2024-09-13T09:51:34-04:00"}}}
ICANN CZDS या इसी तरह की ज़ोन फ़ाइलों का उपयोग --zone-file फ़्लैग के साथ ZDNS के लिए इनपुट स्रोत के रूप में किया जा सकता है। यह stdin (डिफ़ॉल्ट) या --input-file फ़्लैग के साथ एक फ़ाइल से ज़ोन फ़ाइलों को पार्स करने में सक्षम बनाता है।
डिफ़ॉल्ट रूप से, ZDNS प्रत्येक ज़ोन फ़ाइल रिकॉर्ड से केवल नाम निकालेगा। यदि आप CNAME या NS रिकॉर्ड जैसे रिकॉर्ड प्रकारों के उत्तर अनुभाग में संदर्भित नामों को भी हल करना चाहते हैं, तो आप --zone-file-include-targets CLI फ़्लैग का उपयोग कर सकते हैं।
उदाहरण के लिए, --zone-file-include-targets और इस DNS ज़ोन फ़ाइल प्रविष्टि के साथ:
example.com. 3600 IN NS ns1.example.com
example.com और ns1.example.com दोनों हल हो जाएंगे।
ZDNS प्रति-इनपुट-लाइन "ट्रिगर" पास करने का भी समर्थन करता है जो इनपुट लाइनों को विशिष्ट मॉड्यूल से मैप करते हैं। इनके साथ, आप निर्दिष्ट कर सकते हैं कि कुछ डोमेन को विशिष्ट मॉड्यूल के साथ देखा जाए।
इनपुट प्रारूप है:
domain_name,name_server,trigger,trigger_2,etc, जहां nameServer डिफ़ॉल्ट नेमसर्वर का उपयोग करने के लिए खाली हो सकता है और 1+ ट्रिगर निर्दिष्ट किए जा सकते हैं।
एक उदाहरण input.csv फ़ाइल:
example.com,,a-trigger
google.com,,a-trigger,cname-trigger
example.com,1.1.1.1,aaaa-trigger
yahoo.com
apnews.com,1.1.1.1
और संगत multiple.ini:
; यहां ग्लोबल विकल्प निर्दिष्ट करें
[Application Options]
iterative=true
prefer-ipv6-iteration="true"
; यहां मॉड्यूल और उनके संबंधित मॉड्यूल-विशिष्ट विकल्पों की सूची बनाएं। एक मॉड्यूल केवल एक बार सूचीबद्ध किया जा सकता है
[A]
trigger = "a-trigger"
[AAAA]
trigger = "aaaa-trigger"
[CNAME]
trigger = "cname-trigger"
यह लुकअप करेगा:
example.com को A मॉड्यूल के साथgoogle.com को A + CNAME मॉड्यूल के साथexample.com को AAAA मॉड्यूल के साथyahoo.com को सभी निर्दिष्ट मॉड्यूल के साथapnews.com को सभी निर्दिष्ट मॉड्यूल के साथकमांड चलाना:
zdns MULTIPLE --multi-config-file="./multiple.ini" --input-file="input.csv"
ZDNS या तो एक रिकर्सिव रिज़ॉल्वर (जैसे, संगठनात्मक DNS सर्वर) के विरुद्ध काम कर सकता है [डिफ़ॉल्ट व्यवहार] या आंतरिक रूप से अपनी पुनरावृत्ति कर सकता है। यदि आप कम संख्या में लुकअप कर रहे हैं (यानी, लाखों) और 10,000 से कम गो रूटीन का उपयोग कर रहे हैं, तो आमतौर पर Cloudflare या Google जैसे सामान्य रिकर्सिव रिज़ॉल्वर का उपयोग करना सबसे तेज़ होता है। Cloudflare लगभग हमेशा Google से तेज़ होता है। यह विशेष रूप से सच है यदि आप लोकप्रिय नामों को देख रहे हैं क्योंकि वे कैश्ड होते हैं और एक ही राउंड ट्रिप में उत्तर दिए जा सकते हैं। दसियों हज़ार समवर्ती थ्रेड का उपयोग करते समय, अपने रिकर्सिव रिज़ॉल्वर को DOS या रेट लिमिट करने से बचने के लिए आंतरिक रूप से पुनरावृत्ति करने पर विचार करें।
स्थानीय पुनरावृत्ति करने के लिए, zdns को --iterative फ़्लैग के साथ चलाएं। जब यह फ़्लैग उपयोग किया जाता है, ZDNS प्रकाशित रूट सर्वरों (जैसे, 198.41.0.4) के बीच राउंड-रॉबिन करेगा। पुनरावृत्त मोड में, आप --cache-size निर्दिष्ट करके स्थानीय कैश के आकार को नियंत्रित कर सकते हैं और --iteration-timeout सेट करके व्यक्तिगत पुनरावृत्तियों के लिए टाइमआउट को नियंत्रित कर सकते हैं। --timeout फ़्लैग किसी दिए गए इनपुट के लिए पूरे रिज़ॉल्यूशन के टाइमआउट को नियंत्रित करता है (यानी, सभी पुनरावृत्त चरणों का योग)।
ZDNS का प्रदर्शन हल्के-वजन वाले Go रूटीन का उपयोग करके बड़े पैमाने पर समानांतरीकरण से आता है। इस आर्किटेक्चर में कई सावधानियां हैं:
प्रत्येक Go रूटीन अपना स्वयं का समर्पित नेटवर्क सॉकेट उपयोग करता है। इस प्रकार, आपको उतने सॉकेट खोलने में सक्षम होना चाहिए (अधिकतम फ़ाइल डिस्क्रिप्टर और एफेमरल पोर्ट दोनों के संदर्भ में) जितने आपके पास थ्रेड निर्दिष्ट हैं (--threads के माध्यम से)। डिफ़ॉल्ट रूप से, ZDNS 1,000 थ्रेड का उपयोग करता है, जो Linux के डिफ़ॉल्ट अधिकतम 1024 खुले FD से कम है। हालांकि, यह Mac OS के डिफ़ॉल्ट 256 से अधिक है। आप ulimit -n चलाकर अनुमत खुले FD (और इस प्रकार सॉकेट) की अधिकतम संख्या देख सकते हैं। यदि आप इस संख्या से अधिक थ्रेड के साथ चलाना चाहते हैं, तो आपको OS स्तर पर खुली फ़ाइलों की संख्या बढ़ानी होगी। यदि आप ऐसा करने में विफल रहते हैं, तो आपको FATA[0000] unable to create socketlisten udp <client IP address>:0: socket: too many open files जैसी घातक त्रुटि का सामना करना पड़ेगा। यदि आपके पास उपलब्ध एफेमरल पोर्ट से अधिक थ्रेड चलाना चाहते हैं, तो आपको एकाधिक क्लाइंट IP पतों का उपयोग करना होगा: --local-addr=A,B,C।
डिफ़ॉल्ट रूप से, ZDNS प्रत्येक हल्के-वजन वाले रूटीन के लिए लॉन्च के समय एक अनबाउंड UDP सॉकेट बनाकर और इसका उपयोग सभी क्वेरी के लिए करके (गंतव्य IP की परवाह किए बिना) UDP सॉकेट को "पुन: उपयोग" करता है। यह नाटकीय रूप से प्रदर्शन में सुधार करता है क्योंकि ZDNS और होस्ट OS को प्रत्येक व्यक्तिगत पैकेट भेजने के लिए सॉकेट को सेटअप और टियर डाउन करने की आवश्यकता नहीं होती है (क्योंकि DNS क्वेरी/प्रतिक्रियाएं आमतौर पर एक पैकेट होती हैं)। हालांकि, इसका मतलब है कि ZDNS लॉन्च के समय प्रत्येक थ्रेड के लिए एक सॉकेट पूर्व-आवंटित करेगा। यह इष्टतम नहीं हो सकता है यदि आप केवल कम संख्या में नाम देख रहे हैं। उदाहरण के लिए, यदि आपको केवल 100 नाम देखने की आवश्यकता है, लेकिन डिफ़ॉल्ट 1,000 थ्रेड का उपयोग करते हैं, तो आप 900 UDP सॉकेट बांधेंगे लेकिन कभी उपयोग नहीं करेंगे। सॉकेट को रीसायकल करने की चिंता करने के बजाय, हम अनुशंसा करते हैं कि आप अपने उपयोग-मामले के लिए थ्रेड की एक उचित संख्या निर्दिष्ट करें (क्योंकि यह उन थ्रेड को शुरू करने के किसी भी कार्य को भी छोड़ देता है)। यही कारण है कि, हालांकि, आपको एक ही नाम देखने के बावजूद बड़ी संख्या में सॉकेट खोलने में असमर्थता के बारे में त्रुटि मिल सकती है। यदि प्रत्येक क्वेरी के लिए एक ताज़ा सॉकेट बनाना महत्वपूर्ण है, तो आप --recycle-sockets=false निर्दिष्ट करके इस पुन: उपयोग को अक्षम कर सकते हैं।
आप जो प्रदर्शन देखेंगे वह आपके कार्यप्रवाह, हार्डवेयर और नाम सर्वरों पर लोड कितने फैला हुआ है, पर निर्भर करता है। यदि आप अपने कार्यप्रवाह/हार्डवेयर के लिए प्रदर्शन को अधिकतम करना चाहते हैं, तो हम 100 थ्रेड से शुरू करने और तब तक बढ़ाने की सिफारिश करते हैं जब तक आप नाम रिज़ॉल्यूशन विफलताओं में वृद्धि नहीं देखते। इसमें मदद के लिए, आप --output-file=output.jsonl और grep -v "NOERROR" output.jsonl | wc -l का उपयोग करके उन नामों की संख्या गिन सकते हैं जो हल करने में विफल रहे।
ट्यूनिंग प्रदर्शन के लिए उपयोगी फ़्लैग हैं:
--timeout वह अधिकतम समय जो ZDNS एक एकल नाम पर खर्च करेगा--iteration-timeout वह अधिकतम समय जो ZDNS एक एकल पुनरावृत्ति चरण पर खर्च करेगा (जैसे: .com परत पर google.com को हल करना)--network-timeout वह अधिकतम समय जो ZDNS एक नेमसर्वर से प्रतिक्रिया की प्रतीक्षा करेगा--retries=N यदि --iterative में किसी विशिष्ट नेमसर्वर से कनेक्शन विफल हो जाता है, तो ZDNS उस परत पर एक और अप्रश्नित नेमसर्वर के साथ पुनः प्रयास करेगा।
पुनः प्रयास प्रति-नाम होते हैं, इसलिए यदि --retries=1 है तो ZDNS अपनी पूर्ण पुनरावृत्ति प्रक्रिया के दौरान एक बार एक नए नेमसर्वर के विरुद्ध एक नाम का पुनः प्रयास करेगा। यदि सभी नेमसर्वरों से पूछताछ की जा चुकी है तो एक यादृच्छिक नेमसर्वर चुना जाएगा।--name-servers लुकअप के लिए उपयोग किए जाने वाले नेमसर्वरों की सूची, अधिकतर --iterative=false के साथ उपयोगीDNS में बहुत सारा अतिरिक्त डेटा शामिल होता है जो हमेशा उपयोगी नहीं होता। चार परिणाम वर्बोसिटी स्तर हैं: short, normal (डिफ़ॉल्ट), long, और trace:
short: शॉर्ट सबसे संक्षिप्त परिणाम आउटपुट है। इसमें प्रतिक्रियाओं के बारे में केवल जानकारी होती हैnormal: सामान्य शॉर्ट में शामिल सब कुछ प्रदान करता है, साथ ही प्रतिक्रिया देने वाले सर्वर के बारे में डेटाlong: लॉन्ग वह सब कुछ आउटपुट करता है जो सर्वर ने DNS पैकेट में शामिल किया, जिसमें फ्लैग शामिल हैंtrace: ट्रेस पुनरावृत्ति प्रक्रिया के प्रत्येक चरण से सब कुछ आउटपुट करता हैउपयोगकर्ता --include-fields फ़्लैग का उपयोग करके विशिष्ट अतिरिक्त फ़ील्ड भी शामिल कर सकते हैं और फ़ील्ड की एक सूची निर्दिष्ट कर सकते हैं, जैसे, --include-fields=flags,resolver.
अतिरिक्त फ़ील्ड हैं: class, protocol, ttl, resolver, flags, dnssec.
डिफ़ॉल्ट रूप से ZDNS को कम संख्या में नेम सर्वरों पर देखने के लिए नामों की एक सूची प्राप्त होने की उम्मीद है। उदाहरण के लिए:
echo "google.com" | zdns A --name-servers=8.8.8.8,8.8.4.4
हालांकि, कई बार ऐसा होता है जब आप एक ही नाम को बड़ी संख्या में सर्वरों पर देखना चाहते हैं। यह नेम सर्वर मोड का उपयोग करके प्राप्त किया जा सकता है। उदाहरण के लिए:
echo "8.8.8.8" | zdns A --name-server-mode --override-name="google.com"
यहां, ZDNS में पाइप की गई प्रत्येक पंक्ति को google.com के लिए एक A क्वेरी भेजी जाती है। ZDNS name,nameServer की अल्पविराम-सीमांकित सूची को पाइप करके दोनों मोडों को मिश्रित और मैच करने का भी समर्थन करता है। उदाहरण के लिए:
echo "google.com,8.8.8.8" | zdns A 8.8.8.8 को google.com के लिए एक A क्वेरी भेजेगा, भले ही --name-servers= फ़्लैग द्वारा कौन से नेम सर्वर निर्दिष्ट किए गए हों। जो पंक्तियां स्पष्ट रूप से एक नेम सर्वर निर्दिष्ट नहीं करती हैं, वे OS या --name-servers फ़्लैग द्वारा निर्दिष्ट सर्वरों का उपयोग करेंगी जैसा कि सामान्य रूप से होता है।
सभी नेमसर्वरों के विरुद्ध एक निश्चित DNS क्वेरी करने के लिए एक सुविधा उपलब्ध है। उदाहरण के लिए, आप किसी निश्चित डोमेन के सभी नेमसर्वरों से A रिकॉर्ड प्राप्त करना चाह सकते हैं। ऐसा करने के लिए, आप कर सकते हैं:
echo "google.com" | zdns A --all-nameservers
ZDNS एक एकल आह्वान में कई लुकअप मॉड्यूल का उपयोग करने का समर्थन करता है। उदाहरण के लिए, मान लें कि आप डोमेन के एक सेट के लिए A, AAAA और MXLOOKUP करना चाहते हैं और आप उन्हें पुनरावृत्त रिज़ॉल्यूशन के साथ करना चाहते हैं। आपको MULTIPLE मॉड्यूल का उपयोग करना होगा और उन मॉड्यूल और मॉड्यूल-विशिष्ट फ़्लैग के साथ एक कॉन्फ़िग फ़ाइल प्रदान करनी होगी जिनका आप उपयोग करना चाहते हैं।
कृपया कॉन्फ़िग फ़ाइल में उपयोग किए जा सकने वाले ग्लोबल और मॉड्यूल-विशिष्ट विकल्पों के लिए zdns --help और zdns <MODULE_NAME> --help देखें।
उदाहरण के लिए:
cat 1000k_domains.txt | zdns MULTIPLE --multi-config-file="./multiple.ini"
जहां multiple.ini एक फ़ाइल है जो इस प्रकार दिखती है:
; यहां ग्लोबल विकल्प निर्दिष्ट करें
[Application Options]
iterative=true
; यहां मॉड्यूल और उनके संबंधित मॉड्यूल-विशिष्ट विकल्पों की सूची बनाएं। एक मॉड्यूल केवल एक बार सूचीबद्ध किया जा सकता है
[MXLOOKUP]
ipv4-lookup = true
; यदि आपको कोई विकल्प निर्दिष्ट करने की आवश्यकता नहीं है तो आप डिफ़ॉल्ट मानों का उपयोग कर सकते हैं और केवल मॉड्यूल सूचीबद्ध कर सकते हैं
[A]
[AAAA]
एक नमूना multiple.ini फ़ाइल src/cli/multiple.ini में प्रदान की गई है।
डिफ़ॉल्ट रूप से, ZDNS 1,000 हल्के-वजन वाले गो रूटीन के साथ काम करेगा। यदि आप सावधान नहीं हैं, तो यह कई अपस्ट्रीम DNS प्रदाताओं को अभिभूत कर देगा। हम सुझाव देते हैं कि उपयोगकर्ता कोई स्कैन करने से पहले स्थानीय नेटवर्क प्रशासकों के साथ समन्वय करें। आप --threads और --go-processes कमांड लाइन तर्कों के साथ समवर्ती कनेक्शनों की संख्या को नियंत्रित कर सकते हैं। वैकल्पिक नेम सर्वरों को --name-servers के साथ निर्दिष्ट किया जा सकता है। ZDNS अनुरोध करते समय इन सर्वरों के माध्यम से घूमेगा। हमने दसियों हज़ार हल्के-वजन वाले रूटीन के साथ ZDNS को सफलतापूर्वक चलाया है।
यदि zdns एक रिकॉर्ड प्रकार का सामना करता है जो समर्थित नहीं है, तो यह type फ़ील्ड को सही ढंग से सेट करके और unparsed_rr फ़ील्ड में अंतर्निहित डेटा संरचना का प्रतिनिधित्व करके एक आउटपुट रिकॉर्ड उत्पन्न करेगा। इस फ़ील्ड की उपस्थिति या संरचना पर भरोसा न करें। यह फ़ील्ड (और इसका अस्तित्व) किसी भी समय बदल सकता है क्योंकि हम अतिरिक्त रिकॉर्ड प्रकारों के लिए समर्थन का विस्तार करते हैं। यदि आप स्वयं को इस फ़ील्ड का उपयोग करते हुए पाते हैं, तो कृपया पार्सर समर्थन जोड़ने वाला पुल-रिक्वेस्ट सबमिट करने पर विचार करें।
benchmark/ में एक बेंचमार्क उपलब्ध है जिसका उपयोग ZDNS को एक पूर्वानुमानित फैशन में चलाने और रन के बारे में कुछ आँकड़े मुद्रित करने के लिए किया जा सकता है।
यह ZDNS में बदलाव से पहले और बाद में प्रदर्शन की तुलना करने के लिए उपयोगी हो सकता है।
अधिक विवरण के लिए बेंचमार्क README देखें।
यदि आप ZDNS में योगदान देने में रुचि रखते हैं, तो CONTRIBUTING देखें।
ZDNS कॉपीराइट 2020 रीजेंट्स ऑफ़ द यूनिवर्सिटी ऑफ़ मिशिगन
Apache License, Version 2.0 (the "License") के तहत लाइसेंस प्राप्त; आप इस फ़ाइल का उपयोग केवल लाइसेंस के अनुपालन में ही कर सकते हैं। आप लाइसेंस की एक प्रति http://www.apache.org/licenses/LICENSE-2.0 पर प्राप्त कर सकते हैं।
जब तक लागू कानून द्वारा आवश्यक न हो या लिखित रूप में सहमति न हो, लाइसेंस के तहत वितरित सॉफ़्टवेयर "जैसा है" वितरित किया जाता है, बिना किसी प्रकार की वारंटी या शर्तों के, या तो व्यक्त या निहित। लाइसेंस के तहत अनुमतियों और सीमाओं को नियंत्रित करने वाली विशिष्ट भाषा के लिए LICENSE देखें।
Go अपने लिए उपलब्ध सभी CPU कोर का उपयोग करने में प्रसन्न है, और यदि आप बड़ी संख्या में थ्रेड निर्दिष्ट करते हैं तो भारी मात्रा में CPU का उपयोग कर सकता है। CPU मुख्य रूप से पार्सिंग और JSON एन्कोडिंग के लिए उपयोग किया जाता है। यदि आप CPU कोर की संख्या को सीमित करना चाहते हैं, तो आप --go-processes=n फ़्लैग शामिल करके या GOMAXPROCS पर्यावरण चर सेट करके ऐसा कर सकते हैं।
--threads की एक सटीक मात्रा की सिफारिश करना मुश्किल है क्योंकि यह कई कारकों पर निर्भर करता है। नीचे दिया गया ग्राफ दिखाता है कि कैसे एक नमूना कार्यप्रवाह में थ्रेड की संख्या बढ़ने पर कम रनटाइम लेकिन नाम रिज़ॉल्यूशन विफलता की उच्च दर होती है।