digコマンドをスクリプトで効率化!

はじめに
こんにちは、エンジニア3年目の kita です。
ドメインの設定確認などに使用されることが多い dig(Domain Information Groper)コマンドについて、皆さんはどのように普段使用していますか?
今回はスクリプトを活用した dig コマンドの効率化術について紹介したいと思います!
dig コマンド
改めてですが dig(Domain Information Groper)コマンドとは、DNSサーバーに対して「このドメインのIPアドレスを教えて」「メールサーバーはどこ?」といった問い合わせを行う、インフラエンジニアにとって必須の便利なツールです。
※dig コマンドについては弊社ブログでも既にご紹介しておりますので、よろしければご覧ください!
dig コマンドは便利な反面下記 2 点のような壁も存在します、、
1.型指定の限界:
dig は 1 回の実行で 1 種類のレコードタイプしか問い合わせできない仕様のため、「dig ドメイン A MX 」のように並べても、実際に問い合わせられるのは最後に指定された MX レコードのみです。
そのため、複数の種類を確認したい場合は、タイプごとに個別に実行する必要があります。
2.ANYクエリの形骸化:
以前は「dig beyondjapan.com ANY 」のように指定することで、そのドメインに設定されている複数のレコードをまとめて取得できました。
しかし現在は、Internet Engineering Task Force が策定した RFC8482 の影響により、ANY クエリに対しては最小限の応答のみを返す実装が一般的になっています。
【ANYの失敗例】
beyondjapan.com. 3600 IN HINFO "RFC8482" ""
※ HINFO "RFC8482" は、「一括回答はしないので個別リクエストしてください」というサーバー側からの拒否回答
スクリプトによる自動連続クエリ
dig コマンドにおいて一括で取得できないとなると、本来は手動で何度もコマンドを打ち込む必要があります。
しかし、これは検索対象のレコードが増えるほど手間がかかり、確認漏れなどのミスも起きやすくなってしまいます。
そこで今回は、手動で何度もコマンドを打ち直す手間を省き、複数のレコードを一気に且つ正確に取得する方法として、「調査項目(txt)」と「実行プログラム(スクリプト)」をわけて実行する活用術を紹介いたします!
スクリプト実施方法
① 調査したいレコードのリストを作成
まず、ご自身の適当なローカル環境にて(Ubuntu / WSLなど)対象ドメインの調べたいレコード型を一行ずつ記述したテキストファイル(records.txt)を作成するディレクトリ配下に移動後下記の通り用意します。
vi records.txt
■ records.txt 中身
A MX TXT NS
② 実行用スクリプトを作成
次に、上記のリスト(records.txt)を自動で読み込んで dig を連続実行するスクリプト(dig-check.sh)を作成します。
※ records.txt と dig-check.sh はスクリプト内で records.txt をファイル名のみ今回指定して作成するため、読み込みエラー(ファイルが見つからない)防止のため同じディレクトリ配下内に作成してください!
vi dig-check.sh
■ dig-check.sh 中身
#!/bin/bash DOMAIN=$1 # ドメイン名が指定されていない場合はエラーを表示 if [ -z "$DOMAIN" ]; then echo "使用法: ./dig-check.sh [ドメイン名]" exit 1 fi echo "--- Domain: $DOMAIN ---" # records.txt を一行ずつ読み込んで実行 while read type; do # 空行があればスキップ [ -z "$type" ] && continue echo "[$type Record]" dig $DOMAIN $type +short echo "" done < records.txt
③スクリプトに実行権限を与える
②で作成したスクリプト(dig-check.sh)は、まだ「実行して良いファイル」として認識されていません。
■作成後のスクリプト(dig-check.sh)のパーミッション状態
-rw-r--r-- 1 root root 453 Feb 26 17:59 dig-check.sh
以下のコマンドを打って、権限を与えます。
chmod +x dig-check.sh
■調整後のスクリプト(dig-check.sh)のパーミッション状態
-rwxr-xr-x 1 root root 453 Feb 26 17:59 dig-check.sh
※records.txt はテキストファイルなので、この操作は不要です。
テキストファイル(records.txt): スクリプトが中身を「読む」だけなので、標準的な権限(-rw-r--r--)があれば動作可能。
スクリプトファイル(dig-check.sh):OS に「これはプログラムとして動かしていいよ」と許可(+x:実行権限)を与える必要があるため、権限設定が必要となります。
④ドメインを指定して実行
今回は「example.com」を例に実行してみます。
これで、records.txt に書いた項目がスクリプトによって一括で出力されるため短縮した時間でに設定確認が可能です!
※ ./ は「現在のディレクトリにあるファイルを実行する」という意味ですので、別のディレクトリにいる場合は対象ディレクトリに移動してから実行してください。
./dig-check.sh example.com
■出力結果
--- Domain: example.com --- [A Record] 104.18.27.120 104.18.26.120 [MX Record] 0 . [TXT Record] "v=spf1 -all" "_k2n1y4vw3qtb4skdx9e7dxt97qrmmq9" [NS Record] elliott.ns.cloudflare.com. hera.ns.cloudflare.com.
スクリプト実行による注意点
今回ご紹介したスクリプトによる一括取得は、あくまで「records.txt に記載した項目」を順番に確認するツールとなります。そのため、便利な反面、下記 2 点にはご注意ください!
■未知のレコードは見つけられない:
例えば、records.txt に「 A / MX 」しかリストに入れていない場合は、対象ドメインに TXT レコードが設定されていても、表示されることはありません。
■「登録されているものすべて」を確認できるわけではない:
DNS の仕組み上、サーバー側から「設定されているレコード一覧」を完全に取得することは困難です。
そのためこの手法は、「何が登録されているか分からない状態から全設定を取得する」ためのものではなく、あらかじめ指定した複数のレコードを、手動よりも速く・正確に確認するための方法です。
おわりに
「1つずつコマンドを打っていた」 dig コマンドでの複数の設定確認作業も、txt ファイルとスクリプトを分けるという少しの工夫で、手動実行による確認漏れなどのヒューマンエラーの防止と大幅な時短に繋がります!
今回は1つのドメインに対しての複数の設定確認を例としてご紹介いたしましたが、実務では「管理している10個のドメインすべてをチェックしたい」という場面もあるかと思います。
その場合は、さらにドメインリスト(domains.txt)を用意して、スクリプトを二重のループにすることで対応可能です。
詳細な紹介は次の機会にご紹介できればと思います!
本記事が皆様のお役に立てれば幸いです。
最後までお読みいただきありがとうございました。
5