پروژه Dnsdiag معرفی و استفاده

سریع یه توضیحی بدم، بخاطر اوضاع بسیار بد اینترنت در ایران، حتی دی ان اس ها هم با اختلال و مشکل پاسخ می‌دن، امروز یک پروژه خوب دیدم توی گیتهاب که تست دی ان اس رو خیلی خوب انجام می‌ده، کافیه یه فایل حاوی لیست دی ان اس بهش بدی (که در آخر لیستی که خودم جمع آوری کردم رو می‌ذارم) و شروع کنه با سرعت خوبی همه رو تست کردن و نتیجه رو یا در خروجی و یا در یک فایل (با فرمت جیسون) ذخیره می‌کنه. لینک سورس پروژه این هست: https://github.com/farrokhi/dnsdiag

برای استفاده نیازی به سورس نیست، کافیه با نصب و اجرای پکیج های پایتون آشنا باشید که خیلی هم راحته، مراحل زیر رو انجام بدین:

  1. نصب
  • ویندوز یا لینوکس:
pip3 install dnsdiag
  • نصب (ترموکس اندروید) در برنامه Termux اندروید خودم امتحان کردم، آخرش یکی از وابستگی‌ها “بیلد” نشد (بخاطر ناسازگاری معماری پردازنده)، ولی به هر حال با دستور زیر می‌تونید سعی کنید نصبش کنید شاید برای شما جواب بده:
pkg update && pkg upgrade -y && pkg install python python-pip jq -y && pip install dnsdiag
  1. به عنوان مثال، این دستور برای تست سلامت 8.8.8.8 هست:
dnsping -c 5 -s 8.8.8.8 moodle.org

خروجی:

$ dnsping -c 5 -s 8.8.8.8 moodle.org
dnsping DNS: 8.8.8.8:53, hostname: moodle.org, proto: UDP, class: IN, type: A, flags: [RD]
60  bytes from 8.8.8.8: seq=1   time=281.199 ms  NOERROR
60  bytes from 8.8.8.8: seq=2   time=1.068   ms  NOERROR
60  bytes from 8.8.8.8: seq=3   time=0.878   ms  NOERROR
60  bytes from 8.8.8.8: seq=4   time=1.088   ms  NOERROR
60  bytes from 8.8.8.8: seq=5   time=0.993   ms  NOERROR

--- 8.8.8.8 dnsping statistics ---
5 requests transmitted, 5 responses received, 0% lost
min=0.878 ms, avg=57.045 ms, max=281.199 ms, stddev=125.306 ms

بجای moodle.org بهتره یک دامنه که معروف نیست قرار بدین، مخصوصا دامنه یا زیردامنه شخصی.

به همین راحتی! توصیه می‌کنم در ویندوز، از WSL استفاده کنید. قابلیت های این نرم افزار برای تست انواع پروتکل‌های جدید دی ان اس ( مثلا DoH یا ‌‌DoT ) رو اینجا توضیح نمی‌دم چون هدفم از این پست، معرفی همه قابلیت‌های این نرم‌افزار نیست.

یه اسکریپت ساده هم دادم به هوش مصنوعی نوشت که در ورودی لیست سرورها و دامنه رو می‌گیره و خروجی ترو تمیز ایجاد می‌کنه، پیشنیازش هم ‌jq هست که باید نصب باشه:

#!/usr/bin/env bash
set -euo pipefail

DEFAULT_DOMAIN="google.com"
DEFAULT_DNS_FILE="dns-list.txt"
OUTPUT_FILE="dns_test_results.json"
QUERY_TYPE="${3:-A}"

DOMAIN="${1:-$DEFAULT_DOMAIN}"
DNS_FILE="${2:-$DEFAULT_DNS_FILE}"

if [[ ! -f "$DNS_FILE" ]]; then
    echo "Error: DNS list file not found → $DNS_FILE" >&2
    exit 1
fi

if ! command -v dnseval >/dev/null 2>&1; then
    echo "Error: dnseval not found." >&2
    echo "Install it with: pip3 install dnsdiag" >&2
    exit 1
fi

if ! command -v jq >/dev/null 2>&1; then
    echo "Error: jq not found." >&2
    echo "Install it (example for pop-os / ubuntu): sudo apt install jq" >&2
    exit 1
fi

echo "========================================"
echo "  DNS Benchmark"
echo "  Domain     : $DOMAIN"
echo "  DNS list   : $DNS_FILE"
echo "  Query type : $QUERY_TYPE"
echo "========================================"
echo ""

echo "1. Clearing previous results..."
> "$OUTPUT_FILE"
echo "Done"
echo ""

