DNSのタイムアウトとは、ドメイン名の名前解決に対して、クライアントやリゾルバが定めた時間内に有効な応答を受け取れない状態を指します。
たとえば、ブラウザやアプリ、OSが example.com のIPアドレスを取得しようとしてDNS問い合わせを送っても、返答が返ってこない、途中で失われる、あるいは応答が遅すぎる場合にタイムアウトが発生します。
DNSの問題というと「DNSサーバーが落ちている」と考えられがちですが、実際には原因はもっと広く、ネットワーク経路、ファイアウォール、権威DNSの設定、DNSSEC、端末設定、アプリケーションの実装なども関係します。
Webサイトへアクセスするとき、最初にDNSによる名前解決が行われます。大まかな流れは次の通りです。
DNSタイムアウトは、この過程のどこかで必要な応答が期限内に得られないときに起こります。
ユーザー側では、次のような症状として見えることがあります。
ただし、表示されるエラー文言はOSやブラウザ、アプリによって異なり、必ずしも「DNSタイムアウトそのもの」を直接示しているとは限りません。
もっとも基本的な原因は、問い合わせ先のDNSサーバーが正常に応答できていないことです。
たとえば次のような状況です。
この場合、同じDNSサーバーを利用している複数端末で同時に症状が出やすくなります。
DNSの応答自体ではなく、通信経路の品質悪化が原因でタイムアウトすることもよくあります。
DNSは伝統的にUDPを多く利用してきましたが、TCPも標準的に利用されます。
いずれにしても、ネットワーク上で遅延やパケットロスが発生すると、問い合わせや応答が正常に届かずタイムアウトの原因になります。
代表的な要因は次の通りです。
DNS障害のように見えても、実際には経路上の問題であるケースは少なくありません。
DNSでは通常、UDP/53 と TCP/53 が利用されます。
そのため、これらの通信が遮断されると名前解決が不安定になったり失敗したりします。
よくある原因は以下です。
なお、最近はブラウザやOS、アプリが DoH(DNS over HTTPS) や DoT(DNS over TLS) を利用することもあります。
この場合、従来の53番ポートだけでなく、HTTPSやTLS経由のDNS通信が影響している可能性もあります。
利用者側のリゾルバが正常でも、問い合わせ先のドメインを管理する権威DNS側に不備があると、最終的に名前解決は失敗または遅延します。
代表例は次の通りです。
特定のドメインだけタイムアウトする場合、この領域に原因があることが多いです。
DNSSECを利用している場合、署名や鍵の整合性が崩れると、リゾルバが応答を信用できず、名前解決に失敗します。
たとえば次のようなケースです。
この場合、ユーザーからは単なる「接続できない」「DNSが引けない」と見えることがあり、通常のDNS障害と区別しづらい場合があります。
近年のDNS応答は、DNSSEC、TXTレコード、大量の追加情報などにより大きくなることがあります。
このとき問題になりやすいのが次の点です。
小さい問い合わせは成功するのに、特定のドメインや特定レコードだけ失敗する場合には、このパターンが疑われます。
企業ネットワークでは、端末が直接インターネット上の権威DNSへ問い合わせるのではなく、社内のキャッシュDNSやDNSフォワーダを経由する構成が多くあります。
この中継点に問題があると、DNSタイムアウトの原因になります。
たとえば以下です。
実務では、端末ではなく社内DNS基盤側がボトルネックになっていることがよくあります。
DNSタイムアウトは、クライアント側の設定不備でも発生します。
代表例は次の通りです。
resolv.conf やローカルリゾルバ設定が不正なお、複数のDNSサーバーを設定していても、どの順序で、どのタイミングで切り替えるかはOSやリゾルバ実装に依存します。
そのため、「予備DNSがあるから必ず即座に切り替わる」とは限りません。
最近はIPv4/IPv6のデュアルスタック環境が一般的になっているため、IPv6側だけ壊れているケースにも注意が必要です。
よくある例は次の通りです。
この場合、あるネットワーク環境では正常でも、別の環境ではDNSが遅い、という現象が起こります。
問い合わせ数が多すぎる場合、リゾルバや権威DNSが制限をかけて応答しなくなることがあります。
たとえば以下のようなケースです。
大量アクセス時だけ不安定になる場合には、この可能性があります。
DNSサーバーが完全に停止していなくても、アプリケーション側の待ち時間設定が短すぎることで失敗することがあります。
具体例としては次のとおりです。
つまり、実際にはDNS応答が返っていても、アプリ側が先に諦めて失敗扱いにしている場合があります。
DNSトラブルでは、どこで失敗しているかを段階的に切り分けることが重要です。
まず、端末がどのDNSサーバーを利用しているかを確認します。
現在利用しているDNSとは別のリゾルバへ同じ問い合わせを行い、結果や応答時間を比較します。
これで差が出る場合、利用中のリゾルバ側に問題がある可能性が高くなります。
権威DNSサーバーに直接問い合わせることで、リゾルバの問題か、ドメイン側の問題かを切り分けやすくなります。
UDPでは失敗し、TCPでは成功するなら、途中経路、ファイアウォール、応答サイズ、断片化などの問題が疑われます。
IPv4系かIPv6系かを切り分けるために、AレコードとAAAAレコードの両方を確認します。
このような差が出る場合、利用者側ネットワークやISP、VPN経路の問題を疑いやすくなります。
nslookup example.com
nslookup example.com 8.8.8.8
dig example.com
dig @8.8.8.8 example.com
dig +tcp example.com
dig AAAA example.com
dig NS example.com
dig @ns1.example-dns.com example.com
ping 8.8.8.8
traceroute 8.8.8.8
ただし、ping や traceroute は補助的な確認手段です。
ICMPの可否だけではDNSアプリケーション層の正常性は判断できないため、主な確認には dig や nslookup を使うべきです。
実務上は、次のような原因が特に多く見られます。
特に企業環境では、DNSサーバーそのものより、中間のネットワーク機器や構成要因が原因になっていることが多くあります。
DNSタイムアウトの原因は、大きく分けると次の5系統に整理できます。
DNSトラブルは「DNSサーバーの問題」とは限りません。
実際には、ネットワーク、セキュリティ機器、権威DNS、端末設定、アプリケーション挙動まで含めて確認する必要があります。
そのため、切り分けでは次の順で見ると効率的です。
以上、DNSのタイムアウトの原因についてでした。
最後までお読みいただき、ありがとうございました。