
مجموعة أدوات قياس DNS واستكشاف الأخطاء وإصلاحها وتدقيق الأمان
[](https://pypi.python.org/pypi/dnsdiag/) []() [](https://pepy.tech/project/dnsdiag) [](https://pepy.tech/project/dnsdiag) []() [](https://hub.docker.com/r/farrokhi/dnsdiag) [](https://github.com/farrokhi/dnsdiag/stargazers)
مجموعة أدوات قياس DNS واستكشاف الأخطاء وإصلاحها وتدقيق الأمان
===============================================================
هل تساءلت يومًا إن كان مزود خدمة الإنترنت لديك [يعترض حركة DNS الخاصة بك](https://medium.com/decentralize-today/is-your-isp-hijacking-your-dns-traffic-f3eb7ccb0ee7)؟
هل لاحظت أي سلوك غير معتاد في استجابات DNS الخاصة بك، أو تم إعادة توجيهك إلى
عنوان خاطئ وشككت في وجود خلل في DNS لديك؟ نحن نقدم مجموعة من الأدوات لإجراء
تدقيقات أساسية على طلبات واستجابات DNS الخاصة بك، مما يساعدك على ضمان عمل DNS
كما هو متوقع.
باستخدام `dnsping`، يمكنك قياس زمن استجابة أي خادم DNS لاستعلامات عشوائية.
على غرار أداة ping العادية، تقدم dnsping وظائف مماثلة لطلبات DNS، مما يساعدك
على مراقبة استجابة الخادم.
يمكنك أيضًا تتبع مسار طلب DNS الخاص بك إلى وجهته باستخدام
`dnstraceroute`، والتحقق من عدم إعادة توجيهه أو اعتراضه. من خلال مقارنة
استعلامات DNS المرسلة إلى نفس الخادم، يتيح لك `dnstraceroute` ملاحظة أي
اختلافات في المسارات المتبعة، وتنبيهك إلى المشكلات المحتملة.
يقيّم `dnseval` عدة محللات DNS لمساعدتك في اختيار أفضل محلل DNS
لشبكتك. بينما يُوصى باستخدام محلل DNS الخاص بك لتجنب الاعتماد على محللات DNS
التابعة لجهات خارجية، يمكن أن يساعدك `dnseval` في اختيار محلل DNS الأمثل عند
الحاجة. يتيح لك مقارنة خوادم DNS بناءً على الأداء (زمن الاستجابة) والموثوقية
(فقدان الحزم)، مما يمنحك رؤية شاملة لاتخاذ قرارات مستنيرة.
# التثبيت
هناك عدة طرق لاستخدام هذه المجموعة من الأدوات، رغم أننا نوصي بتشغيلها
مباشرة من الكود المصدري للحصول على أقصى قدر من المرونة والتحكم. يتطلب التشغيل
من المصدر أو التثبيت عبر pip إصدار Python 3.11 أو أحدث.
## الكود المصدري
1. استنسخ مستودع git وثبّت التبعيات:
```
git clone https://github.com/farrokhi/dnsdiag.git
cd dnsdiag
pip3 install -r requirements.txt
```
2. يمكنك بدلاً من ذلك تثبيت الحزمة باستخدام pip:
```
pip3 install dnsdiag
```
## استخدام uv (موصى به)
[uv](https://docs.astral.sh/uv/) هو مدير حزم Python سريع يمكنه تشغيل الأدوات مباشرة دون تثبيت:
```bash
# Run dnsping directly without installation
uvx --from dnsdiag dnsping google.com
# Run with specific options
uvx --from dnsdiag dnsping -c 5 --tls -s 8.8.8.8 example.com
# Run dnstraceroute
uvx --from dnsdiag dnstraceroute cloudflare.com
# Run dnseval
uvx --from dnsdiag dnseval -f public-servers.txt github.com
```
لتثبيت dnsdiag بشكل دائم:
```bash
# Install dnsdiag tools
uv tool install dnsdiag
# Upgrade to the latest version
uv tool upgrade dnsdiag
```
## حزمة ثنائية
من وقت لآخر، سيتم إصدار حزم ثنائية لأنظمة Windows وMac OS X وLinux. يمكنك الحصول على أحدث إصدار من [صفحة الإصدارات](https://github.com/farrokhi/dnsdiag/releases).
### المنصات المدعومة
تتوفر حزم ثنائية جاهزة لما يلي:
- 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، إن كان متاحًا.
- يتم عرض رسائل Extended DNS Error ([RFC 8914](https://www.rfc-editor.org/rfc/rfc8914)) تلقائيًا عند وجودها.
- استخدم `--nsid` لعرض Name Server Identifier (NSID) إن كان متاحًا ([RFC 5001](https://www.rfc-editor.org/rfc/rfc5001)).
- استخدم `--ecs` لتضمين معلومات EDNS Client Subnet لتحسين التوجيه الجغرافي.
- استخدم `--cookie` لعرض DNS cookies ([RFC 7873](https://www.rfc-editor.org/rfc/rfc7873)) عند وجودها في الاستجابات.
```shell
./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 Client Subnet للاستجابات الواعية بالموقع الجغرافي:
```shell
./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:
```shell
./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 cookies لتعزيز الأمان وتحسين ذاكرة التخزين المؤقت:
```shell
./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 |
توفر Extended DNS Errors (EDE, RFC 8914) معلومات تشخيصية إضافية عندما
يفشل التحقق من DNSSEC. على سبيل المثال:
- **EDE:10** – *DNSSEC Bogus* (بيانات DNSSEC غير صالحة أو معطوبة)
- **EDE:6** – *DNSSEC Signature Expired*
- **EDE:7** – *DNSSEC Signature Not Yet Valid*
تجعل هذه المؤشرات `dnsping` مفيدًا ليس فقط لاختبار الأداء، ولكن أيضًا
للتحقق من أن المحللات تفرض DNSSEC بشكل صحيح ولتشخيص
مشكلات نشر DNSSEC.
# dnstraceroute
`dnstraceroute` هي أداة تتبع مسار طلبات DNS الخاصة بك إلى
وجهتها. قد ترغب في مقارنة ذلك مع traceroute الشبكة الفعلي لديك للتأكد من
عدم توجيه حركة DNS الخاصة بك عبر أي مسارات غير مرغوب فيها.
يدعم `dnstraceroute` بروتوكولات نقل متعددة (متنافية):
- UDP (الافتراضي) - استعلامات DNS التقليدية
- TCP (`--tcp`) - DNS over TCP
- DoQ (`--quic`) - DNS over QUIC (مدعوم من AdGuard DNS)
- DoH3 (`--http3`) - DNS over HTTP/3 (مدعوم من Google DNS وCloudflare)
```shell
./dnstraceroute.py --expert --asn -C -t A -s 8.8.4.4 facebook.com
```
يمكنك أيضًا اختبار بروتوكولات DNS الحديثة:
```shell
# Test DNS over QUIC with AdGuard DNS
./dnstraceroute.py --quic -s 94.140.14.14 -c 3 google.com
# Test DNS over HTTP/3 with 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 over TLS)، وDoH (DNS over
HTTPS)، وDoQ (DNS over QUIC)، وDoH3 (DNS over HTTP/3) باستخدام علامات `--tcp`
و`--tls` و`--doh` و`--quic` و`--http3` على التوالي. خيارات البروتوكول هذه متنافية؛ يمكن تحديد واحد فقط لكل أمر.
## ملخص دعم البروتوكولات
| الأداة | UDP | TCP | TLS (DoT) | DoH | DoQ | DoH3 |
|------|-----|-----|-----------|-----|-----|------|
| `dnsping` | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| `dnstraceroute` | ✓ | ✓ | - | - | ✓ | ✓ |
| `dnseval` | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
*DoQ: DNS over QUIC, DoH3: DNS over HTTP/3*
```shell
./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 واحد.
```shell
./dnseval.py -c 5 -j results.jsonl -f public-servers.txt example.com
```
يمكن تحليل الإخراج سطرًا بسطر باستخدام أدوات JSON القياسية مثل `jq`.
```shell
cat results.jsonl | jq -r 'select(.data.r_lost_percent == 0) | .data.resolver'
```
### المؤلف
Babak Farrokhi
- github: [github.com/farrokhi](https://github.com/farrokhi/)
- website: [farrokhi.net](https://farrokhi.net/)
- mastodon: [@[email protected]](https://unix.family/@farrokhi)
- twitter: [@farrokhi](https://twitter.com/farrokhi)
### الترخيص
يتم إصدار dnsdiag بموجب ترخيص BSD المكوّن من بندين.