.io ドメインがおかしくなったので dig で調べてみた（2016/10/28）

# 更新履歴
思ったより参照量が多くてビビる。
情報源として使用されてるケースも見かけたため、更新履歴入れました。（多分今日だけでしょう）

* 2016-10-29 11:50
    * ns-a4.io が正しく次の権威サーバーを返してくれるの確認しました。障害復旧でいいんじゃないでしょうか。Android で dig 叩くツールあった。
* 03:08
    * http://dnsviz.net/d/io/WBOUpA/responses/  
    直った？
* 2016-10-28 19:21 JST
    * @rocca0504 さんの記事追記。
* 19:10 JST
    * NXDOMAIN ステータスを勝手に返すのが問題の本質だったので追記。
* 18:10 JST
    * dig の +norecurse (+norec) について追記しました。(@fumiyas さんご指摘ありがとうございます。)   
      見た目悪くなりますが、必要な箇所には記載があるべきと考え、都度追加しています。  
      ログの意味合いが無いところは +norec 追加したものに変更しました。
    * ns-a4.io. が繋がらなくなったことについて追記しました。これで落ち着いてくれるといいんですが。



# 結論

※ 2016-10-29 11:46 JST に確認したところ、ns-a4.io は正常なレスポンスを返しました。いつ直ったかは不明ですが、まずは一安心です。

.io の 7 台の権威サーバーの内訳がこんな状態。
恐らくのトラブルの原因は ns-a4.io が **サブドメインの権威サーバーを答えないこと** です。（詳細は調べ方の異常な場合を参照）

※ トラブル発生中に何度もクエリを打つのははばかられるので、試行回数は少なめです。
※ 調査時刻は 2016-10-28 14:00 (JST) です。不安定な状況につき、あくまで参考情報までに留めて下さい。

* 今のところ正常
  * ns-a3.io.
  * ns-d1.io.
  * ns-l1.io.

* Timeout
  * ns-a1.io.
  * ns-a2.io.
  * ns-y1.io.

* **サブドメインを指定した際に次の権威 NS 返してくれない** （NS 0 record）
  * ns-a4.io. ※ 2016-17:51 JST 現在 Timeout するようになりました。


