
مكتبة وأداة CLI سريعة للبحث في DNS
ZDNS هو محلل DNS عالي السرعة وأداة سطر أوامر لإجراء قياسات DNS على نطاق واسع. ZDNS مكتوب بلغة Go ويحتوي على كود حل متكرر خاص به وذاكرة تخزين مؤقت محسّنة لإجراء عمليات البحث عن مجموعة متنوعة من الأسماء. نستخدم https://github.com/zmap/dns لبناء وتحليل حزم DNS الأولية. لمزيد من المعلومات حول بنية ZDNS وأدائه، راجع الورقة البحثية التالية التي ظهرت في مؤتمر قياس الإنترنت '22 التابع لـ ACM.
[!TIP] يحتوي ويكي ZDNS على معلومات إضافية حول ZDNS ويشرح حالات الاستخدام والأمثلة.
يمكن تثبيت ZDNS عن طريق استنساخ المستودع وتشغيل make install.
git clone https://github.com/zmap/zdns.git
cd zdns
make install
يتكون ZDNS من مكتبة محلل متكرر وغلاف CLI.
تتكون المكتبة من بنية ResolverConfig التي ستحتوي على جميع خيارات التكوين لجميع عمليات البحث التي تتم. يتم استخدام ResolverConfig لإنشاء بنية (بُنى) Resolver واحدة أو أكثر والتي ستقوم بجميع عمليات البحث. يجب أن يقوم Resolver بإجراء بحث واحد فقط في كل مرة (ليس آمنًا للخيوط) ويجب استخدام بُنى Resolver متعددة للتوازي. راجع الأمثلة لكيفية استخدام المكتبة. تُستخدم الوحدات النمطية لتحديد سلوك عمليات البحث.
يوفر ZDNS عدة أنواع من الوحدات النمطية:
وحدات DNS الأولية توفر استجابة DNS الأولية من الخادم المشابهة لـ dig، ولكن بصيغة JSON. توجد وحدة نمطية لكل نوع تقريبًا من سجلات DNS
وحدات البحث توفر استجابات أكثر فائدة عندما تكون هناك حاجة إلى استعلامات متعددة (على سبيل المثال، إكمال بحث A إضافي لعناوين IP إذا تم استلام NS في NSLOOKUP)
وحدات متنوعة توفر وسائل إضافية أخرى لاستعلام الخوادم (على سبيل المثال، 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 استجابة DNS الأولية بصيغة JSON، على غرار dig.
على سبيل المثال، الأمر:
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 ستقوم أيضًا بإجراء بحث A لعناوين IP التي تتوافق مع سجل التبادل.
nslookup ستقوم أيضًا بإجراء بحث A/AAAA لعناوين IP التي تتوافق مع سجل NS.
على سبيل المثال،
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 أو ما شابه) كمصدر إدخال لـ ZDNS مع العلم --zone-file. يتيح ذلك تحليل ملفات المنطقة إما من stdin (الافتراضي) أو من ملف مع العلم --input-file.
افتراضيًا، سيقوم ZDNS باستخراج الاسم فقط من كل سجل ملف منطقة. إذا كنت ترغب أيضًا في حل الأسماء المشار إليها في قسم الإجابة من أنواع السجلات مثل CNAMEs أو NS records، يمكنك استخدام علم CLI --zone-file-include-targets.
على سبيل المثال، مع --zone-file-include-targets وإدخال ملف المنطقة هذا:
example.com. 3600 IN NS ns1.example.com
سيتم حل كل من example.com و ns1.example.com.
يدعم ZDNS أيضًا تمرير "مشغلات" لكل سطر إدخال تقوم بتعيين أسطر الإدخال إلى وحدات نمطية محددة. باستخدام هذه، يمكنك تحديد أن يتم البحث عن نطاقات معينة باستخدام وحدات نمطية محددة.
تنسيق الإدخال هو:
domain_name,name_server,trigger,trigger_2,etc، حيث يمكن أن يكون nameServer فارغًا لاستخدام خوادم الأسماء الافتراضية ويمكن تحديد مشغل واحد أو أكثر.
ملف 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