今回やること
この記事では、WebサイトやAPIにつながらない時に、DNSが原因かどうかを切り分けます。
DNS調査では、ドメイン名がどのIPアドレスに解決されているか、どのDNSサーバーで見ても同じかを確認します。
前提条件
- ターミナルを開ける
nslookupを使える- macOS/Linuxでは
digも使える - 調査対象のドメイン名がある
例では example.com を使います。
Step 1: まず名前解決する
nslookup example.com
結果にIPアドレスが表示されるか確認します。
Name: example.com
Address: 93.184.216.34
IPアドレスが出ない場合、DNSサーバー、ドメイン名、ネットワーク設定のいずれかを疑います。
Step 2: Aレコードを確認する
macOS/Linuxでは dig でAレコードを確認します。
dig example.com A
IPv6を確認する場合はAAAAレコードを見ます。
dig example.com AAAA
WebサイトがIPv6対応している場合、AAAAレコードが返ることがあります。
Step 3: 別のDNSサーバーで確認する
ローカルのDNSだけがおかしい可能性を見るため、別のDNSサーバーに問い合わせます。
dig @1.1.1.1 example.com A
dig @8.8.8.8 example.com A
結果が大きく違う場合、DNSの反映途中、キャッシュ、権威DNS設定の問題などを考えます。
Step 4: CNAMEを確認する
サブドメインではCNAMEが使われることがあります。
dig www.example.com CNAME
CNAMEは別のドメイン名への別名です。最終的にAレコードやAAAAレコードへ解決される必要があります。
Step 5: HTTP側と比較する
DNSが成功していても、Webサーバーが応答するとは限りません。
curl -I https://example.com
DNSが成功し、HTTPステータスも返るなら、少なくとも名前解決とHTTP応答はできています。
Step 6: DNSキャッシュを疑う
DNSの変更直後は、TTLやキャッシュの影響で古い結果が残ることがあります。
確認すること:
- DNSレコードを変更してからどれくらい経ったか
- TTLが長く設定されていないか
- 自分の端末だけ古い結果になっていないか
- 別回線や別DNSサーバーではどう見えるか
キャッシュ削除コマンドはOSごとに異なるため、実行前に公式ドキュメントで確認します。
よくあるエラー
| エラー | よくある原因 | 確認すること |
|---|---|---|
NXDOMAIN | ドメインが存在しない、またはレコードがない | ドメイン名、DNSゾーン |
SERVFAIL | DNSサーバー側の処理失敗 | 権威DNS、DNSSEC、設定 |
| 古いIPが返る | キャッシュやTTL | 別DNSサーバー、時間経過 |
curlは失敗する | DNS以外の問題 | HTTP、TLS、サーバー |
学習用と本番用の違い
学習では example.com や自分のテスト用ドメインで確認します。本番環境では、DNS変更が利用者全体に影響するため、TTL、変更時間、戻し手順、監視を事前に決めます。
DNSは変更してもすぐ全員に同じ結果が届くとは限りません。
まとめ
DNSが原因か確認する時は、nslookup で名前解決、dig でレコード、別DNSサーバーで差分、curl でHTTP応答を確認します。DNSの成功とWebサイトの正常動作は別なので、必ずHTTP側も見ます。
参考リソース
- RFC 1035: Domain Names - Implementation and Specification
- Cloudflare: DNS records
- Google Public DNS: Using DNS tools