
DNSの計測、トラブルシューティング、およびセキュリティ監査ツールセット
あなたの ISP が DNS トラフィックを傍受しているのではないかと考えたことはありませんか? 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 以降が必要です。
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 向けのバイナリパッケージがリリースされます。最新リリースは releases ページから入手できます。
ビルド済みバイナリは以下で利用可能です:
Windows ARM64 は現在サポートされていません。これは、ビルド依存関係が容易には入手できないネイティブコンパイルツールチェーンを必要とするためです。ARM 上の Windows を使用している場合は、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 を使って、利用可能な場合は Name Server Identifier (NSID) を表示します(RFC 5001)。--ecs を使って、地理的ルーティング最適化のための EDNS Client Subnet 情報を含めます。--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 検証が有効で成功していることを示す強いシグナルです。
典型的なパターン:
| 結果 | 意味 |
|---|---|
AD フラグ付きの NOERROR | DNSSEC 検証が成功 |
DO フラグ付きの SERVFAIL | DNSSEC 検証が失敗(多くの場合、壊れた署名や設定ミスが原因) |
AD フラグが存在しない | リゾルバが DNSSEC 検証を実行していない |
Extended DNS Errors (EDE, RFC 8914) は、DNSSEC 検証が失敗したときに追加の診断情報を提供します。例えば:
これらの指標により、dnsping はパフォーマンステストだけでなく、リゾルバが DNSSEC を正しく適用しているかどうかの検証や、DNSSEC 展開の問題の診断にも役立ちます。
dnstraceroute は、DNS リクエストの宛先までの経路を追跡するユーティリティです。実際のネットワーク traceroute と比較して、DNS トラフィックが望ましくない経路を通っていないことを確認したい場合に役立ちます。