
مجموعة أدوات قياس DNS واستكشاف الأخطاء وإصلاحها وتدقيق الأمان
هل تساءلت يومًا ما إذا كان مزود خدمة الإنترنت الخاص بك يعترض حركة DNS الخاصة بك؟ هل لاحظت أي سلوك غير معتاد في استجابات DNS الخاصة بك، أو تمت إعادة توجيهك إلى عنوان خاطئ وشككت في وجود خطأ ما في DNS لديك؟ نحن نقدم مجموعة من الأدوات لإجراء تدقيق أساسي على طلبات واستجابات DNS الخاصة بك، مما يساعدك على ضمان أن DNS الخاص بك يعمل كما هو متوقع.
باستخدام dnsping، يمكنك قياس وقت الاستجابة لأي خادم DNS لاستعلامات عشوائية. على غرار أداة ping العادية، توفر dnsping وظائف مماثلة لطلبات DNS، مما يساعدك على مراقبة استجابة الخادم.
يمكنك أيضًا تتبع مسار طلب DNS الخاص بك إلى وجهته باستخدام dnstraceroute، للتحقق من عدم إعادة توجيهه أو اعتراضه. من خلال مقارنة استعلامات DNS المرسلة إلى نفس الخادم، يتيح لك dnstraceroute ملاحظة أي اختلافات في المسارات المتخذة، مما ينبهك إلى المشكلات المحتملة.
dnseval يقوم بتقييم عدة حلول DNS لمساعدتك في اختيار أفضل محلل DNS لشبكتك. على الرغم من أنه يُنصح باستخدام محلل DNS خاص بك لتجنب الاعتماد على محللي DNS من طرف ثالث، إلا أن dnseval يمكن أن يساعد في اختيار محلل DNS الأمثل عند الحاجة. يتيح لك مقارنة خوادم DNS بناءً على الأداء (زمن الاستجابة) والموثوقية (فقدان الحزم)، مما يمنحك نظرة شاملة لاتخاذ قرارات مستنيرة.
هناك عدة طرق لاستخدام هذه المجموعة من الأدوات، على الرغم من أننا نوصي بتشغيلها مباشرة من الكود المصدري لتحقيق أقصى مرونة وتحكم.
git clone https://github.com/farrokhi/dnsdiag.git
cd dnsdiag
pip3 install -r requirements.txt
pip3 install dnsdiag
uv هو مدير حزم Python سريع يمكنه تشغيل الأدوات مباشرة دون تثبيت:
# قم بتشغيل dnsping مباشرة دون تثبيت
uvx --from dnsdiag dnsping google.com
# قم بالتشغيل مع خيارات محددة
uvx --from dnsdiag dnsping -c 5 --tls -s 8.8.8.8 example.com
# قم بتشغيل dnstraceroute
uvx --from dnsdiag dnstraceroute cloudflare.com
# قم بتشغيل dnseval
uvx --from dnsdiag dnseval -f public-servers.txt github.com
لتثبيت dnsdiag بشكل دائم:
# قم بتثبيت أدوات dnsdiag
uv tool install dnsdiag
# الترقية إلى أحدث إصدار
uv tool upgrade dnsdiag
من وقت لآخر، سيتم إصدار حزم ثنائية لنظامي Windows و macOS و Linux. يمكنك الحصول على أحدث إصدار من صفحة الإصدارات.
الملفات الثنائية المبنية مسبقًا متوفرة لـ:
Windows ARM64 غير مدعوم حاليًا بسبب اعتماديات البناء التي تتطلب سلاسل أدوات تجميع أصلية غير متوفرة بسهولة. إذا كنت تستخدم Windows على ARM، يمكنك تشغيل dnsdiag باستخدام نظام Windows Subsystem for Linux (WSL2) أو التثبيت مباشرة من المصدر.
إذا كنت تفضل عدم تثبيت dnsdiag على جهازك المحلي، يمكنك استخدام صورة Docker لتشغيل الأدوات في بيئة حاوية. على سبيل المثال:
docker run --network host -it --rm farrokhi/dnsdiag dnsping.py
يسمح لك dnsping "بإجراء ping" لمحلل DNS عن طريق إرسال استعلام DNS عشوائي عدة مرات. للحصول على قائمة كاملة بخيارات سطر الأوامر المدعومة، استخدم --help. فيما يلي بعض العلامات الرئيسية:
--tcp أو --tls أو --doh أو --quic أو --http3 لتحديد بروتوكول النقل (الافتراضي هو UDP). هذه الخيارات متنافية؛ يمكن تحديد بروتوكول واحد فقط لكل أمر.--flags لعرض علامات الاستجابة، بما في ذلك علامات EDNS، لكل استجابة.--dnssec لطلب التحقق من DNSSEC، إذا كان متاحًا.--nsid لعرض معرف خادم الاسم (NSID) إذا كان متاحًا (RFC 5001).--ecs لتضمين معلومات شبكة العميل الفرعية الخاصة بـ EDNS لتحسين التوجيه الجغرافي.--cookie لعرض ملفات تعريف الارتباط DNS (RFC 7873) عند وجودها في الاستجابات../dnsping.py -c 5 --dnssec --flags --tls -t AAAA -s 8.8.8.8 brokendnssec.net
dnsping.py DNS: 8.8.8.8:853, hostname: brokendnssec.net, proto: TLS, class: IN, type: AAAA, flags: [RD]
75 bytes from 8.8.8.8: seq=1 time=73.703 ms SERVFAIL [QR RD RA -- DO] [EDE:10("For brokendnssec.net/soa")]
75 bytes from 8.8.8.8: seq=2 time=69.523 ms SERVFAIL [QR RD RA -- DO] [EDE:10("For brokendnssec.net/soa")]
75 bytes from 8.8.8.8: seq=3 time=58.058 ms SERVFAIL [QR RD RA -- DO] [EDE:10("For brokendnssec.net/soa")]
75 bytes from 8.8.8.8: seq=4 time=54.235 ms SERVFAIL [QR RD RA -- DO] [EDE:10("For brokendnssec.net/soa")]
75 bytes from 8.8.8.8: seq=5 time=57.806 ms SERVFAIL [QR RD RA -- DO] [EDE:10("For brokendnssec.net/soa")]
--- 8.8.8.8 dnsping statistics ---
5 requests transmitted, 5 responses received, 0% lost
min=54.235 ms, avg=22.665 ms, max=69.523 ms, stddev=38.202 ms
يوفر dnsping أيضًا إحصائيات مثل الحد الأدنى والحد الأقصى ومتوسط أوقات الاستجابة، بالإضافة إلى التذبذب (الانحراف المعياري) وفقدان الحزم.
فيما يلي بعض حالات الاستخدام المثيرة لـ dnsping:
--dnssec../dnsping.py -c 3 --ecs 203.0.113.0/24 -s 94.140.14.14 google.com
dnsping.py DNS: 94.140.14.14:53, hostname: google.com, proto: UDP, class: IN, type: A, flags: [RD]
66 bytes from 94.140.14.14: seq=1 time=31.407 ms NOERROR [ECS:203.0.113.0/24/24]
66 bytes from 94.140.14.14: seq=2 time=29.156 ms NOERROR [ECS:203.0.113.0/24/24]
66 bytes from 94.140.14.14: seq=3 time=30.892 ms NOERROR [ECS:203.0.113.0/24/24]
--- 94.140.14.14 dnsping statistics ---
3 requests transmitted, 3 responses received, 0% lost
min=29.156 ms, avg=30.485 ms, max=31.407 ms, stddev=1.176 ms
./dnsping.py -c 2 --nsid -s 8.8.8.8 google.com
dnsping.py DNS: 8.8.8.8:53, hostname: google.com, proto: UDP, class: IN, type: A, flags: [RD]
68 bytes from 8.8.8.8: seq=1 time=36.399 ms NOERROR [NSID:gpdns-ams]
68 bytes from 8.8.8.8: seq=2 time=32.156 ms NOERROR [NSID:gpdns-ams]
--- 8.8.8.8 dnsping statistics ---
2 requests transmitted, 2 responses received, 0% lost
min=32.156 ms, avg=34.278 ms, max=36.399 ms, stddev=2.122 ms
./dnsping.py -c 2 --cookie -s anyns.pch.net quad9.net
dnsping.py DNS: anyns.pch.net:53, hostname: quad9.net, proto: UDP, class: IN, type: A, flags: [RD]
82 bytes from anyns.pch.net: seq=1 time=30.552 ms NOERROR [COOKIE:27f609c017bb2ec4ea70de5c68eec3fc39f6a53ee49c55f8]
82 bytes from anyns.pch.net: seq=2 time=24.794 ms NOERROR [COOKIE:719631dd9fcce722d3ac859b68eec3fd2e5430b5c8a7f8cf]
--- anyns.pch.net dnsping statistics ---
2 requests transmitted, 2 responses received, 0% lost
min=24.794 ms, avg=27.673 ms, max=30.552 ms, stddev=4.072 ms
عند استخدام --dnssec و --flags، يكشف dnsping عن حقول بروتوكول DNS ذات الصلة المباشرة بالتحقق من أمان DNS. تشير هذه القيم إلى ما إذا كان المحلل قادرًا على التحقق من صحة DNSSEC وما إذا تم التحقق من الاستجابة بنجاح.
العلامات الشائعة:
DO (DNSSEC OK)
يشير إلى أن العميل يطلب سجلات متعلقة بـ DNSSEC. وجوده يظهر أن المحلل يدعم استعلامات DNSSEC.
AD (Authenticated Data)
يتم تعيينها بواسطة المحللين الذين يقومون بالتحقق عندما يتم التحقق من الاستجابة تشفيريًا باستخدام DNSSEC. هذه إشارة قوية على أن التحقق من DNSSEC نشط وناجح.
الأنماط النموذجية:
| النتيجة | المعنى |
|---|---|
NOERROR مع علامة AD | نجح التحقق من DNSSEC |
SERVFAIL مع علامة |
توفر أخطاء DNS الموسعة (EDE, RFC 8914) معلومات تشخيصية إضافية عند فشل التحقق من DNSSEC. على سبيل المثال:
هذه المؤشرات تجعل dnsping مفيدًا ليس فقط لاختبار الأداء، ولكن أيضًا للتحقق من أن المحللين يفرضون DNSSEC بشكل صحيح ولتشخيص مشكلات نشر DNSSEC.
dnstraceroute هي أداة تقوم بتتبع مسار طلبات DNS الخاصة بك إلى وجهتها. قد ترغب في مقارنة ذلك مع تتبع المسار الفعلي لشبكتك للتأكد من أن حركة DNS الخاصة بك لا تمر عبر أي مسارات غير مرغوب فيها.
يدعم dnstraceroute بروتوكولات نقل متعددة (متنافية):
--tcp) - DNS عبر TCP--quic) - DNS عبر QUIC (مدعوم من AdGuard DNS)--http3) - DNS عبر HTTP/3 (مدعوم من Google DNS و Cloudflare)./dnstraceroute.py --expert --asn -C -t A -s 8.8.4.4 facebook.com
يمكنك أيضًا اختبار بروتوكولات DNS الحديثة:
# اختبار DNS عبر QUIC مع AdGuard DNS
./dnstraceroute.py --quic -s 94.140.14.14 -c 3 google.com
# اختبار DNS عبر HTTP/3 مع Google DNS
./dnstraceroute.py --http3 -s 8.8.8.8 -c 3 google.com
dnstraceroute.py DNS: 8.8.4.4:53, hostname: facebook.com, rdatatype: A
1 192.168.0.1 (192.168.0.1) 1 ms
2 192.168.28.177 (192.168.28.177) 4 ms
3 192.168.0.1 (192.168.0.1) 693 ms
4 172.19.4.17 (172.19.4.17) 3 ms
5 dns.google (8.8.4.4) [AS15169 GOOGLE, US] 8 ms
=== Expert Hints ===
[*] public DNS server is next to a private IP address (possible hijacking)
سيؤدي استخدام علامة --expert مع dnstraceroute إلى تمكين عرض تلميحات الخبراء، بما في ذلك التحذيرات حول احتمالية اختطاف حركة DNS.
dnseval هي أداة ping بالجملة ترسل استعلامات DNS عشوائية إلى قائمة محددة من خوادم DNS، مما يسمح لك بمقارنة أوقات استجابتها في وقت واحد.
يمكنك استخدام dnseval لتقييم أوقات الاستجابة عبر بروتوكولات نقل مختلفة، بما في ذلك UDP (الافتراضي)، TCP، DoT (DNS عبر TLS)، DoH (DNS عبر HTTPS)، DoQ (DNS عبر QUIC)، و DoH3 (DNS عبر HTTP/3) باستخدام العلامات --tcp، --tls، --doh، --quic، و --http3 على التوالي. خيارات البروتوكول هذه متنافية؛ يمكن تحديد واحد فقط لكل أمر.
DoQ: DNS عبر QUIC, DoH3: DNS عبر HTTP/3
./dnseval.py --skip-warmup --dnssec -c10 -f public-servers.txt ripe.net
server avg(ms) min(ms) max(ms) stddev(ms) lost(%) ttl flags response
---------------------------------------------------------------------------------------------------------------------
1.0.0.1 29.01 14.15 45.36 8.60 %0 300 QR -- -- RD RA AD -- DO NOERROR
1.1.1.1 23.90 18.14 42.07 7.83 %0 300 QR -- -- RD RA AD -- DO NOERROR
1.0.0.2 25.90 21.36 31.58 4.26 %0 300 QR -- -- RD RA AD -- DO NOERROR
1.1.1.2 22.68 18.36 32.15 3.96 %0 300 QR -- -- RD RA AD -- DO NOERROR
1.0.0.3 22.53 18.98 32.52 3.94 %0 300 QR -- -- RD RA AD -- DO NOERROR
1.1.1.3 21.70 20.25 22.97 0.77 %0 299 QR -- -- RD RA AD -- DO NOERROR
2606:4700:4700::1001 21.70 19.13 27.50 2.28 %0 299 QR -- -- RD RA AD -- DO NOERROR
2606:4700:4700::1111 22.63 20.42 30.18 3.13 %0 299 QR -- -- RD RA AD -- DO NOERROR
2606:4700:4700::1002 24.97 20.89 44.63 7.16 %0 299 QR -- -- RD RA AD -- DO NOERROR
2606:4700:4700::1112 23.24 21.37 25.87 1.48 %0 298 QR -- -- RD RA AD -- DO NOERROR
2606:4700:4700::1003 21.68 19.28 24.88 1.65 %0 298 QR -- -- RD RA AD -- DO NOERROR
2606:4700:4700::1113 22.61 19.86 26.09 1.73 %0 299 QR -- -- RD RA AD -- DO NOERROR
195.46.39.39 25.56 16.42 55.37 15.37 %0 300 QR -- -- RD RA -- -- -- NOERROR
195.46.39.40 19.08 16.51 23.86 2.24 %0 300 QR -- -- RD RA -- -- -- NOERROR
2a05:d014:939:3300::39 0.00 0.00 0.00 0.00 %100 N/A -- -- -- -- -- -- -- -- No Response
2a05:d014:939:3300::40 0.00 0.00 0.00 0.00 %100 N/A -- -- -- -- -- -- -- -- No Response
208.67.220.220 30.60 14.54 120.64 31.88 %0 300 QR -- -- RD RA AD -- DO NOERROR
208.67.222.222 21.78 17.42 36.45 6.06 %0 50 QR -- -- RD RA AD -- DO NOERROR
2620:0:ccc::2 29.48 19.23 98.29 24.22 %0 299 QR -- -- RD RA AD -- DO NOERROR
2620:0:ccd::2 22.36 17.90 30.18 3.98 %0 299 QR -- -- RD RA AD -- DO NOERROR
216.146.35.35 172.53 114.46 360.87 71.47 %0 299 QR -- -- RD RA AD -- DO NOERROR
216.146.36.36 187.36 118.21 324.32 59.08 %0 110 QR -- -- RD RA AD -- DO NOERROR
209.244.0.3 46.49 25.23 115.86 28.19 %0 300 QR -- -- RD RA -- -- DO NOERROR
209.244.0.4 58.33 28.09 109.18 29.20 %0 299 QR -- -- RD RA -- -- DO NOERROR
4.2.2.1 64.58 30.21 86.79 30.19 %25 299 QR -- -- RD RA -- -- DO NOERROR
4.2.2.2 40.54 22.69 74.80 20.76 %0 70 QR -- -- RD RA -- -- DO NOERROR
4.2.2.3 90.62 90.62 90.62 0.00 %50 70 QR -- -- RD RA -- -- DO NOERROR
4.2.2.4 31.53 23.80 70.93 14.51 %0 294 QR -- -- RD RA -- -- DO NOERROR
4.2.2.5 24.11 24.05 24.18 0.09 %33 294 QR -- -- RD RA -- -- DO NOERROR
80.80.80.80 0.00 0.00 0.00 0.00 %100 N/A -- -- -- -- -- -- -- -- No Response
80.80.81.81 0.00 0.00 0.00 0.00 %100 N/A -- -- -- -- -- -- -- -- No Response
8.8.4.4 28.35 20.85 39.14 7.24 %0 300 QR -- -- RD RA AD -- DO NOERROR
8.8.8.8 21.22 16.22 24.93 2.39 %0 299 QR -- -- RD RA AD -- DO NOERROR
يمكنك أيضًا حفظ النتائج بتنسيق JSONL لمزيد من المعالجة. كل سطر في ملف الإخراج هو كائن JSON صالح يحتوي على نتائج القياس الكاملة لخادم DNS واحد.
./dnseval.py -c 5 -j results.jsonl -f public-servers.txt example.com
يمكن تحليل الإخراج سطرًا بسطر باستخدام أدوات JSON القياسية مثل jq.
cat results.jsonl | jq -r 'select(.data.r_lost_percent == 0) | .data.resolver'
بابك فرخي
تم إصدار dnsdiag بموجب ترخيص BSD ذي البندين.
DO| فشل التحقق من DNSSEC (غالبًا بسبب تواقيع معطلة أو تكوين خاطئ) |
عدم وجود علامة AD | المحلل لا يقوم بالتحقق من DNSSEC |
| الأداة | UDP | TCP | TLS (DoT) | DoH | DoQ | DoH3 |
|---|
dnsping | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
dnstraceroute | ✓ | ✓ | - | - | ✓ | ✓ |
dnseval | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |