
dnsdiag v2.9.4
مجموعة أدوات قياس DNS واستكشاف الأخطاء وإصلاحها وتدقيق الأمان
مجموعة أدوات قياس DNS واستكشاف الأخطاء وأمن التدقيق
هل تساءلت يومًا ما إذا كان مزود خدمة الإنترنت الخاص بك يعترض حركة DNS الخاصة بك؟ هل لاحظت أي سلوك غير معتاد في استجابات DNS الخاصة بك، أو تمت إعادة توجيهك إلى عنوان خاطئ وشككت في وجود خطأ ما في DNS لديك؟ نحن نقدم مجموعة من الأدوات لإجراء تدقيق أساسي على طلبات واستجابات DNS الخاصة بك، مما يساعدك على ضمان أن DNS الخاص بك يعمل كما هو متوقع.
باستخدام dnsping، يمكنك قياس وقت الاستجابة لأي خادم DNS لاستعلامات عشوائية. على غرار أداة ping العادية، توفر dnsping وظائف مماثلة لطلبات DNS، مما يساعدك على مراقبة استجابة الخادم.
يمكنك أيضًا تتبع مسار طلب DNS الخاص بك إلى وجهته باستخدام dnstraceroute، للتحقق من عدم إعادة توجيهه أو اعتراضه. من خلال مقارنة استعلامات DNS المرسلة إلى نفس الخادم، يتيح لك dnstraceroute ملاحظة أي اختلافات في المسارات المتخذة، مما ينبهك إلى المشكلات المحتملة.
dnseval يقوم بتقييم عدة حلول DNS لمساعدتك في اختيار أفضل محلل DNS لشبكتك. على الرغم من أنه يُنصح باستخدام محلل DNS خاص بك لتجنب الاعتماد على محللي DNS من طرف ثالث، إلا أن dnseval يمكن أن يساعد في اختيار محلل DNS الأمثل عند الحاجة. يتيح لك مقارنة خوادم DNS بناءً على الأداء (زمن الاستجابة) والموثوقية (فقدان الحزم)، مما يمنحك نظرة شاملة لاتخاذ قرارات مستنيرة.
التثبيت
هناك عدة طرق لاستخدام هذه المجموعة من الأدوات، على الرغم من أننا نوصي بتشغيلها مباشرة من الكود المصدري لتحقيق أقصى مرونة وتحكم.
الكود المصدري
- استنسخ مستودع git وقم بتثبيت التبعيات:
git clone https://github.com/farrokhi/dnsdiag.git
cd dnsdiag
pip3 install -r requirements.txt
- يمكنك بدلاً من ذلك تثبيت الحزمة باستخدام pip:
pip3 install dnsdiag
باستخدام uv (موصى به)
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. يمكنك الحصول على أحدث إصدار من صفحة الإصدارات.
المنصات المدعومة
الملفات الثنائية المبنية مسبقًا متوفرة لـ:
- Linux (x86_64, ARM64)
- macOS (Intel, Apple Silicon)
- Windows (x86_64)
Windows ARM64 غير مدعوم حاليًا بسبب اعتماديات البناء التي تتطلب سلاسل أدوات تجميع أصلية غير متوفرة بسهولة. إذا كنت تستخدم Windows على ARM، يمكنك تشغيل dnsdiag باستخدام نظام Windows Subsystem for Linux (WSL2) أو التثبيت مباشرة من المصدر.
Docker
إذا كنت تفضل عدم تثبيت dnsdiag على جهازك المحلي، يمكنك استخدام صورة Docker لتشغيل الأدوات في بيئة حاوية. على سبيل المثال:
docker run --network host -it --rm farrokhi/dnsdiag dnsping.py
dnsping
يسمح لك dnsping "بإجراء ping" لمحلل DNS عن طريق إرسال استعلام DNS عشوائي عدة مرات. للحصول على قائمة كاملة بخيارات سطر الأوامر المدعومة، استخدم --help. فيما يلي بعض العلامات الرئيسية:
- استخدم
--tcpأو--tlsأو--dohأو--quicأو--http3لتحديد بروتوكول النقل (الافتراضي هو UDP). هذه الخيارات متنافية؛ يمكن تحديد بروتوكول واحد فقط لكل أمر. - استخدم
--flagsلعرض علامات الاستجابة، بما في ذلك علامات EDNS، لكل استجابة. - استخدم
--dnssecلطلب التحقق من DNSSEC، إذا كان متاحًا. - يتم عرض رسائل خطأ DNS الموسعة (RFC 8914) تلقائيًا عند وجودها.
- استخدم
--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:
- مقارنة أوقات الاستجابة عبر بروتوكولات النقل المختلفة (مثل UDP مقابل DoH).
- تقييم موثوقية خادم DNS الخاص بك عن طريق قياس التذبذب وفقدان الحزم.
- قياس أوقات الاستجابة مع تمكين DNSSEC باستخدام علامة
--dnssec. - اختبار سلوك شبكة العميل الفرعية EDNS للاستجابات الواعية بالموقع الجغرافي:
./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
- تحديد خوادم DNS باستخدام خيار NSID:
./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
- اختبار ملفات تعريف الارتباط DNS لتعزيز الأمان وتحسين التخزين المؤقت:
./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 والأمان ذات الصلة
عند استخدام --dnssec و --flags، يكشف dnsping عن حقول بروتوكول DNS ذات الصلة المباشرة بالتحقق من أمان DNS. تشير هذه القيم إلى ما إذا كان المحلل قادرًا على التحقق من صحة DNSSEC وما إذا تم التحقق من الاستجابة بنجاح.
العلامات الشائعة:
-
DO (DNSSEC OK)
يشير إلى أن العميل يطلب سجلات متعلقة بـ DNSSEC. وجوده يظهر أن المحلل يدعم استعلامات DNSSEC. -
AD (Authenticated Data)
يتم تعيينها بواسطة المحللين الذين يقومون بالتحقق عندما يتم التحقق من الاستجابة تشفيريًا باستخدام DNSSEC. هذه إشارة قوية على أن التحقق من DNSSEC نشط وناجح.
الأنماط النموذجية:
| النتيجة | المعنى |
|---|---|
NOERROR مع علامة AD | نجح التحقق من DNSSEC |
SERVFAIL مع علامة DO | فشل التحقق من DNSSEC (غالبًا بسبب تواقيع معطلة أو تكوين خاطئ) |
عدم وجود علامة AD | المحلل لا يقوم بالتحقق من DNSSEC |
توفر أخطاء DNS الموسعة (EDE, RFC 8914) معلومات تشخيصية إضافية عند فشل التحقق من DNSSEC. على سبيل المثال:
- EDE:10 – DNSSEC Bogus (بيانات DNSSEC غير صالحة أو معطلة)
- EDE:6 – DNSSEC Signature Expired (انتهاء صلاحية توقيع DNSSEC)
- EDE:7 – DNSSEC Signature Not Yet Valid (توقيع DNSSEC لم يصبح ساريًا بعد)
هذه المؤشرات تجعل dnsping مفيدًا ليس فقط لاختبار الأداء، ولكن أيضًا للتحقق من أن المحللين يفرضون DNSSEC بشكل صحيح ولتشخيص مشكلات نشر DNSSEC.
dnstraceroute
dnstraceroute هي أداة تقوم بتتبع مسار طلبات DNS الخاصة بك إلى وجهتها. قد ترغب في مقارنة ذلك مع تتبع المسار الفعلي لشبكتك للتأكد من أن حركة DNS الخاصة بك لا تمر عبر أي مسارات غير مرغوب فيها.
يدعم dnstraceroute بروتوكولات نقل متعددة (متنافية):
- UDP (الافتراضي) - استعلامات DNS التقليدية
- TCP (
--tcp) - DNS عبر TCP - DoQ (
--quic) - DNS عبر QUIC (مدعوم من AdGuard DNS) - DoH3 (
--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
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 على التوالي. خيارات البروتوكول هذه متنافية؛ يمكن تحديد واحد فقط لكل أمر.
ملخص دعم البروتوكول
| الأداة | UDP | TCP | TLS (DoT) | DoH | DoQ | DoH3 |
|---|---|---|---|---|---|---|
dnsping | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
dnstraceroute | ✓ | ✓ | - | - | ✓ | ✓ |
dnseval | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
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'
المؤلف
بابك فرخي
- github: github.com/farrokhi
- website: farrokhi.net
- mastodon: @[email protected]
- twitter: @farrokhi
الترخيص
تم إصدار dnsdiag بموجب ترخيص BSD ذي البندين.