
DNSの計測、トラブルシューティング、およびセキュリティ監査ツールセット
ISP が DNS トラフィックを傍受 していないか疑問に思ったことはありませんか? DNS 応答に異常な挙動を感じたり、間違ったアドレスにリダイレクトされたりして、DNS に問題があるのではと疑ったことはありませんか? このツールセットは、DNS リクエストと応答の基本的な監査を実行し、DNS が期待通りに機能していることを確認するのに役立ちます。
dnsping を使用すると、任意のクエリに対する任意の DNS サーバーの応答時間を測定できます。通常の ping ユーティリティと同様に、dnsping は DNS リクエストに対して同等の機能を提供し、サーバーの応答性を監視するのに役立ちます。
また、dnstraceroute を使用して DNS リクエストの宛先への経路をトレースし、リダイレクトや傍受が行われていないことを確認できます。同じサーバーに送信された DNS クエリを比較することで、dnstraceroute は経路の違いを観察し、潜在的な問題を警告します。
dnseval は複数の DNS リゾルバーを評価し、ネットワークに最適な DNS リゾルバーを選択するのに役立ちます。サードパーティの DNS リゾルバーに依存しないように、独自の DNS リゾルバーを使用することを推奨しますが、dnseval は必要な場合に最適な DNS リゾルバーを選択するのに役立ちます。パフォーマンス (レイテンシ) と信頼性 (パケットロス) に基づいて DNS サーバーを比較し、情報に基づいた意思決定のための包括的なビューを提供します。
このツールセットを使用する方法はいくつかありますが、最適な柔軟性と制御のために、ソースコードから直接実行することを推奨します。
git clone https://github.com/farrokhi/dnsdiag.git
cd dnsdiag
pip3 install -r requirements.txt
pip3 install dnsdiag
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、Mac OS X、Linux 向けのバイナリパッケージがリリースされます。最新のリリースは リリースページ から入手できます。
プリビルドバイナリは以下で利用可能です:
Windows ARM64 は現在サポートされていません。これは、ビルド依存関係がネイティブコンパイルツールチェーンを必要とするためです。Windows on ARM を使用している場合は、Windows Subsystem for Linux (WSL2) を使用するか、ソースから直接インストールすることで dnsdiag を実行できます。
ローカルマシンに dnsdiag をインストールしたくない場合は、Docker イメージを使用してコンテナ環境でツールを実行できます。例:
docker run --network host -it --rm farrokhi/dnsdiag dnsping.py
dnsping を使用すると、任意の DNS クエリを複数回送信して DNS リゾルバーに "ping" を実行できます。サポートされているコマンドラインオプションの完全なリストは --help で確認してください。主要なフラグをいくつか示します:
--tcp、--tls、--doh、--quic、--http3 を使用してトランスポートプロトコルを選択します (デフォルトは UDP)。これらのオプションは相互に排他的です。コマンドごとに1つのプロトコルのみ指定できます。--flags を使用して、各応答の応答フラグ (EDNS フラグを含む) を表示します。--dnssec を使用して、利用可能な場合に DNSSEC 検証を要求します。--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 の興味深い使用例をいくつか紹介します:
--dnssec フラグを使用して DNSSEC を有効にした場合の応答時間の測定。./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
./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
./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 と --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 検証が失敗した場合に追加の診断情報を提供します。例:
これらの指標により、dnsping はパフォーマンステストだけでなく、リゾルバーが DNSSEC を正しく強制しているかどうかの検証や、DNSSEC 展開の問題の診断にも役立ちます。
dnstraceroute は、DNS リクエストの宛先への経路をトレースするユーティリティです。実際のネットワークトレースルートと比較して、DNS トラフィックが不要な経路を経由していないことを確認できます。