結論
www.blacksheep.link IN A 13.231.154.170
のようなレコードを権威サーバに設定したとする。
1: まず、権威サーバに正しく設定できているか確認する。
$ dig +norec @<name_server> www.blacksheep.link ; <<>> DiG 9.10.6 <<>> +norec @ns-644.awsdns-16.net. www.blacksheep.link ; (2 servers found) ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 47564 ;; flags: qr aa; QUERY: 1, ANSWER: 1, AUTHORITY: 4, ADDITIONAL: 1 # ① ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 4096 ;; QUESTION SECTION: ;www.blacksheep.link. IN A ;; ANSWER SECTION: www.blacksheep.link. 30 IN A 13.231.154.170 # ② ...(omitted)
①でflagsにaa(Authoritative Answer)があることを確認。これがあれば権威サーバからの回答である。 ②のAnswer Sectionで正しく設定できているか確認する。
2: フルリゾルバからの応答を確認する。
$ dig www.blacksheep.link ; <<>> DiG 9.10.6 <<>> www.blacksheep.link ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 13333 ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 512 ;; QUESTION SECTION: ;www.blacksheep.link. IN A ;; ANSWER SECTION: www.blacksheep.link. 29 IN A 13.231.154.170 ...(omitted)
解説
DNSにはスタブリゾルバ(DNSクライアント)、フルリゾルバ(問合せ代行兼キャッシュサーバ)、権威サーバ(レコードを登録するサーバ)の3つの構成要素が登場する。 スタブリゾルバが問い合わせを行う際は、通常フルリゾルバに対して名前解決要求(再起的問い合わせ)を送信し、それを受けたフルリゾルバが権威サーバに問い合わせを行う(非再帰的問い合わせ又は反復問い合わせ)。
[スタブリゾルバ]--->[フルリゾルバ] --->[権威サーバ(複数存在し階層構造になっている)]
フルリゾルバは権威サーバから受けた結果を一定期間キャッシュするため、次にスタブリゾルバから問い合わせを受けた際にそのキャッシュを返すことができる。このキャッシュはクエリに対する結果が紐づいている物だけでなく、クエリに対応する結果が見つからなかった場合もキャッシュを行う(ネガティブキャッシュ)。
そのため、DNSレコードを追加した際はまずスタブリゾルバから権威サーバに問い合わせを行い、設定が正しく行われているかを確認する。その後で、フルリゾルバを使った確認を行う。最初からフルリゾルバを経由した問い合わせを行ってしまうと、もしなんらかの理由で権威サーバに設定が正しく行われていない場合、ネガティブキャッシュがフルリゾルバに残ってしまう。ネガティブキャッシュが残っている以上、正しく権威サーバを設定し直した後も一定期間は空の結果が返ってきてしまう*1。
コマンド
スタブリゾルバから直接権威サーバに問い合わせるには次のようにする。digはデフォルトでフルリソルバへの問い合わせを想定した再帰的問い合わせを行うため+norec
を指定することで無効にしている。
$ dig +norec @<name_server> <target_domain>
ネガティブキャッシュについて
ネガティブキャッシュに対するTTLはmin(SOAレコードのMINIMUMフィールドの値, SOAレコード自身のTTL)
で決定される。AWS route53の場合、SOAレコードのMINIMUMフィールドの値が86400, SOAレコード自身のTTLが900だったので、ネガティブキャッシュは900秒間有効になる。