読者です 読者をやめる 読者になる 読者になる

Carpe Diem

備忘録。https://github.com/jun06t

.ioドメインに障害が起きたのでDNSの仕組みを勉強

ネットワーク

概要

先日.ioドメインで障害が起きました。.ioのトップレベDNSサーバがサブドメインの権威サーバ一覧を返さなくなったので名前解決ができなくなったためです。
今回はDNSの流れと確認方法をまとめました。

DNSの流れ

  1. www.example.comにアクセスしたい
  2. クライアントPCに指定されているDNSサーバ(キャッシュサーバ)に問い合わせる
  3. キャッシュサーバはルートサーバへwww.example.comIPアドレスについて問い合わせる
  4. ルートサーバは.comのトップレベDNSサーバへ問い合わせるよう回答する
  5. キャッシュサーバは.comのトップレベDNSサーバへ問い合わせる
  6. .comDNSサーバはexample.comの権威DNSサーバへ問い合わせるよう回答する
  7. キャッシュサーバはexample.comの権威DNSサーバへ問い合わせる
  8. example.comはwww.example.comのIPをキャッシュサーバへ回答する
  9. キャッシュサーバはクライアントPCにIPを回答する

f:id:quoll00:20161101001924p:plain

ref: Diagram: How the Domain Name System (DNS) works / UX WORLD

今回の問題

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サーバが回答するようになりました。

ソース