digコマンドを使ってみよう

# 0.本稿について
- 対象：digコマンドでドメインやIPの確認方法について学習したい初学者。
- 目標：AlmaLinuxでdigコマンドでDNSクエリを発行し、基本的なDNS情報を取得できるようになる。
- 想定：DNSについて基本的な部分をなんとなくレベルでも理解している初学者を想定。
- 環境：本稿ではAlmaLinux9.xをMinimalで最小インストールした環境を使用しています。

:::note warn 
#### 正確さの省略について
本稿では概念をわかりやすくするために、簡略化した表現を使用し、一部専門的な詳細を省略している事があります。
:::

# 1.はじめに
Linux環境で、ドメイン名が正しくIPアドレスに解決されているか確認したり、メールの送信先サーバ（MXレコード）を調べたりする際に、digコマンドがよく使われます。
本稿ではインストール・一般的な使い方を紹介します。

## お品書き
- 2.digコマンドのパッケージ
- 3.digコマンドのインストール
- 4.digコマンドの基本
- 5.digコマンドの見方
- 6.やってみよう

# 2.digコマンドのパッケージ
まずは、`which`コマンドで`dig`を確認してみると入っていない事が分かります。

```
$ which dig
```
```bash
/usr/bin/which: no dig in (/home/yoyo/.local/bin:/home/yoyo/bin:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin)
```

なので、digコマンドが入っているパッケージを探します。

```bash
$ dnf provides dig
```
```bash
～～～中略～～～
bind-utils-32:9.16.23-24.el9_5.x86_64 : Utilities for querying DNS name servers
Repo        : appstream
Matched from:
Filename    : /usr/bin/dig

bind9.18-utils-32:9.18.29-1.el9.x86_64 : Utilities for querying DNS name servers
Repo        : appstream
Matched from:
Filename    : /usr/bin/dig
```
2つのパッケージで提供されている事が分かりました。今回は`bind-utils`をインストールしてみます。

# 3.digコマンドのインストール
以下コマンドでインストールを行います。

```bash
$ dnf install bind-utils -y
```
```bash
～～～中略～～～
Installed:
  bind-libs-32:9.16.23-24.el9_5.x86_64        bind-license-32:9.16.23-24.el9_5.noarch        bind-utils-32:9.16.23-24.el9_5.x86_64
  fstrm-0.6.1-3.el9.x86_64                    libmaxminddb-1.5.2-4.el9.x86_64                libuv-1:1.42.0-2.el9_4.x86_64
  protobuf-c-1.3.3-13.el9.x86_64
```

whichコマンドを実行してみると今度はno digの表示が出ません。
```bash
$ which dig
```
```bash
/usr/bin/dig
```

あまり意味はありませんが、以下コマンドでバージョンの確認ができます。

```bash
$ dig -v
```
```bash
DiG 9.16.23-RH
```

# 4.digコマンドの基本

digコマンドは基本的に以下のように使用します。

```bash
dig ドメイン名 [タイプ] [@DNSサーバ]
```

実際にdigコマンドを使ってみましょう。

### `dig`
まずは、何もつけずに単に`dig`を実行してみましょう。すると、以下のように表示されます。
各項目の見方は後述しますが、これでルートサーバの情報を見る事ができます。
```bash
$ dig
```
```bash
; <<>> DiG 9.16.23-RH <<>>
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 3723
;; flags: qr rd ra; QUERY: 1, ANSWER: 13, AUTHORITY: 0, ADDITIONAL: 13

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1400
;; QUESTION SECTION:
;.                              IN      NS

;; ANSWER SECTION:
.                       255202  IN      NS      i.root-servers.net.
.                       255202  IN      NS      a.root-servers.net.
.                       255202  IN      NS      k.root-servers.net.
.                       255202  IN      NS      c.root-servers.net.
.                       255202  IN      NS      h.root-servers.net.
.                       255202  IN      NS      m.root-servers.net.
.                       255202  IN      NS      l.root-servers.net.
.                       255202  IN      NS      f.root-servers.net.
.                       255202  IN      NS      j.root-servers.net.
.                       255202  IN      NS      b.root-servers.net.
.                       255202  IN      NS      d.root-servers.net.
.                       255202  IN      NS      e.root-servers.net.
.                       255202  IN      NS      g.root-servers.net.

;; ADDITIONAL SECTION:
l.root-servers.net.     255202  IN      A       199.7.83.42
l.root-servers.net.     255202  IN      AAAA    2001:500:9f::42
f.root-servers.net.     255202  IN      A       192.5.5.241
f.root-servers.net.     255202  IN      AAAA    2001:500:2f::f
j.root-servers.net.     255202  IN      AAAA    2001:503:c27::2:30
b.root-servers.net.     255202  IN      A       170.247.170.2
b.root-servers.net.     255202  IN      AAAA    2801:1b8:10::b
d.root-servers.net.     255202  IN      AAAA    2001:500:2d::d
g.root-servers.net.     255202  IN      A       192.112.36.4
g.root-servers.net.     255202  IN      AAAA    2001:500:12::d0d
a.root-servers.net.     255202  IN      A       198.41.0.4
a.root-servers.net.     255202  IN      AAAA    2001:503:ba3e::2:30

;; Query time: 6 msec
;; SERVER: 192.168.1.1#53(192.168.1.1)
;; WHEN: Tue Jan 28 14:14:14 JST 2025
;; MSG SIZE  rcvd: 923
```

### `dig ドメイン名`
調べたいドメイン情報を調べる場合は以下のように実行します。

```bash
$ dig ドメイン名
```

