TT Lab
はじめる
学ぶ 学習パス コース

ネットワークトラブルシューティング

digでDNSを掘る

TT Labで続きを見る

目標

digでレコードタイプ別の問い合わせを行い、TTLとネガティブキャッシュを読み、getentとdigの答えが分かれるポイントを自分で作ってみます。

なぜ重要なのか

digの出力は、statusとflagsから読む必要があります。NXDOMAIN(名前自体がない)とNOERROR + ANSWER 0(名前はあるが、そのタイプだけがない)はまったく別の状況で、対応も違います。aaフラグがなければキャッシュから来た応答で、そのためTTLが減っていきます。そしてdigは/etc/hostsを見ないので、同じ名前に対してgetentと異なる答えを返すことがあります。その違いこそが、原因の場所です。

ステップ

  1. /root/dnsディレクトリを作成し、/etc/resolv.confからnameserverで始まる行だけを/root/dns/nameserver.txtに保存してください。
  2. example.comのAレコードの値だけを/root/dns/a.txtに保存してください。ファイルには、IPv4アドレスが少なくとも1行必要です。
  3. google.comのMX、NS、TXTをそれぞれ/root/dns/mx.txt、/root/dns/ns.txt、/root/dns/txt.txtに保存してください。3つのファイルのどれも、空であってはいけません。
  4. example.comの回答セクションだけを出力して/root/dns/ttl1.txtに保存し、5秒以上待ってから同じ方法で/root/dns/ttl2.txtを作ってください。2回目のTTLが1回目より大きくてはいけません。
  5. 8.8.8.8の逆引きの結果を/root/dns/ptr.txtに保存してください。
  6. labhub-does-not-exist-9137.example.comを問い合わせ、出力全体を/root/dns/nxdomain.txtに保存してください。ファイルにstatus: NXDOMAINとSOAレコードの両方が入っている必要があります。
  7. /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つの結果は互いに異なっている必要があります。
  8. /root/dns/report.txtを次の5行で作成してください。 NAMESERVERS=<1번 파일의 줄 수> / A_COUNT=<2번 파일의 줄 수> / PTR=<5번에서 얻은 이름, 끝의 점 제외> / HOSTS_WINS=<7번 getent 결과의 IP> / DNS_SAYS=<7번 dig 결과의 첫 번째 IP>(プレースホルダーは順に、ステップ1のファイルの行数、ステップ2のファイルの行数、ステップ5で得た名前から末尾のドットを除いたもの、ステップ7のgetentの結果のIP、ステップ7のdigの結果の最初のIPです)

参考

リゾルバー設定を読む

/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.example.comを問い合わせ、出力全体を/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 <이름>はIPv6で先に問い合わせ、その答えがないときだけIPv4で聞き直します(プレースホルダーは名前です)。ところが、hostsに入れる行はIPv4の1つだけなので、その名前にAAAAレコードがあると、v6の問い合わせがhostsを素通りしてDNSに出ていき、IPv6アドレスが先に出ます。hostsが無視されたように見えますが、そうではありません。getent ahostsv4 <이름>でv4系だけを問い合わせれば、hostsの値がそのまま出ます(プレースホルダーは名前です)。このステップでは、そちらを使ってください。

問い合わせの総合レポート

/root/dns/report.txtを次の5行で作成してください。 NAMESERVERS=<1번 파일의 줄 수> / A_COUNT=<2번 파일의 줄 수> / PTR=<5번에서 얻은 이름, 끝의 점 제외> / HOSTS_WINS=<7번 getent 결과의 IP> / DNS_SAYS=<7번 dig 결과의 첫 번째 IP>(プレースホルダーは順に、ステップ1のファイルの行数、ステップ2のファイルの行数、ステップ5で得た名前から末尾のドットを除いたもの、ステップ7のgetentの結果のIP、ステップ7のdigの結果の最初のIPです)

前のステップの結果をキー=値としてまとめれば十分です。個数を数える項目は、行数で数えれば十分です。