💡

digコマンドオプション-fについて

2024/09/04に公開

DNSと触れていると、たまにこんな確認や依頼があります。

このゾーンに存在するレコードって、全部ちゃんと名前解決できてるの?

これはDNS移行をする際は特に気になる観点かと思います。
小規模であれば、一つ一つdigコマンドを発行して確認で良いと思いますが、
中には大量のレコードを抱えており、気が遠くなりそうな確認作業を要求されることもあります。スクリプトで対応するにしても様々なレコードタイプが混合しており、しかもドメイン名まして逆引きまである場合は様々なIPが存在して手間がかかります。

そこでオススメするのが、digコマンドに-fを使用するパターンです。
使用例は下記の通りです。

dig -f hogehoge.txt

hogehoge.txtは、絶対パスでもOKです。
また、+norec や +short など、digで扱うオプション各種も利用できます。

さて、気になるhogehoge.txtの中身ですが、このような形になっています。

example.com SOA
google.com NS
yahoo.com NS

つまり、-fを使うことでファイルに記載されているドメインに対して、求められているレコードタイプで名前解決の確認が出来ます。
勿論hogehoge.txtの中身は、逆引きでも可能です。

1.0.10.in-addr.arpa. SOA
1.0.10.in-addr.arpa. NS
1.1.0.10.in-addr.arpa. PTR

気が付いた方もいるかと思いますが逆引きの場合、10.0.1.0/24の逆引きであれば、ゾーンファイルの中身が下記のようなパターンも往々にしてあります。

1 IN PTR hogehoge
2 IN PTR hogehoge
3 IN PTR hogehoge

なにより、このhogehoge.txtを用意するのが大変なんだけど。
という可能性も十分にあります。その場合は、環境が限られますが次のコマンドを利用することも手です。

dig @プライマリネームサーバー hogehoge.com axfr

プライマリネームサーバとありますが、これはセカンダリ、つまりスレーブのDNSサーバからマスターのDNSサーバを指定して投入するコマンドです。
※スレーブサーバ以外から発行して返って来た場合は、セキュリティ設定がやばいので直しましょう。
このコマンドで投入すると、以下のような返りがあります。

【正引き】
; <<>> DiG 9.16.1-Ubuntu <<>> @ns1.example.com example.com axfr
; (1 server found)
;; global options: +cmd
example.com.        86400   IN      SOA     ns1.example.com. admin.example.com. 2023080101 3600 1800 1209600 86400
example.com.        86400   IN      NS      ns1.example.com.
example.com.        86400   IN      NS      ns2.example.com.
example.com.        86400   IN      A       192.0.2.1
www.example.com.    86400   IN      A       192.0.2.2
mail.example.com.   86400   IN      A       192.0.2.3
example.com.        86400   IN      MX      10 mail.example.com.
example.com.        86400   IN      TXT     "test"
example.com.        86400   IN      SOA     ns1.example.com. admin.example.com. 2023080101 3600 1800 1209600 86400
;; Query time: 52 msec
;; SERVER: 192.0.2.1#53(ns1.example.com)
;; WHEN: Wed Sep  6 12:00:00 UTC 2024
;; XFR size: 8 records (messages 1, bytes 321)

【逆引き】
; <<>> DiG 9.16.1-Ubuntu <<>> @ns1.example.com 1.0.10.in-addr.arpa. axfr
; (1 server found)
;; global options: +cmd
1.0.10.in-addr.arpa. 86400   IN      SOA     ns1.example.com. admin.example.com. 2023090101 3600 1800 1209600 86400
1.0.10.in-addr.arpa. 86400   IN      NS      ns1.example.com.
1.0.10.in-addr.arpa. 86400   IN      NS      ns2.example.com.
1.0.10.in-addr.arpa. 86400   IN      PTR     host1.example.com.
2.1.0.10.in-addr.arpa. 86400 IN      PTR     host2.example.com.
3.1.0.10.in-addr.arpa. 86400 IN      PTR     host3.example.com.
4.1.0.10.in-addr.arpa. 86400 IN      PTR     host4.example.com.
1.0.10.in-addr.arpa. 86400   IN      SOA     ns1.example.com. admin.example.com. 2023090101 3600 1800 1209600 86400
;; Query time: 52 msec
;; SERVER: 192.0.2.1#53(ns1.example.com)
;; WHEN: Wed Sep  6 12:00:00 UTC 2024
;; XFR size: 8 records (messages 1, bytes 321)

※嬉しい事に、axfrはBIND特有であるGENERATEにも対応しており、しっかり分解された形で表示されます。
出力結果をあとは適当なテキストエディタへペーストして、置換や範囲選択でそぎ落とし、先述したhogehoge.txtのような内容にするという形です。

注意点としては、もしスクリプトでdig -fを使用する場合、大体の場合は返りが莫大であるために
レスポンスの有無でジャッジさせ、視認性を良くするために返りがない場合だけエラー表示、正常なときは何も出力しない、
などを想定することが多いかと思います。しかしながら、このコマンドはhogehoge.txtの行ごとにdigを発行しているのではなく、
あくまで一纏めで行っているため、例えばhogehoge.txtの中で名前解決を失敗しているものを検知したい場合は、
grepやdigのオプションによって出力する項目をフィルタリングするなど、もう一工夫必要となります。

-fは案外ネット上のdigコマンドオプション一覧などでも、記載がない場合が多いので
何かの時に覚えておくと、意外なところで役に立つかもしれません。

Discussion