digを使って名前解決をしてみる

:::note info
この記事は[EDOCODE Advent Calendar 2024](https://adventar.org/calendars/10618)、12月19日の記事です。 1つ前の記事は、エンジニアのYupingさんによる[Gojiberryローカライゼーションの話](https://qiita.com/Yuping/items/5dcafa0db9cf6ae7c32f)でした。 また、グループ親会社である[WanoのAdvent Calendar](https://qiita.com/advent-calendar/2024/wano-group)もありますので、そちらもどうぞ！
:::

## はじめに
[EDOCODE](https://www.edocode.co.jp/)でエンジニアをしているYutakaです。今年は業務でインフラ周りを触る機会があり、DNSについて改めて学習しました。弊社のWebサイト`www.edocode.co.jp`のIPアドレス取得(名前解決)までに行われる流れと用語を自分なりに説明してみます。また実際の問い合わせには[dig](https://ja.wikipedia.org/wiki/Dig_(UNIX))を使います。


## 名前解決の全体像

```plantuml
digraph G {
    rankdir=LR; // Set the diagram direction to Left-to-Right
    labelloc="t";
    label="名前解決の全体像";
    // Nodes
    "スタブリゾルバー" [shape=box, style=rounded, width=2, height=1];
    "フルリゾルバー" [shape=box, style=rounded, width=2, height=1];
    "権威サーバー群" [shape=triangle, width=2, height=1.3];

    // Edges
    "スタブリゾルバー" -> "フルリゾルバー" [label="再帰的問い合わせ", dir=both, color=blue];
    "フルリゾルバー" -> "権威サーバー群" [label="非再帰的問い合わせ", dir=both, color=green];
}
```

### 登場した要素
四角と三角の用語をそれぞれを見ていきます。

#### スタブリゾルバー
stub(スタブ)は「末端」という意味があり、利用者端末で動きます。名前解決をする端末で動きフルリゾルバーに問い合わせを送ります。フルリゾルバーのIPはMacやLinuxには`/etc/resolve.conf`に記載があります。


#### フルリゾルバー
スタブリゾルバーからの問い合わせを受け、権威サーバー群に対して名前解決を依頼します。その結果をスタブリゾルバーに返します。また、一定期間、結果をキャッシュします。

#### 権威サーバー群
権威サーバーはネームサーバーとも言います。ここでは権威サーバーと統一して説明します。DNSではドメイン名をベースに管理範囲を階層化して委任することで分散管理をしています。委任によって管理をしている範囲をゾーン("権威サーバー群"図の点線で囲ったところ)と呼びゾーン管理者は権威サーバーで情報を管理します。権威サーバーが管理するのは下記の情報です。
1. そのゾーンのホストのドメイン名とIPアドレス
1. 委任先の権威サーバーの情報(ドメイン名とIPアドレス)

権威サーバーを纏めたものを権威サーバー群としてここでは説明します。`google.com`、`edocode.co.jp`, `gojiberry.jp`を例に権威サーバー群の構造を示したのが下記の図です。



```plantuml
digraph G {
    rankdir=TB;
    labelloc="t";
    label="権威サーバー群";
    subgraph cluster_icann {
        label="ICANN";
        style=dotted;
        "Root(.)"
    }
    
    subgraph cluster_verisign {
        label="VeriSign";
        style=dotted;
        "com"
        "google"
    }
    
    subgraph cluster_jprs {
        label="JPRS";
        style=dotted;
        "jp"
        "co"
    }
    
    subgraph cluster_google {
        label="Google Domains";
        style=dotted;
        "gojiberry"
    }
    
    subgraph cluster_muumuu {
        label="Muumuu Domain";
        style=dotted;
        "edocode"
    }

    "Root(.)" -> "com" [label="委任"];
    "com" -> "google" [label="委任"];
    "Root(.)" -> "jp" [label="委任"];
    "jp" -> "co" [label="委任"];
    "jp" -> "gojiberry" [label="委任"];
    "co" -> "edocode" [label="委任"];
}
```

### 問い合わせの種類

#### 再帰的問い合わせ と 非再帰的問い合わせ
スタブリゾルバーが名前解決を依頼する**再帰的問い合わせ**（"名前解決の全体像"図の青線）と、フルリゾルバーが名前解決をする**非再帰的問い合わせ**("名前解決の全体像"図の緑線)があります。digでは　`+norecurse`または`+norec`をつけることで非再帰的問い合わせを行うことができます(デフォルトは再帰的問い合わせ)。

## 名前解決

ここからはスタブリゾルバー、フルスタブリゾルバーになってdigで`www.edocode.co.jp`の名前解決をしてみます。

### スタブリゾルバーになって名前解決をする
Cloudflareが提供する[1.1.1.1](https://one.one.one.one/)をフルリゾルバーに指定して`www.edocode.co.jp`のレコードタイプにA(IPv4)を指定して問い合わせるコマンドは`dig @1.1.1.1 www.edocode.co.jp A`になります。


DNSで問い合わせる際に指定するタイプをレコードタイプと言います。ここでは代表的なものと今回、名前解決で使うものを載せています。

| タイプ  | 説明 |用途|
|-------|-------------|-----|
| A | 	IPv4 IPアドレスレコード | IPv4 IPアドレスを返す|
| AAAA | IPv6 IPアドレス |IPv6 IPアドレスを返す|
| NS	|ネームサーバーレコード |DNSゾーン自身や下位ドメインの権威DNSサーバを返す|
| CNAME | 別名レコード　| 他の名称へのエイリアス（別名）を返す |
| TXT | テキストレコード	 | ドメインを所有しているかの確認などで使われる　例: [Let's encryptのDNSを使った認証](https://letsencrypt.org/ja/docs/challenge-types/#dns-01-%E3%83%81%E3%83%A3%E3%83%AC%E3%83%B3%E3%82%B8), [Blueskyのhandle名に自ドメインを使う](https://bsky.social/about/blog/4-28-2023-domain-handle-tutorial)|

先ほどのdigコマンドの結果は下記になります。

```bash
dig @1.1.1.1 www.edocode.co.jp A

; <<>> DiG 9.10.6 <<>> @1.1.1.1 www.edocode.co.jp A
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 29383
;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
;; QUESTION SECTION:
;www.edocode.co.jp.		IN	A

;; ANSWER SECTION:
www.edocode.co.jp.	3600	IN	CNAME	edocode-corporate.pages.dev.
edocode-corporate.pages.dev. 300 IN	A	172.66.44.80
edocode-corporate.pages.dev. 300 IN	A	172.66.47.176

;; Query time: 138 msec
;; SERVER: 1.1.1.1#53(1.1.1.1)
;; WHEN: Wed Dec 11 21:46:16 JST 2024
;; MSG SIZE  rcvd: 119
```

QUESTION SECTIONとANSWER SECTIONを詳しく見ていきます。

#### QUESTION SECTION

```bash
;; QUESTION SECTION:
;www.edocode.co.jp.		IN	A
```
問い合わせた内容が`{ドメイン} {クラス} {レコードタイプ}`の順になっています。クラスにはIN(Internet),以外にもCS([CSNET](https://ja.wikipedia.org/wiki/CSNET)),CH([Chaosnet](https://en.wikipedia.org/wiki/Chaosnet)) などがあります。指定がない場合、digはINクラスで問い合わせを行います。

#### ANSWER SECTION

```bash
;; ANSWER SECTION:
www.edocode.co.jp.	3600	IN	CNAME	edocode-corporate.pages.dev.
edocode-corporate.pages.dev. 300 IN	A	172.66.44.80
edocode-corporate.pages.dev. 300 IN	A	172.66.47.176
```

回答が一行ごとに`{ドメイン名} {TTL} {クラス} {レコードタイプ} {値}`のフォーマットになっています(後述のAUTHORITY SECTION, ADDITIONAL SECTIONも同様のフォーマット)。
- 1行目`www.edocode.co.jp.	3600	IN	CNAME	edocode-corporate.pages.dev.`から`www.edocode.co.jp.`は`edocode-corporate.pages.dev.`の別名(エイリアス)
- 2行目`edocode-corporate.pages.dev. 300 IN	A	172.66.44.80`から`edocode-corporate.pages.dev.`のIPv4アドレスは`172.66.44.80`
- 3行目`edocode-corporate.pages.dev. 300 IN	A	172.66.47.176`から`edocode-corporate.pages.dev.`のIPv4アドレスは`172.66.47.176`

ということがわかりました。このことから`www.edocode.co.jp.`は`edocode-corporate.pages.dev.`の別名でIPアドレスは`172.66.44.80`と`172.66.47.176`ということがわかりました。

TTLは[Time to live](https://ja.wikipedia.org/wiki/Time_to_live)の略でフルリゾルバーが問い合わせ内容をキャッシュする時間(単位は秒)です。

### フルリゾルバーになって名前解決をする

次にフルリゾルバーになって同じ`www.edocode.co.jp`の名前解決をしてみます。前で紹介した権威サーバー群の一番頂点にあるルート(.)へ問い合わせを行います。ルートは[ICANN](https://ja.wikipedia.org/wiki/ICANN)が管理をしておりIPアドレスは[こちら](https://www.iana.org/domains/root/servers)から取得できます。今回はVerisign, Inc.の`198.41.0.4`を利用してみます。

#### `.(ルート)`権威サーバーに`www.edocode.co.jp`を問い合わせ

コマンドは`dig +norec @198.41.0.4 www.edocode.co.jp A`になります。フルリゾルバーは非再帰的問い合わせのため`+norec`(non-recursive)を指定します。結果は下記のようになりました(これ以降AUTHORITY SECTION, ADDITIONAL SECTIONの中を一部省略しています)。

```bash
dig +norec @198.41.0.4 www.edocode.co.jp A

; <<>> DiG 9.10.6 <<>> +norec @198.41.0.4 www.edocode.co.jp A
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 9272
;; flags: qr; QUERY: 1, ANSWER: 0, AUTHORITY: 8, ADDITIONAL: 16

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;www.edocode.co.jp.		IN	A

;; AUTHORITY SECTION:
jp.			172800	IN	NS	e.dns.jp.
--- 途中省略 ---
jp.			172800	IN	NS	b.dns.jp.

;; ADDITIONAL SECTION:
e.dns.jp.		172800	IN	A	192.50.43.53
e.dns.jp.		172800	IN	AAAA	2001:200:c000::35
--- 途中省略 ---
b.dns.jp.		172800	IN	A	202.12.30.131
b.dns.jp.		172800	IN	AAAA	2001:dc2::1

;; Query time: 46 msec
;; SERVER: 198.41.0.4#53(198.41.0.4)
;; WHEN: Wed Dec 18 14:18:28 JST 2024
;; MSG SIZE  rcvd: 502
```
QUESTION SECTIONの内容は先ほどの「スタブリゾルバーになって名前解決をする」と同じになりました。今回はANSWER SECTIONがありませんでした。前回はなかったAUTHORITY SECTION, ADDITIONAL SECTIONを詳しく見ていきます。

##### AUTHORITY SECTION
```bash
;; AUTHORITY SECTION:
jp.			172800	IN	NS	e.dns.jp.
--- 途中省略 ---
jp.			172800	IN	NS	b.dns.jp.
```
権威サーバーが答えを知らない場合、尋ねられた権威サーバー(`root`)は委任情報(`jp`)をこのセクションに含めます。フォーマットはANSWER SECTIONと同様で`{ドメイン名} {TTL} {クラス} {レコードタイプ} {値}`です。そのため`jp.			172800	IN	NS	e.dns.jp.` から`jp.`の権威サーバー(NS)は`e.dns.jp.`ということがわかります。他にも`b.dns.jp.`や省略されているものもありますが今回は`e.dns.jp.`を使っていきます。

##### ADDITIONAL SECTION
```bash
;; ADDITIONAL SECTION:
e.dns.jp.		172800	IN	A	192.50.43.53
e.dns.jp.		172800	IN	AAAA	2001:200:c000::35
--- 途中省略 ---
b.dns.jp.		172800	IN	A	202.12.30.131
b.dns.jp.		172800	IN	AAAA	2001:dc2::1
```
AUTHORITY SECTIONでは委任情報のドメイン名(`e.dns.jp.`)が含まれました。それらのドメイン名に対応するIPアドレスがこのセクションに含まれます。フォーマットはANSWER, AUTHORITY SECTIONと同様のため、`e.dns.jp.		172800	IN	A	192.50.43.53`は`e.dns.jp.`のIPv4は`192.50.43.53`ということがわかります。

#### `jp.`権威サーバーに`www.edocode.co.jp`を問い合わせ

一つ前で取得したjp.の権威サーバーを使って問い合わせを行います。コマンドは`dig +norec @192.50.43.53 www.edocode.co.jp A`になります(@以降のIPアドレスだけが変わっています)。結果はこちらになります。

```bash
dig +norec @192.50.43.53 www.edocode.co.jp A

; <<>> DiG 9.10.6 <<>> +norec @192.50.43.53 www.edocode.co.jp A
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 7130
;; flags: qr; QUERY: 1, ANSWER: 0, AUTHORITY: 2, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
;; QUESTION SECTION:
;www.edocode.co.jp.		IN	A

;; AUTHORITY SECTION:
edocode.co.jp.		86400	IN	NS	dns01.muumuu-domain.com.
edocode.co.jp.		86400	IN	NS	dns02.muumuu-domain.com.

;; Query time: 51 msec
;; SERVER: 192.50.43.53#53(192.50.43.53)
;; WHEN: Wed Dec 18 15:00:21 JST 2024
;; MSG SIZE  rcvd: 103
```

今回はAUTHORITY SECTIONがありますが、ADDITIONAL SECTIONがありません。そのため、AUTHORITY SECTIONに記載のある`dns01.muumuu-domain.com.`又は`dns02.muumuu-domain.com.`に問い合わせをする必要があります。ルート権威サーバーに問い合わせた際、権威サーバーのIPアドレスがADDITIONAL SECTIONにありました。今回は詳細の説明は省きますが、これらを[グルーレコード](https://jprs.jp/glossary/index.php?ID=0185)と言います。権威サーバーは`dns01.muumuu-domain.com.`ということがわかりましたが、IPアドレス(Aレコード)がわからないので問い合わせをします。

#### `.(ルート)`権威サーバーに`dns01.muumuu-domain.com`を問い合わせ
```bash
dig +norec @198.41.0.4 dns01.muumuu-domain.com A


; <<>> DiG 9.10.6 <<>> +norec @198.41.0.4 dns01.muumuu-domain.com A
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 41575
;; flags: qr; QUERY: 1, ANSWER: 0, AUTHORITY: 13, ADDITIONAL: 27

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;dns01.muumuu-domain.com.	IN	A

;; AUTHORITY SECTION:
com.			172800	IN	NS	l.gtld-servers.net.
--- 途中省略 ---
com.			172800	IN	NS	e.gtld-servers.net.

;; ADDITIONAL SECTION:
l.gtld-servers.net.	172800	IN	A	192.41.162.30
l.gtld-servers.net.	172800	IN	AAAA	2001:500:d937::30
--- 途中省略 ---
e.gtld-servers.net.	172800	IN	A	192.12.94.30
e.gtld-servers.net.	172800	IN	AAAA	2001:502:1ca1::30

;; Query time: 46 msec
;; SERVER: 198.41.0.4#53(198.41.0.4)
;; WHEN: Wed Dec 18 15:17:24 JST 2024
;; MSG SIZE  rcvd: 848
```

この結果から、`com.`権威サーバーのIPアドレスが`192.41.162.30`(`l.gtld-servers.net.`)だとわかりました。これを使って引き続き問い合わせを行います。

#### `com.`権威サーバーに`dns01.muumuu-domain.com`を問い合わせ

```bash
dig +norec @192.41.162.30 dns01.muumuu-domain.com A


; <<>> DiG 9.10.6 <<>> +norec @192.41.162.30 dns01.muumuu-domain.com A
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 35673
;; flags: qr; QUERY: 1, ANSWER: 0, AUTHORITY: 2, ADDITIONAL: 3

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;dns01.muumuu-domain.com.	IN	A

;; AUTHORITY SECTION:
muumuu-domain.com.	172800	IN	NS	dns01.muumuu-domain.com.
muumuu-domain.com.	172800	IN	NS	dns02.muumuu-domain.com.

;; ADDITIONAL SECTION:
dns01.muumuu-domain.com. 172800	IN	A	202.239.23.45
dns02.muumuu-domain.com. 172800	IN	A	160.251.249.62

;; Query time: 55 msec
;; SERVER: 192.41.162.30#53(192.41.162.30)
;; WHEN: Wed Dec 18 15:22:35 JST 2024
;; MSG SIZE  rcvd: 118
```
これから`dns01.muumuu-domain.com.`のIPアドレスは`202.239.23.45`とわかりました。引き続き`www.edocode.co.jp`のIPを問い合わせしてみます。

#### `dns01.muumuu-domain.com.`権威サーバーに`www.edocode.co.jp`を問い合わせ
```bash
dig +norec @202.239.23.45 www.edocode.co.jp A

; <<>> DiG 9.10.6 <<>> +norec @202.239.23.45 www.edocode.co.jp A
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 8153
;; flags: qr aa; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
;; QUESTION SECTION:
;www.edocode.co.jp.		IN	A

;; ANSWER SECTION:
www.edocode.co.jp.	3600	IN	CNAME	edocode-corporate.pages.dev.

;; Query time: 88 msec
;; SERVER: 202.239.23.45#53(202.239.23.45)
;; WHEN: Wed Dec 18 15:25:32 JST 2024
;; MSG SIZE  rcvd: 87
```
こちらから、`www.edocode.co.jp.`は`edocode-corporate.pages.dev.`のエイリアス(CNAME)だということがわかりました。実体である`edocode-corporate.pages.dev.`を問い合わせていきます。

#### `.(ルート)`権威サーバーに`edocode-corporate.pages.dev`を問い合わせ

```bash
dig +norec @198.41.0.4 edocode-corporate.pages.dev A

; <<>> DiG 9.10.6 <<>> +norec @198.41.0.4 edocode-corporate.pages.dev A
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 26963
;; flags: qr; QUERY: 1, ANSWER: 0, AUTHORITY: 5, ADDITIONAL: 11

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;edocode-corporate.pages.dev.	IN	A

;; AUTHORITY SECTION:
dev.			172800	IN	NS	ns-tld1.charlestonroadregistry.com.
--- 途中省略 ---
dev.			172800	IN	NS	ns-tld4.charlestonroadregistry.com.

;; ADDITIONAL SECTION:
ns-tld1.charlestonroadregistry.com. 172800 IN A	216.239.32.105
ns-tld1.charlestonroadregistry.com. 172800 IN AAAA 2001:4860:4802:32::69
--- 途中省略 ---
ns-tld4.charlestonroadregistry.com. 172800 IN A	216.239.38.105
ns-tld4.charlestonroadregistry.com. 172800 IN AAAA 2001:4860:4802:38::69

;; Query time: 118 msec
;; SERVER: 198.41.0.4#53(198.41.0.4)
;; WHEN: Wed Dec 18 15:27:55 JST 2024
;; MSG SIZE  rcvd: 412
```
この結果から、`dev.`権威サーバーのIPアドレスが`216.239.32.105`(`ns-tld1.charlestonroadregistry.com.`)だとわかりました。これを使って引き続き問い合わせを行います。

#### `dev.`権威サーバーに`edocode-corporate.pages.dev`を問い合わせ
```bash
dig +norec @216.239.32.105 edocode-corporate.pages.dev A

; <<>> DiG 9.10.6 <<>> +norec @216.239.32.105 edocode-corporate.pages.dev A
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 45941
;; flags: qr; QUERY: 1, ANSWER: 0, AUTHORITY: 2, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;edocode-corporate.pages.dev.	IN	A

;; AUTHORITY SECTION:
pages.dev.		10800	IN	NS	karl.ns.cloudflare.com.
pages.dev.		10800	IN	NS	adi.ns.cloudflare.com.

;; Query time: 43 msec
;; SERVER: 216.239.32.105#53(216.239.32.105)
;; WHEN: Wed Dec 18 15:30:03 JST 2024
;; MSG SIZE  rcvd: 110
```
再び、ADDITIONAL SECTIONがないため権威サーバー`karl.ns.cloudflare.com.`のIPアドレスをルート権威サーバーに問い合わせをします。

#### `.(ルート)`権威サーバーに`karl.ns.cloudflare.com`を問い合わせ
```bash
dig +norec @198.41.0.4 karl.ns.cloudflare.com A

; <<>> DiG 9.10.6 <<>> +norec @198.41.0.4 karl.ns.cloudflare.com A
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 37415
;; flags: qr; QUERY: 1, ANSWER: 0, AUTHORITY: 13, ADDITIONAL: 27

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;karl.ns.cloudflare.com.		IN	A

;; AUTHORITY SECTION:
com.			172800	IN	NS	l.gtld-servers.net.
--- 途中省略 ---
com.			172800	IN	NS	e.gtld-servers.net.

;; ADDITIONAL SECTION:
l.gtld-servers.net.	172800	IN	A	192.41.162.30
l.gtld-servers.net.	172800	IN	AAAA	2001:500:d937::30
--- 途中省略 ---
e.gtld-servers.net.	172800	IN	A	192.12.94.30
e.gtld-servers.net.	172800	IN	AAAA	2001:502:1ca1::30

;; Query time: 107 msec
;; SERVER: 198.41.0.4#53(198.41.0.4)
;; WHEN: Wed Dec 18 15:32:37 JST 2024
;; MSG SIZE  rcvd: 847
```
この結果から、`com.`権威サーバーのIPアドレスが`192.41.162.30`(`l.gtld-servers.net.`)だとわかりました。これを使って引き続き問い合わせを行います。

#### `com.`権威サーバーに`karl.ns.cloudflare.com`を問い合わせ
```bash
dig +norec @192.41.162.30 karl.ns.cloudflare.com A

; <<>> DiG 9.10.6 <<>> +norec @192.41.162.30 karl.ns.cloudflare.com A
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 14258
;; flags: qr; QUERY: 1, ANSWER: 0, AUTHORITY: 5, ADDITIONAL: 21

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;karl.ns.cloudflare.com.		IN	A

;; AUTHORITY SECTION:
cloudflare.com.		172800	IN	NS	ns3.cloudflare.com.
--- 途中省略 ---
cloudflare.com.		172800	IN	NS	ns7.cloudflare.com.

;; ADDITIONAL SECTION:
ns3.cloudflare.com.	172800	IN	A	162.159.0.33
ns3.cloudflare.com.	172800	IN	A	162.159.7.226
ns3.cloudflare.com.	172800	IN	AAAA	2400:cb00:2049:1::a29f:21
ns3.cloudflare.com.	172800	IN	AAAA	2400:cb00:2049:1::a29f:7e2
--- 途中省略 ---
ns7.cloudflare.com.	172800	IN	A	162.159.4.8
ns7.cloudflare.com.	172800	IN	A	162.159.6.6
ns7.cloudflare.com.	172800	IN	AAAA	2400:cb00:2049:1::a29f:408
ns7.cloudflare.com.	172800	IN	AAAA	2400:cb00:2049:1::a29f:606

;; Query time: 67 msec
;; SERVER: 192.41.162.30#53(192.41.162.30)
;; WHEN: Wed Dec 18 15:34:30 JST 2024
;; MSG SIZE  rcvd: 581
```
この結果から、`cloudflare.com.`権威サーバーのIPアドレスが`162.159.0.33`(`ns3.cloudflare.com.`)だとわかりました。これを使って引き続き問い合わせを行います。

#### `cloudflare.com.`権威サーバーに`karl.ns.cloudflare.com`を問い合わせ

```bash
dig +norec @162.159.0.33 karl.ns.cloudflare.com A

; <<>> DiG 9.10.6 <<>> +norec @162.159.0.33 karl.ns.cloudflare.com A
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 33459
;; flags: qr aa; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
;; QUESTION SECTION:
;karl.ns.cloudflare.com.		IN	A

;; ANSWER SECTION:
karl.ns.cloudflare.com.	86353	IN	A	172.64.33.190
karl.ns.cloudflare.com.	86353	IN	A	173.245.59.190
karl.ns.cloudflare.com.	86353	IN	A	108.162.193.190

;; Query time: 48 msec
;; SERVER: 162.159.0.33#53(162.159.0.33)
;; WHEN: Wed Dec 18 15:36:45 JST 2024
;; MSG SIZE  rcvd: 99
```

`karl.ns.cloudflare.com`のIPアドレスが`172.64.33.190`だとわかりました。これを使って`edocode-corporate.pages.dev`を問い合わせしていきます。


#### `karl.ns.cloudflare.com`権威サーバーに`edocode-corporate.pages.dev`を問い合わせ
```bash
dig +norec @172.64.33.190 edocode-corporate.pages.dev A

; <<>> DiG 9.10.6 <<>> +norec @172.64.33.190 edocode-corporate.pages.dev A
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 55065
;; flags: qr; QUERY: 1, ANSWER: 0, AUTHORITY: 2, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
;; QUESTION SECTION:
;edocode-corporate.pages.dev.	IN	A

;; AUTHORITY SECTION:
edocode-corporate.pages.dev. 300 IN	NS	donna.ns.cloudflare.com.
edocode-corporate.pages.dev. 300 IN	NS	yahir.ns.cloudflare.com.

;; Query time: 59 msec
;; SERVER: 172.64.33.190#53(172.64.33.190)
;; WHEN: Wed Dec 18 15:39:14 JST 2024
;; MSG SIZE  rcvd: 113
```
再び権威サーバーのIPアドレスがADDITIONAL SECTIONにないため、`donna.ns.cloudflare.com.`のIPアドレスを問い合わせします。以前、`cloudflare.com.`権威サーバーのIPアドレスを取得しているのでキャッシュが残っている想定で問い合わせをします。


#### `cloudflare.com.`権威サーバーに`donna.ns.cloudflare.com.`を問い合わせ
```bash
dig +norec @162.159.0.33 donna.ns.cloudflare.com A

; <<>> DiG 9.10.6 <<>> +norec @162.159.0.33 donna.ns.cloudflare.com A
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 53553
;; flags: qr aa; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
;; QUESTION SECTION:
;donna.ns.cloudflare.com.	IN	A

;; ANSWER SECTION:
donna.ns.cloudflare.com. 86353	IN	A	173.245.58.151
donna.ns.cloudflare.com. 86353	IN	A	172.64.32.151
donna.ns.cloudflare.com. 86353	IN	A	108.162.192.151

;; Query time: 49 msec
;; SERVER: 162.159.0.33#53(162.159.0.33)
;; WHEN: Wed Dec 18 15:46:14 JST 2024
;; MSG SIZE  rcvd: 100
```
`donna.ns.cloudflare.com.`権威サーバーのIPは`173.245.58.151`なので、`edocode-corporate.pages.dev`を問い合わせします。

#### `donna.ns.cloudflare.com.`権威サーバーに`edocode-corporate.pages.dev`を問い合わせ




```bash
dig +norec @173.245.58.151 edocode-corporate.pages.dev A


; <<>> DiG 9.10.6 <<>> +norec @173.245.58.151 edocode-corporate.pages.dev A
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 6896
;; flags: qr aa; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
;; QUESTION SECTION:
;edocode-corporate.pages.dev.	IN	A

;; ANSWER SECTION:
edocode-corporate.pages.dev. 300 IN	A	172.66.44.80
edocode-corporate.pages.dev. 300 IN	A	172.66.47.176

;; Query time: 53 msec
;; SERVER: 173.245.58.151#53(173.245.58.151)
;; WHEN: Wed Dec 18 15:48:32 JST 2024
;; MSG SIZE  rcvd: 88
```


やっと`www.edocode.co.jp`の実体`edocode-corporate.pages.dev`のIPアドレス`172.66.44.80`,`172.66.47.176`がわかりました。


## 最後に

実際に非再帰的問い合わせを行うことで、DNSの問い合わせの流れイメージが湧きました。また社内の福利厚生で利用した[CodeCrafters](https://codecrafters.io/)の中でDNSサーバーを実装したことでプロトコルに対しての理解が深まりました。

今後もインプットだけでなくこのようにアウトプットを続けていきたいと考えています。




----


明日、12月20日(金)は、エンジニアのAnne-Liseさんによる[Exploring the consistency of characters generated with AI-image generator tools](https://medium.com/@coudry.a/exploring-the-consistency-of-characters-generated-with-ai-image-generator-tools-63ba44198c42)です。

私たちWanoグループでは人材募集をしています。興味のある方は、下記のリンクからぜひ募集中の求人をご確認ください！

[JOBS | Wano Group](https://group.wano.co.jp/jobs/)