DNS Intro
名前解決に至るまで
前提
www.yokohei.com. の名前解決を想定します
以下の例は DNSSEC および QNAME minimisation が 無効 のときの話です
QNAME minimisation の詳細はいつか書きます…
QNAME minimisation に限らず「フルサービスリゾルバ」や「権威 DNS サーバ」の実装によって異なります
本題

1. nsswitch.conf
多くの場合、クライアント (アプリケーションなど) は /etc/nsswitch.conf をまず見て名前解決の際の優先順位を決めている。
…
hosts: files dns
…上記のようなものであれば、 hosts ファイルを見たあと resolv.conf を見る。 具体的には /etc/hosts を見たあと /etc/resolv.conf を見る。 なので、一般的には hosts ファイルの内容が優先的に利用される。
※ この辺の話は、次ページの DNS と OS できちんと触れる予定。
2. Client から Resolver へ
この時、 Recursive なクエリ要求であるため、 RD (Recursion Desired) ビットが立ちます。 Answer セクションや Authority セクションには何も入りません。
3. Resolver から root の Name Server へ
www.yokohei.com. を Question としたクエリを root の Name Server に聞きます。 この時 Recursive である必要はないため RD は立ちません。
4. root からの応答
root は www.yokohei.com. を知らないので、それらを知っている com. の NS の情報を Authority セクションに入れて返します。 a~m.gtld-servers.net. が Authority セクションに入ります。 答えは知らないので Answer セクションに値は入りません。 RCODE=0 で NOERROR, NOANSWER です。 この時の応答は権威がないので AA ビットは立ちません。
5. Resolver から com. の Name Server へ
www.yokohei.com. を Question としたクエリを com. の Name Server に聞きます。(3. と同様) この時 Recursive である必要はないため RD は立ちません。
6. com. からの応答
com は www.yokohei.com. を知らないので、それらを知っている yokohei.com. の NS の情報を Authority セクションに入れて返します。 ns-xxx.awsdns-yyy.com. (.net/.org/.co.uk) が Authority セクションに入ります。 答えは知らないので Answer セクションに値は入りません。 RCODE=0 で NOERROR, NOANSWER です。 この時の応答は権威がないので AA ビットは立ちません。
7. Resolver から yokohei.com. の Name Server へ
www.yokohei.com. を Question としたクエリを yokohei.com. の Name Server に聞きます。(3. および 5. と同様) この時 Recursive である必要はないため RD は立ちません。
8. yokohei.com. からの応答
yokohei.com. ゾーンは www.yokohei.com. を知っているのでその情報を返します。 Answer セクションに値が入り、また権威ある応答のため AA が立ちます。 情報を知っている権威サーバについても Authority セクションに入れて返されます。
9. Resolver から Client への応答
Recursive クエリが終了したので情報をクライアントに返します。 Answer セクションに値を入れて返します。 Authority セクションに値は入りません。 RD および RA が立ちます。
補足
NS が Authority Secition に入っているとき、 Additional Section に NS の IP アドレスが入れて返される場合が多いです
NS の名前解決も行う必要がある(場合もある)点に注意してください (上記では省略してます)
DNSSEC が有効になっていれば AD ビットや CD ビットの話が出てきます
QNAME minimisation が有効になっていれば Question が変わったり AA の挙動が変わったりします
ミスがあればお気軽にご指摘下さい
よく使う RCODE
IANA のページ に載っているが、主要なものだけでもまとめておく。
NoError RCODE=0 聞いた名前に対して 1 つ以上の答えがあるとき。 タイプは問わない。
FormErr RCODE=1 プロトコルフォーマットがおかしいとき。 EDNS0 では、複数 OPT が含まれていたりするとこれを返す。
ServFail RCODE=2 どこかが timeout になったり、 DNSSEC の検証が失敗した場合のエラー。
NXDomain RCODE=3 聞いた名前を持ってない時のエラー。
Refused RCODE=5 何らかのポリシーにより拒否された旨のエラー。 allow ルールで IP が絞られていたり、関係ないゾーンに関係ない名前を聞いたりしたときに発生する。
BADVERS RCODE=16 EDNS において実装されてないバージョンでのリクエストが来たときにこれを返す。
Last updated