digでDNSを掘る
目標
digでレコードタイプ別の問い合わせを行い、TTLとネガティブキャッシュを読み、getentとdigの答えが分かれるポイントを自分で作ってみます。
なぜ重要なのか
digの出力は、statusとflagsから読む必要があります。NXDOMAIN(名前自体がない)とNOERROR + ANSWER 0(名前はあるが、そのタイプだけがない)はまったく別の状況で、対応も違います。aaフラグがなければキャッシュから来た応答で、そのためTTLが減っていきます。そしてdigは/etc/hostsを見ないので、同じ名前に対してgetentと異なる答えを返すことがあります。その違いこそが、原因の場所です。
ステップ
/root/dnsディレクトリを作成し、/etc/resolv.confからnameserverで始まる行だけを/root/dns/nameserver.txtに保存してください。example.comのAレコードの値だけを/root/dns/a.txtに保存してください。ファイルには、IPv4アドレスが少なくとも1行必要です。google.comのMX、NS、TXTをそれぞれ/root/dns/mx.txt、/root/dns/ns.txt、/root/dns/txt.txtに保存してください。3つのファイルのどれも、空であってはいけません。example.comの回答セクションだけを出力して/root/dns/ttl1.txtに保存し、5秒以上待ってから同じ方法で/root/dns/ttl2.txtを作ってください。2回目のTTLが1回目より大きくてはいけません。8.8.8.8の逆引きの結果を/root/dns/ptr.txtに保存してください。labhub-does-not-exist-9137.invalidを問い合わせ、出力全体を/root/dns/nxdomain.txtに保存してください。ファイルにstatus: NXDOMAINとSOAレコードの両方が入っている必要があります。/etc/hostsに10.77.0.1 www.example.comを追加したあと、getent hosts www.example.comの結果を/root/dns/getent-www.txtに、dig +short www.example.comの結果を/root/dns/dig-www.txtに保存してください。2つの結果は互いに異なっている必要があります。/root/dns/report.txtを次の5行で作成してください。NAMESERVERS=<line count of the step-1 file>/A_COUNT=<line count of the step-2 file>/PTR=<name from step 5, without the trailing dot>/HOSTS_WINS=<IP from the step-7 getent result>/DNS_SAYS=<first IP from the step-7 dig result>
参考
dig +short、dig +noall +answer、dig -x <IP>、dig -t MX <name>を組み合わせると、このラボの大半は終わります。- ステップ4で、TTLは
+noall +answerの出力の2列目です。 - ステップ6で、SOAはAUTHORITYセクションに出ます。
+noall +authorityで別に見ることもできます。 - よくある間違い1: ステップ7で、hostsに入れたIPが実際のDNS応答と同じだと、このステップの意味がありません。プライベートアドレス帯のアドレスを使ってください。
- よくある間違い2:
digの結果が空なら、そのタイプのレコードがないということです。statusを確認して、NXDOMAINなのかNOERRORなのかを区別してください。 - ステップ6が
.invalidである理由: 存在しない名前にNXDOMAINを返さないゾーンもあります。このラボのPodでexample.com・example.org・example.netの存在しない名前を問い合わせると、status: NOERRORとSOAが返ってきました(2026-11-06実測。否定応答を減らす方式のDNSサービス)。.invalidは「存在しない」ことが標準で定められた名前なので、常にNXDOMAINになります。
リゾルバー設定を読む
/root/dnsディレクトリを作成し、/etc/resolv.confからnameserverで始まる行だけを/root/dns/nameserver.txtに保存してください。
resolv.confからnameserverで始まる行だけが必要です。複数ある場合があります。
正引き
example.comのAレコードの値だけを/root/dns/a.txtに保存してください。ファイルには、IPv4アドレスが少なくとも1行必要です。
値だけが必要なら、短い出力オプションがあります。Aレコードは、IPv4アドレスの形式になります。
レコードタイプ別の問い合わせ
google.comのMX、NS、TXTをそれぞれ/root/dns/mx.txt、/root/dns/ns.txt、/root/dns/txt.txtに保存してください。3つのファイルのどれも、空であってはいけません。
digは-tでタイプを指定するか、名前の後ろにタイプをそのまま付けてもかまいません。MXの値は、優先度の数字とホスト名のペアです。
TTLが減っていくのを観察する
example.comの回答セクションだけを出力して/root/dns/ttl1.txtに保存し、5秒以上待ってから同じ方法で/root/dns/ttl2.txtを作ってください。2回目のTTLが1回目より大きくてはいけません。
answerセクションだけを出力すると、TTLは2列目に出ます。同じ問い合わせを、少し間隔を置いて2回行ってください。
逆引き
8.8.8.8の逆引きの結果を/root/dns/ptr.txtに保存してください。
digには、IPを渡すとPTRを探してくれる専用のオプションがあります。結果は、ドットで終わる名前です。
存在しない名前とネガティブキャッシュ
labhub-does-not-exist-9137.invalidを問い合わせ、出力全体を/root/dns/nxdomain.txtに保存してください。ファイルにstatus: NXDOMAINとSOAレコードの両方が入っている必要があります。
statusはヘッダー行にあります。SOAはAUTHORITYセクションに出て、最後の数字がMINIMUMです。
getentとdigで答えが分かれるポイント
/etc/hostsに10.77.0.1 www.example.comを追加したあと、getent hosts www.example.comの結果を/root/dns/getent-www.txtに、dig +short www.example.comの結果を/root/dns/dig-www.txtに保存してください。2つの結果は互いに異なっている必要があります。
hostsに入れたIPとDNSが返すIPが違ってこそ、このステップの意味があります。2つの結果をそれぞれ保存してください。
落とし穴が1つあります。getent hosts <name>はIPv6で先に問い合わせ、その答えがないときだけIPv4で聞き直します。ところが、hostsに入れる行はIPv4の1つだけなので、その名前にAAAAレコードがあると、v6の問い合わせがhostsを素通りしてDNSに出ていき、IPv6アドレスが先に出ます。hostsが無視されたように見えますが、そうではありません。getent ahostsv4 <name>でv4系だけを問い合わせれば、hostsの値がそのまま出ます。このステップでは、そちらを使ってください。
問い合わせの総合レポート
/root/dns/report.txtを次の5行で作成してください。
NAMESERVERS=<line count of the step-1 file> / A_COUNT=<line count of the step-2 file> / PTR=<name from step 5, without the trailing dot> / HOSTS_WINS=<IP from the step-7 getent result> / DNS_SAYS=<first IP from the step-7 dig result>
前のステップの結果をキー=値としてまとめれば十分です。個数を数える項目は、行数で数えれば十分です。