概要
先日.ioドメインで障害が起きました。.ioのトップレベルDNSサーバがサブドメインの権威サーバ一覧を返さなくなったので名前解決ができなくなったためです。
今回はDNSの流れと確認方法をまとめました。
DNSの流れ
- www.example.comにアクセスしたい
- クライアントPCに指定されているDNSサーバ(キャッシュサーバ)に問い合わせる
- キャッシュサーバはルートサーバへwww.example.comのIPアドレスについて問い合わせる
- ルートサーバは.comのトップレベルDNSサーバへ問い合わせるよう回答する
- キャッシュサーバは.comのトップレベルDNSサーバへ問い合わせる
- .comのDNSサーバはexample.comの権威DNSサーバへ問い合わせるよう回答する
- キャッシュサーバはexample.comの権威DNSサーバへ問い合わせる
- example.comはwww.example.comのIPをキャッシュサーバへ回答する
- キャッシュサーバはクライアントPCにIPを回答する
ref: dnsfly Appliance by UX WORLD, INC.
今回の問題
dig
コマンドで確認していくことができます。
ステップ4の.ioのトップレベルDNSサーバが以下のように7つあるのですが、
$ dig io. NS ; <<>> DiG 9.8.3-P1 <<>> io. NS ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 53545 ;; flags: qr rd ra; QUERY: 1, ANSWER: 7, AUTHORITY: 0, ADDITIONAL: 7 ;; QUESTION SECTION: ;io. IN NS ;; ANSWER SECTION: io. 7012 IN NS ns-y1.io. io. 7012 IN NS ns-d1.io. io. 7012 IN NS ns-a4.io. io. 7012 IN NS ns-l1.io. io. 7012 IN NS ns-a1.io. io. 7012 IN NS ns-a3.io. io. 7012 IN NS ns-a2.io.
この内の1つns-a4.io
がステップ6であるサブドメインの権威サーバを回答しなくなったのが原因です。
$ dig www.example.io @ns-a4.io. +norec ; <<>> DiG 9.8.3-P1 <<>> www.example.io @ns-a4.io. ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 59749 ;; flags: qr aa rd; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 0 ;; QUESTION SECTION: ;www.example.io. IN A ;; AUTHORITY SECTION: io. 3600 IN SOA ns1.communitydns.net. nicadmin.nic.io. 1477631318 3600 1800 3600000 3600
このようにNSレコードが返ってきません。
通常の場合
以下のようにNSレコードを返して次の問い合わせ先を返してくれます。
$ dig www.example.io @ns-a1.io. +norec ; <<>> DiG 9.8.3-P1 <<>> www.example.io @ns-a1.io. +norec ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 56631 ;; flags: qr; QUERY: 1, ANSWER: 0, AUTHORITY: 2, ADDITIONAL: 0 ;; QUESTION SECTION: ;www.example.io. IN A ;; AUTHORITY SECTION: example.io. 86400 IN NS dns1.registrar-servers.com. example.io. 86400 IN NS dns2.registrar-servers.com.
タイムアウト
以下のようなTimeoutが返る場合は他のトップレベルDNSサーバを使おうとするので、最終的にはちゃんと名前解決されます。
$ dig www.example.io @ns-y1.io. +norec ; <<>> DiG 9.8.3-P1 <<>> www.example.io @ns-y1.io. ;; global options: +cmd ;; connection timed out; no servers could be reached
キャッシュサーバ
ちなみに今回の障害はキャッシュサーバの方で過去に問い合わせの結果をローカルに保存(キャッシュ)していればトップレベルDNSサーバへアクセスすることもないので問題なくアクセスすることが可能です。
そのため「ある環境では繋がるけど、他の環境では繋がらない」といったことが起きるので障害の発覚が遅れることもあります。
今回の結末
おかしな回答を返すns-a4.io
を落とすことにより、↑のようなTimeoutが返るようになり他の正しいトップレベルDNSサーバが回答するようになりました。
IOドメインのサポートからDNS問題の返事が来ました。現在、ns-a4.io, ns-a2.ioを落としていて、他のサーバにより正しく応答しているとのこと。 pic.twitter.com/lz7d4NOhkw
— Tsuneo Yoshioka (@yoshiokatsuneo) 2016年10月28日