echo "2. Running dnseval (5 queries per server)..."
echo "   This may take a few minutes..."
dnseval -c 5 -j "$OUTPUT_FILE" -f "$DNS_FILE" -t "$QUERY_TYPE" "$DOMAIN" || {
    echo "Error: dnseval failed" >&2
    exit 1
}
echo ""
echo "Raw results saved to: $OUTPUT_FILE"
echo ""

echo "3. Top 5 fastest / most stable servers"
echo "   (loss ≤ 5%, NOERROR response only)"
echo "----------------------------------------"

jq -s '
  [ .[] | select(.data?
              and .data.r_lost_percent <= 5
              and .data.rcode_text == "NOERROR")
         | .data ]
  | sort_by(.r_lost_percent, .r_stddev, .r_avg)
  | .[:5][]
  | "→ \(.resolver)   avg: \(.r_avg | tostring | rtrimstr("000000")) ms"
    + "   jitter: \(.r_stddev | tostring | rtrimstr("000000")) ms"
    + "   loss: \(.r_lost_percent)%"
' "$OUTPUT_FILE" || {
    echo "No servers met the criteria (loss ≤ 5% + NOERROR)"
}

echo ""
echo "----------------------------------------"
echo "All results: cat $OUTPUT_FILE | jq ."
echo "========================================"

اسکریپت میاد به ورودی‌های اول و دوم نگاه می‌کنه، اولی دامنه، دومی فایل حاوی لیست DNS و سومی که مهم نیست، نوع تست هست که بهتره همون A باشه که اگه نذارید پیشفرض همین میشه.

مثال: فرض کنید یک فایل داریم به اسم dns_servers_ir.txt که حاوی دی ان اس سرورهای ایرانی هست، و می‌خواهیم دامنه moodle.org رو تست کنیم و بهترین دی ان اس ها رو پیدا کنیم:

$ ./dns_test.sh moodle.org ./dns_servers_ir.txt
========================================
  DNS Benchmark
  Domain     : moodle.org
  DNS list   : ./dns_servers_ir.txt
  Query type : A
========================================

1. Clearing previous results...
Done

2. Running dnseval (5 queries per server)...
   This may take a few minutes...

Raw results saved to: dns_test_results.log

3. Top 5 fastest / most stable servers
   (loss ≤ 5%, NOERROR response only)
----------------------------------------
"→ 185.83.197.154   avg: 0.9174346923828125 ms   jitter: 0.12873830595495456 ms   loss: 0%"
"→ 188.159.159.159   avg: 0.5694866180419922 ms   jitter: 0.1561234508456657 ms   loss: 0%"
"→ 2.185.239.138   avg: 0.5916118621826172 ms   jitter: 0.17927219162706717 ms   loss: 0%"
"→ 217.218.155.155   avg: 1.5683174133300781 ms   jitter: 0.19913903791294119 ms   loss: 0%"
"→ 185.161.112.33   avg: 1.2671947479248047 ms   jitter: 0.2432622045130131 ms   loss: 0%"

----------------------------------------
All results: cat dns_test_results.log | jq .
========================================

و اما در آخر لیست دی ان اس‌ها:

لیست دی ان اس های ایرانی (چیزی هست که من دارم! داخل فایل dns_servers_ir.txt توی مثالی که گفتم ذخیره کنید):