なお、@rocca0504 さんも同じ問題を別の視点も含め調査されてました。
こちらの方が読みやすいしわかりやすいと思います。
[[gusuku] 「.io」ドメイン - DNSによる名前解決が不安定になった話（現在進行形） - Qiita](http://qiita.com/rocca0504/items/725d083460a8ea54f5f9)


# 調べ方
泥臭い方法で調べたので、何かもっとスマートな方法をご存知な方はコメント下さい。

## dig で NS のリスト取得する

```shell-session
# 注意: 権威サーバーへの問い合わせなので、正しくは
#
# dig io. NS @l.root-servers.net. +norec
#
# とするべきでした。（トップレベルドメインについての問い合わせなので影響薄いですが、お作法として）
# ログの意味もあるので下記は元のままにしています。

$ dig io. NS @l.root-servers.net.

; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.47.rc1.el6_8.1 <<>> io. NS @l.root-servers.net.
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 37187
;; flags: qr rd; QUERY: 1, ANSWER: 0, AUTHORITY: 7, ADDITIONAL: 12
;; WARNING: recursion requested but not available

;; QUESTION SECTION:
;io.                            IN      NS

;; AUTHORITY SECTION:
io.                     172800  IN      NS      ns-a1.io.
io.                     172800  IN      NS      ns-a2.io.
io.                     172800  IN      NS      ns-a3.io.
io.                     172800  IN      NS      ns-a4.io.
io.                     172800  IN      NS      ns-d1.io.
io.                     172800  IN      NS      ns-l1.io.
io.                     172800  IN      NS      ns-y1.io.

;; ADDITIONAL SECTION:
ns-a1.io.               172800  IN      A       194.0.1.1
ns-a1.io.               172800  IN      AAAA    2001:678:4::1
ns-a2.io.               172800  IN      A       194.0.2.1
ns-a2.io.               172800  IN      AAAA    2001:678:5::1
ns-a3.io.               172800  IN      A       74.116.178.1
ns-a4.io.               172800  IN      A       74.116.179.1
ns-d1.io.               172800  IN      A       64.251.31.179
ns-d1.io.               172800  IN      AAAA    2607:feb8::5:5
ns-l1.io.               172800  IN      A       80.249.100.57
ns-l1.io.               172800  IN      AAAA    2001:470:1f1d:244::57
ns-y1.io.               172800  IN      A       91.208.95.130
ns-y1.io.               172800  IN      AAAA    2001:470:1f07:d0b::130

;; Query time: 113 msec
;; SERVER: 199.7.83.42#53(199.7.83.42)
;; WHEN: Fri Oct 28 13:29:11 2016
;; MSG SIZE  rcvd: 412
```

## dig で各 NS サーバーを確認する
### 正常な場合
正しく次の NS を返してくれます。

```shell-session
# 注意: 権威サーバーへの問い合わせなので、正しくは
#
# dig a.example.io @ns-a3.io. +norec
#
# とするべきでした。
# ログの意味もあるので下記は元のままにしています。

$ dig a.example.io @ns-a3.io.

; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.47.rc1.el6_8.1 <<>> a.example.io @ns-a3.io.
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 6836
;; flags: qr rd; QUERY: 1, ANSWER: 0, AUTHORITY: 2, ADDITIONAL: 0
;; WARNING: recursion requested but not available

;; QUESTION SECTION:
;a.example.io.                  IN      A

;; AUTHORITY SECTION:
example.io.             86400   IN      NS      dns1.registrar-servers.com.
example.io.             86400   IN      NS      dns2.registrar-servers.com.

;; Query time: 5 msec
;; SERVER: 74.116.178.1#53(74.116.178.1)
;; WHEN: Fri Oct 28 14:11:35 2016
;; MSG SIZE  rcvd: 89
```

### 異常（サブドメインだけ次の NS を返さない）な場合
※ 2016-10-28 17:51 JST 現在、異常だった ns-a4.io が Timeout するようになりました。

次の NS などない！ …とばかりに NS レコードが 0 件となりました。
※ 正しくは、「子の権威サーバーがいるのに勝手に NXDOMAIN (Non-Existent Domain) を返している」ことを注視すべきでした。

```shell-session
# 注意: 権威サーバーへの問い合わせなので、正しくは
#
# dig a.example.io @ns-a4.io. +norec
#
# とするべきでした。
# ログの意味もあるので下記は元のままにしています。

$ dig a.example.io @ns-a4.io.

; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.47.rc1.el6_8.1 <<>> a.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
;; WARNING: recursion requested but not available

;; QUESTION SECTION:
;a.example.io.                  IN      A

;; AUTHORITY SECTION:
io.                     3600    IN      SOA     ns1.communitydns.net. nicadmin.nic.io. 1477631318 3600 1800 3600000 3600

;; Query time: 3 msec
;; SERVER: 74.116.179.1#53(74.116.179.1)
;; WHEN: Fri Oct 28 14:10:44 2016
;; MSG SIZE  rcvd: 103
```

厄介なのが、サブドメインだけ返さないというおかしな状況です。
上記では a.example.io の問い合わせに対し NS レコードを返してくれませんが、**セカンドレベルの example.io だと NS レコードを返します**。

```shell-session
# 注意: 権威サーバーへの問い合わせなので、正しくは
#
# dig example.io @ns-a4.io. +norec
#
# とするべきでした。
# ログの意味もあるので下記は元のままにしています。

$ dig example.io @ns-a4.io.

; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.47.rc1.el6_8.1 <<>> example.io @ns-a4.io.
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 26321
;; flags: qr rd; QUERY: 1, ANSWER: 0, AUTHORITY: 2, ADDITIONAL: 0
;; WARNING: recursion requested but not available

;; QUESTION SECTION:
;example.io.                    IN      A

;; AUTHORITY SECTION:
example.io.             86400   IN      NS      dns1.registrar-servers.com.
example.io.             86400   IN      NS      dns2.registrar-servers.com.

;; Query time: 3 msec
;; SERVER: 74.116.179.1#53(74.116.179.1)
;; WHEN: Fri Oct 28 14:14:24 2016
;; MSG SIZE  rcvd: 87
```

正常な場合のトレースでは最後に example.io の権威サーバーが返答してくれますが、

```shell-session
$ dig a.example.io @8.8.8.8 +trace

; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.47.rc1.el6_8.1 <<>> a.example.io @8.8.8.8 +trace
;; global options: +cmd
.                       18446   IN      NS      l.root-servers.net.
.                       18446   IN      NS      g.root-servers.net.
.                       18446   IN      NS      i.root-servers.net.
.                       18446   IN      NS      a.root-servers.net.
.                       18446   IN      NS      k.root-servers.net.
.                       18446   IN      NS      c.root-servers.net.
.                       18446   IN      NS      f.root-servers.net.
.                       18446   IN      NS      m.root-servers.net.
.                       18446   IN      NS      d.root-servers.net.
.                       18446   IN      NS      j.root-servers.net.
.                       18446   IN      NS      b.root-servers.net.
.                       18446   IN      NS      e.root-servers.net.
.                       18446   IN      NS      h.root-servers.net.
;; Received 228 bytes from 8.8.8.8#53(8.8.8.8) in 74 ms

io.                     172800  IN      NS      ns-a1.io.
io.                     172800  IN      NS      ns-a2.io.
io.                     172800  IN      NS      ns-a3.io.
io.                     172800  IN      NS      ns-a4.io.
io.                     172800  IN      NS      ns-d1.io.
io.                     172800  IN      NS      ns-l1.io.
io.                     172800  IN      NS      ns-y1.io.
;; Received 422 bytes from 192.203.230.10#53(192.203.230.10) in 149 ms

example.io.             86400   IN      NS      dns1.registrar-servers.com.
example.io.             86400   IN      NS      dns2.registrar-servers.com.
;; Received 89 bytes from 64.251.31.179#53(64.251.31.179) in 184 ms

example.io.             3601    IN      SOA     dns1.registrar-servers.com. hostmaster.registrar-servers.com. 2016102001 43200 3600 604800 3601
;; Received 103 bytes from 216.87.152.33#53(216.87.152.33) in 120 ms
```

異常な場合は ns-a4.io で途切れてしまっているようです。

```shell-session
$ dig a.example.io @8.8.8.8 +trace

; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.47.rc1.el6_8.1 <<>> a.example.io @8.8.8.8 +trace
;; global options: +cmd
.                       18349   IN      NS      f.root-servers.net.
.                       18349   IN      NS      e.root-servers.net.
.                       18349   IN      NS      m.root-servers.net.
.                       18349   IN      NS      b.root-servers.net.
.                       18349   IN      NS      c.root-servers.net.
.                       18349   IN      NS      g.root-servers.net.
.                       18349   IN      NS      h.root-servers.net.
.                       18349   IN      NS      k.root-servers.net.
.                       18349   IN      NS      j.root-servers.net.
.                       18349   IN      NS      a.root-servers.net.
.                       18349   IN      NS      d.root-servers.net.
.                       18349   IN      NS      i.root-servers.net.
.                       18349   IN      NS      l.root-servers.net.
;; Received 228 bytes from 8.8.8.8#53(8.8.8.8) in 72 ms

io.                     172800  IN      NS      ns-a2.io.
io.                     172800  IN      NS      ns-l1.io.
io.                     172800  IN      NS      ns-a1.io.
io.                     172800  IN      NS      ns-y1.io.
io.                     172800  IN      NS      ns-d1.io.
io.                     172800  IN      NS      ns-a4.io.
io.                     172800  IN      NS      ns-a3.io.
;; Received 422 bytes from 192.36.148.17#53(192.36.148.17) in 42 ms

io.                     3600    IN      SOA     ns1.communitydns.net. nicadmin.nic.io. 1477632089 3600 1800 3600000 3600
;; Received 103 bytes from 74.116.179.1#53(74.116.179.1) in 4 ms
```


### おまけ: Timeout
間違った答えを返すより、使われなくなる Timeout の方が百倍増しですね。

```shell-session
$ dig a.example.io @ns-a1.io. +norec

; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.47.rc1.el6_8.1 <<>> a.example.io @ns-a1.io.
;; global options: +cmd
;; connection timed out; no servers could be reached
```