:::note info
後述する[`@DNSサーバ`]を省略した場合は、使用しているLinuxシステムのデフォルトのDNSサーバに問合せを行います。この場合は、DNSが`192.168.1.1`となっているため、`192.168.1.1`に問合せを行います。
:::

例えば`google.com`のドメイン情報を調べる場合は以下のようになります。

```bash
$ dig google.com
```
```bash
; <<>> DiG 9.16.23-RH <<>> google.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 50833
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1400
;; QUESTION SECTION:
;google.com.                    IN      A

;; ANSWER SECTION:
google.com.             205     IN      A       142.250.198.14

;; Query time: 7 msec
;; SERVER: 192.168.1.1#53(192.168.1.1)
;; WHEN: Tue Jan 28 15:39:31 JST 2025
;; MSG SIZE  rcvd: 55
```

### `dig ドメイン名 @DNSサーバ`
特定のDNSサーバを経由してドメイン情報を調べたい場合は以下のように実行します。

```bash
$ dig ドメイン名 @DNSサーバ
```
例えばgoogle.comのドメイン情報をDNSサーバ`8.8.8.8`に問い合わせて調べたい場合は以下のようになります。
```bash
dig google.com @8.8.8.8
```
```bash
; <<>> DiG 9.16.23-RH <<>> google.com @8.8.8.8
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 17150
;; flags: qr rd ra; 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.             34      IN      A       142.251.42.142

;; Query time: 5 msec
;; SERVER: 8.8.8.8#53(8.8.8.8)
;; WHEN: Tue Jan 28 15:42:04 JST 2025
;; MSG SIZE  rcvd: 55
```

### `dig ドメイン名 レコード`
以下のようなコマンドで、ドメインが提供しているレコードを調べる事ができます。
```bash
$ dig ドメイン名 レコード名
```
例えばgoogle.comドメインが提供しているMXレコードを調べたい場合は以下のようになります。
```bash
 dig google.com MX
```
```bash
; <<>> DiG 9.16.23-RH <<>> google.com MX
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 29791
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1400
;; QUESTION SECTION:
;google.com.                    IN      MX

;; ANSWER SECTION:
google.com.             188     IN      MX      10 smtp.google.com.

;; Query time: 5 msec
;; SERVER: 192.168.1.1#53(192.168.1.1)
;; WHEN: Tue Jan 28 16:22:57 JST 2025
;; MSG SIZE  rcvd: 60
```

:::note info
#### レコードタイプ省略時
digコマンドでレコードタイプを省略した場合はデフォルトでAレコードが指定されます。
:::

# 5.digコマンドの見方
先に使い方とその結果を書いたので前後しますが、digコマンドを実行すると、いくつかのセクションごとに分けられて情報が表示されます。
以下の結果を例に代表的なセクションを説明します。

```bash
dig google.com

; <<>> DiG 9.16.23-RH <<>> google.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 65346
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1400
;; QUESTION SECTION:
;google.com.                    IN      A

;; ANSWER SECTION:
google.com.             93      IN      A       172.217.174.110

;; Query time: 6 msec
;; SERVER: 192.168.1.1#53(192.168.1.1)
;; WHEN: Tue Jan 28 16:26:24 JST 2025
;; MSG SIZE  rcvd: 55
```

## 5.1 HEADER SECTION
最初に表示されるのはヘッダーセクションと呼ばれます。
ここで表示されるのは、
- 1行目：digツールのバージョン情報、問い合わせたドメイン名
- 4行目：実行されたクエリの種類、クエリの結果ステータス、クエリのID
- 5行目:クエリや応答のフラグ情報、クエリの問合せ回数、応答に含まれるレコードの数、応答に含まれる権威サーバの数、追加レコードの数

です。
```bash
; <<>> DiG 9.16.23-RH <<>> google.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 65346
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
```

:::note warn
DNSのデータフォーマット的には4,5行目がヘッダーセクションになります。
:::

## 5.2 OPT PSEUDOSECTION
DNSの拡張機能である、EDNSの情報を提供します。
```bash
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1400
```

## 5.3 QUESTION SECTION
問合せたドメイン名とそのレコードを表示します。
```bash
;; QUESTION SECTION:
;google.com.                    IN      A
```

## 5.4 ANSWER SECTION
問合せたドメイン名、TTL、問い合わせたレコードタイプ、レコードの値(IPアドレス)が表示されます。
この場合、`google.com`のAレコードの結果を問合せ、その結果として`172.217.174.110`が表示されています。
```bash
;; ANSWER SECTION:
google.com.             93      IN      A       172.217.174.110
```

## 5.5 統計情報
最後に統計情報が表示されます。
```bash
;; Query time: 6 msec
;; SERVER: 192.168.1.1#53(192.168.1.1)
;; WHEN: Tue Jan 28 16:26:24 JST 2025
;; MSG SIZE  rcvd: 55
```
- **Query time**:問い合わせに要した時間
- **SERVER**:問合せを行ったサーバ、ポート
- **WHEN**:問い合わせを行った日時
- **MSG SIZE rcvd**:受信したメッセージのサイズ

# 6.やってみよう
実際にコマンドを実行し、その表示結果の差異を何度も見比べる事で理解度が上がります。

本稿のまとめとして、以下をやってみましょう。
- 自分の知っているDNSドメインのDNS情報を参照してみる
- DNSサーバを`1.1.1.1`や`8.8.8.8`などのパブリックDNSサーバにして、違いなどを探してみる
- digコマンドで権威サーバを調べ、DNSサーバを権威サーバにしてどう表示されるか見てみる

以上です。