العودة إلى التحديثات
New releaseJul 21, 2026

dnsdiag v2.9.4

مجموعة أدوات قياس DNS واستكشاف الأخطاء وإصلاحها وتدقيق الأمان

مشاركة

PyPI PyPI Downloads Downloads PyPI Docker Pulls GitHub stars

مجموعة أدوات قياس DNS واستكشاف الأخطاء وأمن التدقيق

هل تساءلت يومًا ما إذا كان مزود خدمة الإنترنت الخاص بك يعترض حركة DNS الخاصة بك؟ هل لاحظت أي سلوك غير معتاد في استجابات DNS الخاصة بك، أو تمت إعادة توجيهك إلى عنوان خاطئ وشككت في وجود خطأ ما في DNS لديك؟ نحن نقدم مجموعة من الأدوات لإجراء تدقيق أساسي على طلبات واستجابات DNS الخاصة بك، مما يساعدك على ضمان أن DNS الخاص بك يعمل كما هو متوقع.

باستخدام dnsping، يمكنك قياس وقت الاستجابة لأي خادم DNS لاستعلامات عشوائية. على غرار أداة ping العادية، توفر dnsping وظائف مماثلة لطلبات DNS، مما يساعدك على مراقبة استجابة الخادم.

يمكنك أيضًا تتبع مسار طلب DNS الخاص بك إلى وجهته باستخدام dnstraceroute، للتحقق من عدم إعادة توجيهه أو اعتراضه. من خلال مقارنة استعلامات DNS المرسلة إلى نفس الخادم، يتيح لك dnstraceroute ملاحظة أي اختلافات في المسارات المتخذة، مما ينبهك إلى المشكلات المحتملة.

dnseval يقوم بتقييم عدة حلول DNS لمساعدتك في اختيار أفضل محلل DNS لشبكتك. على الرغم من أنه يُنصح باستخدام محلل DNS خاص بك لتجنب الاعتماد على محللي DNS من طرف ثالث، إلا أن dnseval يمكن أن يساعد في اختيار محلل DNS الأمثل عند الحاجة. يتيح لك مقارنة خوادم DNS بناءً على الأداء (زمن الاستجابة) والموثوقية (فقدان الحزم)، مما يمنحك نظرة شاملة لاتخاذ قرارات مستنيرة.

التثبيت

هناك عدة طرق لاستخدام هذه المجموعة من الأدوات، على الرغم من أننا نوصي بتشغيلها مباشرة من الكود المصدري لتحقيق أقصى مرونة وتحكم.

الكود المصدري

  1. استنسخ مستودع git وقم بتثبيت التبعيات:
git clone https://github.com/farrokhi/dnsdiag.git
cd dnsdiag
pip3 install -r requirements.txt
  1. يمكنك بدلاً من ذلك تثبيت الحزمة باستخدام 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:10DNSSEC Bogus (بيانات DNSSEC غير صالحة أو معطلة)
  • EDE:6DNSSEC Signature Expired (انتهاء صلاحية توقيع DNSSEC)
  • EDE:7DNSSEC 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 على التوالي. خيارات البروتوكول هذه متنافية؛ يمكن تحديد واحد فقط لكل أمر.

ملخص دعم البروتوكول

الأداةUDPTCPTLS (DoT)DoHDoQDoH3
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'

المؤلف

بابك فرخي

الترخيص

تم إصدار dnsdiag بموجب ترخيص BSD ذي البندين.

الفئات