0.本稿について
- 対象:digコマンドでドメインやIPの確認方法について学習したい初学者。
- 目標:AlmaLinuxでdigコマンドでDNSクエリを発行し、基本的なDNS情報を取得できるようになる。
- 想定:DNSについて基本的な部分をなんとなくレベルでも理解している初学者を想定。
- 環境:本稿ではAlmaLinux9.xをMinimalで最小インストールした環境を使用しています。
1.はじめに
Linux環境で、ドメイン名が正しくIPアドレスに解決されているか確認したり、メールの送信先サーバ(MXレコード)を調べたりする際に、digコマンドがよく使われます。
本稿ではインストール・一般的な使い方を紹介します。
お品書き
- 2.digコマンドのパッケージ
- 3.digコマンドのインストール
- 4.digコマンドの基本
- 5.digコマンドの見方
- 6.やってみよう
2.digコマンドのパッケージ
まずは、which
コマンドでdig
を確認してみると入っていない事が分かります。
$ which dig
/usr/bin/which: no dig in (/home/yoyo/.local/bin:/home/yoyo/bin:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin)
なので、digコマンドが入っているパッケージを探します。
$ dnf provides dig
~~~中略~~~
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コマンドのインストール
以下コマンドでインストールを行います。
$ dnf install bind-utils -y
~~~中略~~~
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の表示が出ません。
$ which dig
/usr/bin/dig
あまり意味はありませんが、以下コマンドでバージョンの確認ができます。
$ dig -v
DiG 9.16.23-RH
4.digコマンドの基本
digコマンドは基本的に以下のように使用します。
dig ドメイン名 [タイプ] [@DNSサーバ]
実際にdigコマンドを使ってみましょう。
dig
まずは、何もつけずに単にdig
を実行してみましょう。すると、以下のように表示されます。
各項目の見方は後述しますが、これでルートサーバの情報を見る事ができます。
$ dig
; <<>> 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 ドメイン名
調べたいドメイン情報を調べる場合は以下のように実行します。
$ dig ドメイン名
後述する[@DNSサーバ
]を省略した場合は、使用しているLinuxシステムのデフォルトのDNSサーバに問合せを行います。この場合は、DNSが192.168.1.1
となっているため、192.168.1.1
に問合せを行います。
例えばgoogle.com
のドメイン情報を調べる場合は以下のようになります。
$ dig google.com
; <<>> 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サーバを経由してドメイン情報を調べたい場合は以下のように実行します。
$ dig ドメイン名 @DNSサーバ
例えばgoogle.comのドメイン情報をDNSサーバ8.8.8.8
に問い合わせて調べたい場合は以下のようになります。
dig google.com @8.8.8.8
; <<>> 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 ドメイン名 レコード
以下のようなコマンドで、ドメインが提供しているレコードを調べる事ができます。
$ dig ドメイン名 レコード名
例えばgoogle.comドメインが提供しているMXレコードを調べたい場合は以下のようになります。
dig google.com MX
; <<>> 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
5.digコマンドの見方
先に使い方とその結果を書いたので前後しますが、digコマンドを実行すると、いくつかのセクションごとに分けられて情報が表示されます。
以下の結果を例に代表的なセクションを説明します。
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行目:クエリや応答のフラグ情報、クエリの問合せ回数、応答に含まれるレコードの数、応答に含まれる権威サーバの数、追加レコードの数
です。
; <<>> 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
DNSのデータフォーマット的には4,5行目がヘッダーセクションになります。
5.2 OPT PSEUDOSECTION
DNSの拡張機能である、EDNSの情報を提供します。
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1400
5.3 QUESTION SECTION
問合せたドメイン名とそのレコードを表示します。
;; QUESTION SECTION:
;google.com. IN A
5.4 ANSWER SECTION
問合せたドメイン名、TTL、問い合わせたレコードタイプ、レコードの値(IPアドレス)が表示されます。
この場合、google.com
のAレコードの結果を問合せ、その結果として172.217.174.110
が表示されています。
;; ANSWER SECTION:
google.com. 93 IN A 172.217.174.110
5.5 統計情報
最後に統計情報が表示されます。
;; 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サーバを権威サーバにしてどう表示されるか見てみる
以上です。