217.218.127.104
217.218.127.105
217.218.127.106
217.218.155.105
217.218.155.106
217.219.0.104
217.219.96.104
217.219.192.104
217.219.128.104
217.219.224.104
217.219.64.104
217.219.160.104
217.219.157.2
217.219.72.194
2.185.239.133
2.185.239.134
2.185.239.136
2.185.239.137
2.185.239.138
2.185.239.139
217.219.103.5
78.38.23.216
85.185.6.3
217.219.132.88
217.219.133.21
80.191.209.105
80.191.40.41
93.115.231.100
95.80.184.184
185.109.74.85
185.164.73.148
185.164.73.180
217.219.250.200
217.219.250.201
217.219.250.202
185.64.179.89
194.60.210.66
5.145.112.38
5.145.112.39
89.144.144.144
217.219.187.3
5.200.200.200
185.186.242.161
78.39.101.186
185.229.29.214
185.229.29.215
185.23.131.73
37.156.29.27
31.130.180.120
185.113.59.253
31.47.37.35
31.47.37.92
79.175.176.42
80.75.5.100
217.218.234.221
194.36.174.161
78.38.122.12
85.185.85.6
80.191.233.17
80.191.233.33
217.218.127.127
217.218.155.155
213.176.123.5
185.187.84.15
194.225.62.80
92.42.49.43
185.128.139.128
185.128.139.139
185.51.200.10
185.51.200.2
185.51.200.50
185.51.200.6
185.161.112.33
185.161.112.34
185.161.112.38
31.24.234.34
31.24.234.35
31.24.234.37
94.139.190.190
81.163.3.1
81.163.3.2
45.159.151.220
82.99.202.164
91.98.124.109
91.98.64.222
82.99.242.155
91.99.101.12
91.99.96.158
185.55.225.25
185.55.226.26
185.53.143.3
81.91.144.190
37.19.90.62
37.19.90.65
91.245.229.1
91.245.229.2
94.183.42.232
188.158.158.158
188.159.159.159
185.20.163.2
95.38.61.50
2.188.166.22
5.160.211.66
178.22.122.100
185.98.113.113
185.98.114.114
185.98.115.135
37.156.145.18
37.156.145.21
37.156.145.229
77.238.109.196
185.81.41.81
5.202.100.100
5.202.100.101
5.202.100.102
5.202.100.99
5.202.122.222
46.224.1.42
46.224.1.43
31.24.200.1
31.24.200.2
31.24.200.3
31.24.200.4
178.215.3.142
78.38.117.206
85.185.67.235
171.22.26.14
185.8.173.236
78.157.40.157
78.157.40.158
194.225.125.12
194.225.152.10
194.225.73.141
185.11.70.174
185.83.197.154
85.185.157.2
185.231.182.126
185.97.117.187
185.143.235.253
212.80.20.243
212.80.20.244
10.202.10.10
10.202.10.102
10.202.10.11
10.202.10.202
10.44.8.8
109.69.8.51
172.29.0.100
172.29.2.100
185.51.200.1
185.51.200.3
185.51.200.4
194.104.158.48
194.104.158.78
199.85.126.10
199.85.127.10
208.67.220.200
208.67.220.220
208.67.222.222
2.188.21.130
2.188.21.131
2.188.21.132
2.189.44.44
37.152.182.112
46.224.1.220
46.224.1.221
74.82.42.42
76.76.10.107
76.76.2.107
77.88.8.8
78.157.42.100
78.157.42.101
81.91.144.116
8.20.247.20
8.26.56.26
85.15.1.14
85.15.1.15
89.233.43.71
91.186.192.3
91.239.100.100
92.119.56.162

و لیست دی ان اس های جهانی (کامل نیست، چیزی هست که من دارم! داخل یه فایل دیگه مثلا dns_servers_global.txt ذخیره کنید)

1.1.1.1
1.0.0.1
8.8.8.8
8.8.4.4
208.67.222.220
208.67.220.222
209.244.0.3
209.244.0.4
4.2.2.1
4.2.2.2
4.2.2.3
4.2.2.4
4.2.2.5
4.2.2.6
216.146.35.35
216.146.36.36
198.153.192.1
198.153.194.1
156.154.70.22
156.154.71.22
64.6.64.6
64.6.65.6
205.171.3.65
205.171.2.65
204.117.214.10
84.200.69.80
84.200.70.40
37.235.1.174
37.235.1.177
199.2.252.10
204.97.212.10
204.69.234.1
204.74.101.1
212.23.8.1
212.23.3.1
195.92.195.94
195.92.195.95
80.80.80.80
80.80.81.81
80.67.169.12
80.67.169.40
156.154.70.1
156.154.71.1
156.154.70.5
156.154.71.5
77.88.8.1
195.46.39.39
195.46.39.40
94.140.14.14
94.140.15.15
9.9.9.9
149.112.112.112
9.9.9.10
149.112.112.10
95.111.55.251
95.111.55.250
2.56.220.2
95.85.95.85
103.247.36.36
103.247.37.37
176.10.118.132
176.10.118.133
94.187.170.2
94.187.170.3
195.235.194.7
195.235.194.8
45.81.37.0
45.81.37.1
91.92.250.178
91.92.251.5
76.223.113.79
76.223.86.98
13.248.236.200
13.248.221.253
75.2.69.210
3.33.246.91
85.203.37.1
85.203.37.2
103.86.99.100
103.86.96.100
162.252.172.57
149.154.159.92
194.242.2.2
194.242.2.3
194.242.2.4
194.242.2.5
194.242.2.6
194.242.2.9
208.67.222.123
208.67.220.123
199.85.126.30
199.85.127.30
77.88.8.7
77.88.8.3
1.1.1.3
1.0.0.3
185.228.168.168
185.228.169.168
185.228.168.10
185.228.169.11
156.154.70.3
156.154.71.3
156.154.70.4
156.154.71.4
94.140.14.15
94.140.15.16
199.85.126.20
199.85.127.20
77.88.8.88
77.88.8.2
1.1.1.2
1.0.0.2
185.228.168.9
185.228.169.9
156.154.70.2
156.154.71.2