「名前解決ができない」夜に慌てないために:DNSの「直打ち」で真実を切り分ける技術
ネットワーク運用という仕事をしていると、深夜2時に叩き起こされる原因の8割は「名前解決の失敗」か「証明書の期限切れ」だ。特にDNS絡みのトラブルは厄介だ。クライアント端末のキャッシュなのか、社内のフォワーダーが死んでいるのか、あるいは上位の権威DNSが腐っているのか。
そんな時、僕たちNOCのエンジニアがまず最初に行う儀式がある。それが dig コマンドを使った「DNSサーバーの明示的指定(@server構文)」だ。教科書には載っていない、現場で培った「真実を炙り出す」ためのDNSデバッグ術を、今日は君たちに伝授しよう。
—
なぜ「@server」が必要なのか?
通常、PCやサーバーが名前解決を行う際、OSの設定(/etc/resolv.conf や Windowsのネットワーク設定)に基づいたデフォルトのDNSリゾルバーに問い合わせを行う。しかし、ここで障害が発生した時、デフォルトの設定に従っているだけでは「どこが悪いのか」を切り分けることができない。
そこで活躍するのが @server オプションだ。これを使うと、システム設定を無視して、特定のDNSサーバーに直接「お前、このドメイン知ってるか?」と殴り込みをかけられる。
実践:digでのデバッグ
まず、基本中の基本を見てみよう。
# Google Public DNS (8.8.8.8) に向けて example.com のAレコードを問い合わせる
dig @8.8.8.8 example.com +noall +answer
このコマンドのポイントは +noall +answer だ。余計なヘッダーや統計情報に埋もれず、純粋な回答(Answer Section)だけを抽出する。障害対応時にノイズを削ぎ落とすのは、シニアの嗜みだ。
もし、ここでの問い合わせが成功し、OSの設定による問い合わせ(dig example.com)が失敗するなら、犯人は「ローカルのリゾルバー」か「ネットワーク経路」に確定する。切り分け完了まで、わずか数秒だ。
—
通信の裏側:何が起きているのか?
このコマンドを打った瞬間、パケットは以下のようなシーケンスで飛んでいる。
1. Client -> 8.8.8.8:53 (UDP) : 「example.com のIPを教えろ」
2. 8.8.8.8 -> Client : 「93.184.216.34 だ」
もしこれが失敗する場合、以下の可能性を疑う。
- 53番ポートのブロック: ファイアウォールやセキュリティグループがUDP 53を遮断していないか?
- MTUサイズ問題: DNSパケットが大きく(特にDNSSEC使用時)、経路上のどこかでドロップされていないか?(
+bufsize=1232を指定して再試行するのが定石だ)
—
開発現場で役立つ「直打ち」の実践例
運用保守だけでなく、API設計やバックエンド開発でもこの知識は生きる。例えば、マイクロサービス環境で特定のドメインが解決できない時、アプリのコードから直接DNSを指定して疎通確認を行うことがある。
Python での DNS テスト(dnspythonライブラリ使用)
コード上で「特定のDNSサーバーを使って名前解決する」ロジックを実装しておくと、サービス監視の精度が劇的に上がる。
import dns.resolver
def check_dns_resolution(domain, dns_server):
# 特定のDNSサーバーを明示的に指定してインスタンス化
resolver = dns.resolver.Resolver()
resolver.nameservers = [dns_server]
try:
answers = resolver.resolve(domain, 'A')
for rdata in answers:
print(f"解決成功: {domain} -> {rdata.address}")
except Exception as e:
print(f"解決失敗: {e}")
# 社内リゾルバーの死活監視として使う
check_dns_resolution("api.internal.service", "10.0.0.53")
curl でのデバッグ(–dns-servers)
APIの疎通確認で「特定のリゾルバーを通した時だけHTTP 500が返る」といった怪奇現象に遭遇したことはないか? curl にもリゾルバー指定機能がある。
# 特定のDNSを指定してAPIを叩く
curl --dns-servers 8.8.8.8 https://api.example.com/v1/health
—
最後に:現場で生き残るための心構え
DNSのトラブルシューティングにおいて、最も恐ろしいのは「キャッシュの罠」だ。nslookup や dig で成功したからといって、アプリケーション側も成功しているとは限らない。ブラウザやOS、言語ランタイムが持つそれぞれのDNSキャッシュが、君たちの目を曇らせる。
トラブルに遭遇したら、まずは「名前解決の起点(リゾルバー)」を特定する。次に「キャッシュを疑う」。そして最後に「経路上のACL」を疑う。この順序を忘れない限り、君たちはどんな複雑なネットワーク障害も、必ず最短ルートで解決できるはずだ。
DNSはインターネットの背骨だ。その挙動を深く理解し、意のままに操れるようになること。それが、単なるオペレーターと、真のエンジニアを分かつ境界線になる。現場からは以上だ。また次の戦場で会おう。
コメント