digコマンドオプション-fについて
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