はじめに
こんにちは。 株式会社iimonでバックエンドエンジニアをしている木暮です。
前回の記事はドメイン名についてまとめさせていただきました。 今回はDNSの名前解決の基本的な動作についてまとめてさせていただきます。
名前解決時に登場する概念
まずは名前解決の際に出てくる概念について説明します。
権威サーバー
DNSサーバーとも呼ばれています。
権威サーバーは名前解決するための情報を持っています。
持っている情報のことをゾーン情報、ゾーン情報の中身をリソースレコードと言います。
こちらについては後述します。
権威サーバーは自身が管理している情報をフルリゾルバーへ返却します。
この際に、権威サーバーが目的のドメインのIPを知っていればそれを返却し
知らない場合はそのドメインを知っている権威サーバーの情報を返却します。
スタブリゾルバー
DNSクライアントとも呼ばれています。
クライアント側の名前解決の窓口となる要素です。
ブラウザやアプリなどから呼び出されフルリゾルバーへ「名前解決要求」を出します。
そしてフルリゾルバーから取得したIPアドレスをブラウザやアプリケーションへ応答します。
フルリゾルバー
キャッシュDNSサーバーとも呼ばれています。
フルリゾルバーの役割は二つあります。
・名前解決の実行
各権威サーバーへ問い合わせて「名前解決」を実行します。
権威サーバーへの問い合わせはIPアドレスが取得できるまでルート→TLD→2LD→...と行われます。
・名前解決時の情報をキャッシュする
「名前解決」の際に取得した情報のキャッシュを行います。
フルリゾルバーに該当の権威サーバーのキャッシュがある場合はその権威サーバーへの問い合わせは行わずキャッシュを使用します。
キャッシュが存在する場合は2LDから「名前解決」を行うことや
同じドメインへの2回目の「名前解決」はキャッシュをスタブリゾルバーへ返却して権威サーバーへの問い合わせを行わないといった感じでキャッシュは使用されます。
また、名前解決ができなかった場合もキャッシュされこれは「ネガティブキャッシュ」と呼ばれます。
実行順について
次に簡単な図を元に概念的に名前解決がどのような順序で行われるか解説を行います。
- スタブリゾルバーからフルリゾルバーへ「私の代わりにexample.jpを名前解決してIPアドレスを教えてください」とリクエスト
- フルリゾルバーからルートへ「example.jpのIPアドレスを教えてください」とリクエスト
- ルートからフルリゾルバーへ「jpの情報はこのTLDが知っています」とレスポンス
- フルリゾルバーからルートに教えてもらったTLDへ「example.jpのIPアドレスを教えてください」とリクエスト
- TLDからフルリゾルバーへ「example.jpの情報はこの2LDが知っています」とレスポンス
- フルリゾルバーからTLDに教えてもらった2LDへ「example.jpのIPアドレスを教えてください」とリクエスト
- 2LDからフルリゾルバーへ「example.jpのIPアドレスはxxx.xxx.xxx.xxxです」とレスポンス
- フルリゾルバーからスタブリゾルバーへ「example.jpのIPアドレスはxxx.xxx.xxx.xxxです」とレスポンス
という流れで名前解決が行われます。
スタブリゾルバーとフルリゾルバー間の問い合わせのことを「再帰的問い合わせ」
フルリゾルバーと権威サーバー間の問い合わせのことを「非再帰的問い合わせ」と呼びます。
リソースレコード
リソースレコードの中でよく使われるものは以下のとおりです。
タイプ | 設定されている内容 |
---|---|
A | 問い合わせを行ったドメインのIPv4アドレス |
AAAA(クアッドエー) | 問い合わせを行ったドメインのIPv6アドレス |
NS | 問い合わせを行ったドメインのゾーンの権威サーバーのホスト名 |
MX | 問い合わせを行ったドメインのメールの配送先と優先度 |
リソースレコードは以下の内容で構成されます
項目 | 設定されてい内容 |
---|---|
ドメイン名 | 問い合わせを行ったドメイン |
TTL | リソースレコードをキャッシュする時間(秒) |
クラス | リソースレコードのクラス 基本的にはインターネットを示すINが設定される |
タイプ | 前述のリソースタイプが指定される |
データ | リソースタイプに応じてデータが設定される |
リソースレコードの詳細はこちらを確認ください。 jprs.jp
フルリゾルバーとして問い合わせてみる
ここまでで簡単ですが名前解決について解説を行いました。
では実際にコンソールからフルリゾルバーとして名前解決を実施してみます。
ドメイン名からIPアドレスを調べることを「正引き」
逆にIPアドレスからドメイン名を調べることを「逆引き」といい今回は正引きをしてみます。
以下のコマンドを使用して問い合わせをしてみます。
dig +norec <名前解決をしたいドメイン名>
まずはルートへのIPを確認したいと思います
$ dig +norec . ; <<>> DiG 9.10.6 <<>> +norec . ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 56879 ;; flags: qr ra; QUERY: 1, ANSWER: 0, AUTHORITY: 13, ADDITIONAL: 27 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 512 ;; QUESTION SECTION: ;. IN A ;; AUTHORITY SECTION: . 479287 IN NS i.root-servers.net. . 479287 IN NS c.root-servers.net. . 479287 IN NS f.root-servers.net. . 479287 IN NS l.root-servers.net. . 479287 IN NS b.root-servers.net. . 479287 IN NS d.root-servers.net. . 479287 IN NS e.root-servers.net. . 479287 IN NS h.root-servers.net. . 479287 IN NS j.root-servers.net. . 479287 IN NS a.root-servers.net. . 479287 IN NS m.root-servers.net. . 479287 IN NS g.root-servers.net. . 479287 IN NS k.root-servers.net. ;; ADDITIONAL SECTION: i.root-servers.net. 479287 IN A 192.36.148.17 i.root-servers.net. 479287 IN AAAA 2001:7fe::53 c.root-servers.net. 479287 IN A 192.33.4.12 c.root-servers.net. 479287 IN AAAA 2001:500:2::c f.root-servers.net. 479287 IN A 192.5.5.241 f.root-servers.net. 479287 IN AAAA 2001:500:2f::f l.root-servers.net. 479287 IN A 199.7.83.42 l.root-servers.net. 479287 IN AAAA 2001:500:9f::42 b.root-servers.net. 479287 IN A 170.247.170.2 b.root-servers.net. 479287 IN AAAA 2801:1b8:10::b d.root-servers.net. 479287 IN A 199.7.91.13 d.root-servers.net. 479287 IN AAAA 2001:500:2d::d e.root-servers.net. 479287 IN A 192.203.230.10 e.root-servers.net. 479287 IN AAAA 2001:500:a8::e h.root-servers.net. 479287 IN A 198.97.190.53 h.root-servers.net. 479287 IN AAAA 2001:500:1::53 j.root-servers.net. 479287 IN A 192.58.128.30 j.root-servers.net. 479287 IN AAAA 2001:503:c27::2:30 a.root-servers.net. 479287 IN A 198.41.0.4 a.root-servers.net. 479287 IN AAAA 2001:503:ba3e::2:30 m.root-servers.net. 479287 IN A 202.12.27.33 m.root-servers.net. 479287 IN AAAA 2001:dc3::35 g.root-servers.net. 479287 IN A 192.112.36.4 g.root-servers.net. 479287 IN AAAA 2001:500:12::d0d k.root-servers.net. 479287 IN A 193.0.14.129 k.root-servers.net. 479287 IN AAAA 2001:7fd::1 ;; Query time: 22 msec ;; SERVER: 2404:1a8:7f01:b::3#53(2404:1a8:7f01:b::3) ;; WHEN: Sat Jun 29 00:08:55 JST 2024 ;; MSG SIZE rcvd: 811
ついでdigコマンドの応答の見方をここで解説します。
応答で一番最初に確認するべきはstatusです。
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 56879
今回のstatusは「NOERROR」となっているので通常応答であることがわかります。
存在しないドメインを名前解決した場合の応答は「NXDOMAIN」となります
次に確認するのはflagsになります。
;; flags: qr ra; QUERY: 1, ANSWER: 0, AUTHORITY: 13, ADDITIONAL: 27
flagsは応答の意味合いをフィールドで表現しています。
今回のフィールドは「qr」「ra」が設定されています。
「qr」が表示されている場合は応答であることを意味します。
「ra」は再帰検索が可能であることを意味しています。
各フィールドの詳しい説明については以下のリンクを確認してください。
;; QUESTION SECTION: ;. IN A
ここには問い合わせの内容が表示されます。
;; AUTHORITY SECTION: . 479287 IN NS i.root-servers.net. . 479287 IN NS c.root-servers.net. (省略)
ここには権威サーバーの情報が表示されます。
;; ADDITIONAL SECTION: i.root-servers.net. 479287 IN A 192.36.148.17 i.root-servers.net. 479287 IN AAAA 2001:7fe::53 c.root-servers.net. 479287 IN A 192.33.4.12 c.root-servers.net. 479287 IN AAAA 2001:500:2::c (省略) ...
ここには追加情報が表示されます。 前述のリソースレコードは以下のような形式で応答で確認できます。
<ドメイン名> <TTL> <クラス> <タイプ> <データ>
ではルートが分かったので次にルートへ名前解決をしてみます。
dig +norec @<名前解決を行う権威サーバーのIP> <名前解決をしたいドメイン名>
ルートのIPを指定してgoogle.comの名前解決を実行
$ dig +norec @199.7.83.42 google.com ; <<>> DiG 9.10.6 <<>> +norec @199.7.83.42 google.com ; (1 server found) ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 20676 ;; flags: qr; QUERY: 1, ANSWER: 0, AUTHORITY: 13, ADDITIONAL: 27 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 4096 ;; QUESTION SECTION: ;google.com. IN A ;; AUTHORITY SECTION: com. 172800 IN NS a.gtld-servers.net. com. 172800 IN NS b.gtld-servers.net. com. 172800 IN NS c.gtld-servers.net. com. 172800 IN NS d.gtld-servers.net. com. 172800 IN NS e.gtld-servers.net. com. 172800 IN NS f.gtld-servers.net. com. 172800 IN NS g.gtld-servers.net. com. 172800 IN NS h.gtld-servers.net. com. 172800 IN NS i.gtld-servers.net. com. 172800 IN NS j.gtld-servers.net. com. 172800 IN NS k.gtld-servers.net. com. 172800 IN NS l.gtld-servers.net. com. 172800 IN NS m.gtld-servers.net. ;; ADDITIONAL SECTION: a.gtld-servers.net. 172800 IN A 192.5.6.30 b.gtld-servers.net. 172800 IN A 192.33.14.30 c.gtld-servers.net. 172800 IN A 192.26.92.30 d.gtld-servers.net. 172800 IN A 192.31.80.30 e.gtld-servers.net. 172800 IN A 192.12.94.30 f.gtld-servers.net. 172800 IN A 192.35.51.30 g.gtld-servers.net. 172800 IN A 192.42.93.30 h.gtld-servers.net. 172800 IN A 192.54.112.30 i.gtld-servers.net. 172800 IN A 192.43.172.30 j.gtld-servers.net. 172800 IN A 192.48.79.30 k.gtld-servers.net. 172800 IN A 192.52.178.30 l.gtld-servers.net. 172800 IN A 192.41.162.30 m.gtld-servers.net. 172800 IN A 192.55.83.30 a.gtld-servers.net. 172800 IN AAAA 2001:503:a83e::2:30 b.gtld-servers.net. 172800 IN AAAA 2001:503:231d::2:30 c.gtld-servers.net. 172800 IN AAAA 2001:503:83eb::30 d.gtld-servers.net. 172800 IN AAAA 2001:500:856e::30 e.gtld-servers.net. 172800 IN AAAA 2001:502:1ca1::30 f.gtld-servers.net. 172800 IN AAAA 2001:503:d414::30 g.gtld-servers.net. 172800 IN AAAA 2001:503:eea3::30 h.gtld-servers.net. 172800 IN AAAA 2001:502:8cc::30 i.gtld-servers.net. 172800 IN AAAA 2001:503:39c1::30 j.gtld-servers.net. 172800 IN AAAA 2001:502:7094::30 k.gtld-servers.net. 172800 IN AAAA 2001:503:d2d::30 l.gtld-servers.net. 172800 IN AAAA 2001:500:d937::30 m.gtld-servers.net. 172800 IN AAAA 2001:501:b1f9::30 ;; Query time: 84 msec ;; SERVER: 199.7.83.42#53(199.7.83.42) ;; WHEN: Sat Jun 29 00:57:54 JST 2024 ;; MSG SIZE rcvd: 835
comの権威サーバーの一覧が取得できました。 続けてcomの権威サーバーに向けてgoogle.comの名前解決を実行します。
$ dig +norec @192.5.6.30 google.com ; <<>> DiG 9.10.6 <<>> +norec @192.5.6.30 google.com ; (1 server found) ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 43571 ;; flags: qr; QUERY: 1, ANSWER: 0, AUTHORITY: 4, ADDITIONAL: 9 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 4096 ;; QUESTION SECTION: ;google.com. IN A ;; AUTHORITY SECTION: google.com. 172800 IN NS ns2.google.com. google.com. 172800 IN NS ns1.google.com. google.com. 172800 IN NS ns3.google.com. google.com. 172800 IN NS ns4.google.com. ;; ADDITIONAL SECTION: ns2.google.com. 172800 IN AAAA 2001:4860:4802:34::a ns2.google.com. 172800 IN A 216.239.34.10 ns1.google.com. 172800 IN AAAA 2001:4860:4802:32::a ns1.google.com. 172800 IN A 216.239.32.10 ns3.google.com. 172800 IN AAAA 2001:4860:4802:36::a ns3.google.com. 172800 IN A 216.239.36.10 ns4.google.com. 172800 IN AAAA 2001:4860:4802:38::a ns4.google.com. 172800 IN A 216.239.38.10 ;; Query time: 12 msec ;; SERVER: 192.5.6.30#53(192.5.6.30) ;; WHEN: Sat Jun 29 01:05:27 JST 2024 ;; MSG SIZE rcvd: 287
googleの権威サーバーがわかりました。 googleの権威サーバーに向けてgoogle.comの名前解決を実行します。
$ dig +norec @216.239.34.10 google.com ; <<>> DiG 9.10.6 <<>> +norec @216.239.34.10 google.com ; (1 server found) ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 53595 ;; flags: qr aa; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 512 ;; QUESTION SECTION: ;google.com. IN A ;; ANSWER SECTION: google.com. 300 IN A 142.250.207.14 ;; Query time: 53 msec ;; SERVER: 216.239.34.10#53(216.239.34.10) ;; WHEN: Sat Jun 29 01:06:00 JST 2024 ;; MSG SIZE rcvd: 55
レスポンスを確認してみましょう。
;; flags: qr aa; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
flagsにaaがついています。これは目的のドメインを管理している権威サーバーであることを示しています。
;; ANSWER SECTION: google.com. 300 IN A 142.250.207.14
今までのレスポンスには存在していなかったセクションがあります。 このセクションは名前解決をしたいドメインを管理している権威サーバーに問い合わせた際に取得できるセクションとなります。 これでgoogle.comのIPアドレスを取得することができました。
最後に
今回は名前解決について学んだ内容を簡単にですがまとめさせていただきました。
こちらでまとめている内容は名前解決の全てを網羅しているわけではありませんので
機会があればもっと深く学んでいきたいと思いました。
最後まで読んでくださりありがとうございます!
この記事を読んで興味を持って下さった方がいらっしゃればカジュアルにお話させていただきたく、是非ご応募をお願いいたします!!Wantedly / Green
参考資料
DNSがよくわかる教科書 株式会社日本レジストリサービス 渡邉結衣、佐藤新太、藤原和典:著者 / 株式会社日本レジストリサービス 森下泰宏:監修 www.sbcr.jp