
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 मापन, समस्या निवारण और सुरक्षा ऑडिटिंग टूलसेट
===============================================================
क्या आपने कभी सोचा है कि आपका ISP आपके [DNS ट्रैफ़िक को इंटरसेप्ट कर रहा है](https://medium.com/decentralize-today/is-your-isp-hijacking-your-dns-traffic-f3eb7ccb0ee7)? क्या आपने अपने DNS प्रतिक्रियाओं में कोई असामान्य व्यवहार देखा है, या गलत पते पर रीडायरेक्ट किया गया है और संदेह है कि आपके DNS में कुछ गड़बड़ हो सकती है? हम आपके DNS अनुरोधों और प्रतिक्रियाओं पर बुनियादी ऑडिट करने के लिए उपकरणों का एक सूट प्रदान करते हैं, जिससे आप यह सुनिश्चित कर सकें कि आपका DNS अपेक्षित रूप से कार्य कर रहा है।
`dnsping` के साथ, आप किसी भी DNS सर्वर की मनमानी क्वेरी के लिए प्रतिक्रिया समय माप सकते हैं। नियमित ping उपयोगिता के समान, dnsping DNS अनुरोधों के लिए तुलनीय कार्यक्षमता प्रदान करता है, जिससे आप सर्वर की प्रतिक्रियाशीलता की निगरानी कर सकते हैं।
आप `dnstraceroute` का उपयोग करके अपने DNS अनुरोध के मार्ग को उसके गंतव्य तक ट्रेस भी कर सकते हैं, यह सत्यापित करते हुए कि इसे रीडायरेक्ट या इंटरसेप्ट नहीं किया जा रहा है। एक ही सर्वर पर भेजे गए 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
# बिना इंस्टॉलेशन के सीधे 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 को स्थायी रूप से इंस्टॉल करने के लिए:
```bash
# dnsdiag टूल इंस्टॉल करें
uv tool install dnsdiag
# नवीनतम संस्करण में अपग्रेड करें
uv tool upgrade dnsdiag
```
## बाइनरी पैकेज
समय-समय पर, Windows, Mac OS X और Linux के लिए बाइनरी पैकेज जारी किए जाएंगे। आप [releases पेज](https://github.com/farrokhi/dnsdiag/releases) से नवीनतम रिलीज़ प्राप्त कर सकते हैं।
### समर्थित प्लेटफ़ॉर्म
पूर्व-निर्मित बाइनरी उपलब्ध हैं:
- Linux (x86_64, ARM64)
- macOS (Intel, Apple Silicon)
- Windows (x86_64)
Windows ARM64 वर्तमान में समर्थित नहीं है क्योंकि बिल्ड निर्भरताओं के लिए नेटिव कंपाइलेशन टूलचेन की आवश्यकता होती है जो आसानी से उपलब्ध नहीं हैं। यदि आप ARM पर Windows का उपयोग कर रहे हैं, तो आप Windows Subsystem for Linux (WSL2) का उपयोग करके dnsdiag चला सकते हैं या सीधे स्रोत से इंस्टॉल कर सकते हैं।
## Docker
यदि आप अपनी स्थानीय मशीन पर `dnsdiag` इंस्टॉल नहीं करना चाहते हैं, तो आप कंटेनरीकृत वातावरण में टूल चलाने के लिए Docker इमेज का उपयोग कर सकते हैं। उदाहरण के लिए:
```
docker run --network host -it --rm farrokhi/dnsdiag dnsping.py
```
# dnsping
`dnsping` आपको एक मनमानी DNS क्वेरी को कई बार भेजकर DNS रिज़ॉल्वर को "पिंग" करने की अनुमति देता है। समर्थित कमांड-लाइन विकल्पों की पूरी सूची के लिए, `--help` का उपयोग करें। यहाँ कुछ प्रमुख फ्लैग दिए गए हैं:
- ट्रांसपोर्ट प्रोटोकॉल चुनने के लिए `--tcp`, `--tls`, `--doh`, `--quic` या `--http3` का उपयोग करें (डिफ़ॉल्ट UDP है)। ये विकल्प परस्पर अनन्य हैं; प्रति कमांड केवल एक प्रोटोकॉल निर्दिष्ट किया जा सकता है।
- प्रत्येक प्रतिक्रिया के लिए प्रतिक्रिया फ्लैग, जिसमें EDNS फ्लैग शामिल हैं, प्रदर्शित करने के लिए `--flags` का उपयोग करें।
- यदि उपलब्ध हो, तो DNSSEC सत्यापन का अनुरोध करने के लिए `--dnssec` का उपयोग करें।
- विस्तारित DNS त्रुटि संदेश ([RFC 8914](https://www.rfc-editor.org/rfc/rfc8914)) मौजूद होने पर स्वचालित रूप से प्रदर्शित होते हैं।
- यदि उपलब्ध हो, तो Name Server Identifier (NSID) प्रदर्शित करने के लिए `--nsid` का उपयोग करें ([RFC 5001](https://www.rfc-editor.org/rfc/rfc5001))।
- भौगोलिक रूटिंग अनुकूलन के लिए EDNS Client Subnet जानकारी शामिल करने के लिए `--ecs` का उपयोग करें।
- प्रतिक्रियाओं में मौजूद होने पर DNS कुकीज़ ([RFC 7873](https://www.rfc-editor.org/rfc/rfc7873)) प्रदर्शित करने के लिए `--cookie` का उपयोग करें।
```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
```
- NSID विकल्प का उपयोग करके DNS सर्वर की पहचान करना:
```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 कुकीज़ का परीक्षण:
```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 सत्यापन नहीं कर रहा है |
विस्तारित DNS त्रुटियाँ (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
# AdGuard DNS के साथ DNS over QUIC का परीक्षण करें
./dnstraceroute.py --quic -s 94.140.14.14 -c 3 google.com
# Google DNS के साथ DNS over HTTP/3 का परीक्षण करें
./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)
```
`dnstraceroute` के साथ `--expert` फ्लैग का उपयोग करने से विशेषज्ञ संकेतों का प्रदर्शन सक्षम होगा, जिसमें संभावित DNS ट्रैफ़िक हाइजैकिंग की चेतावनियाँ शामिल हैं।
# dnseval
`dnseval` एक बल्क पिंग उपयोगिता है जो 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
```
आउटपुट को `jq` जैसे मानक JSON टूल के साथ पंक्ति दर पंक्ति पार्स किया जा सकता है।
```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 को 2 क्लॉज़ BSD लाइसेंस के तहत जारी किया गया है।