Help us understand the problem. What is going on with this article?

DNSラウンドロビンなレコードの正引き->逆引き->各ホストのFQDN -> 各ホストのFQDNの正引き をdigでサクっと取得する

DNSラウンドロビンなレコードの正引き->逆引き->各ホストのFQDN -> 各ホストのFQDNの正引き をdigでサクっと取得する

この記事を3行で

  • digで逐一ホストdigしてた方向け
  • dig +short $DOMAIN_NAME | xargs -L1 dig +short -x | xargs -L1 dig +short をshellで叩くと表題の結果を取得出来る
  • ↑の途中経過を見たい場合(レコード間違い等を確認したい場合)、dig +short $DOMAIN_NAME | tee /dev/tty | xargs -L1 dig +short -x | tee /dev/tty | xargs -L1 dig +short | sort

1. こんなときに使えます: 今回は後者を例にします

  • 「既存のWebサーバ群に新しくWebサーバを追加したい! DNSラウンドロビンなドメイン名に1IP追加して、それぞれ正引きした結果と、その結果を更に逆引きした値を出して!」
  • 「Elasticsearchのクラスタを組む為、Nodeを11台作った!社内DNSにそれぞれのNodeの正逆レコードを書いた!各NodeのFQDNを包括したDNSラウンドロビンレコードも書いた!じゃあそれぞれ正しく正逆レコード記載できてるかちょっと確認して証跡残せるようにして!」
  • 今回は後者のElasticsearchを例にします。

2. いつもなら1台ずつdigってる場合

  1. 例えば、↓な感じでzoneファイルを書いたとして...
  • 正引きzone(example.com)
elasticsearch-node     IN  A   192.168.10.100
elasticsearch-node     IN  A   192.168.10.101
elasticsearch-node     IN  A   192.168.10.102
elasticsearch-node     IN  A   192.168.10.103
elasticsearch-node     IN  A   192.168.10.104
elasticsearch-node     IN  A   192.168.10.105
elasticsearch-node     IN  A   192.168.10.106
elasticsearch-node     IN  A   192.168.10.107
elasticsearch-node     IN  A   192.168.10.108
elasticsearch-node     IN  A   192.168.10.109
elasticsearch-node     IN  A   192.168.10.110                                                                                           

elasticsearch-node-00  IN  A   192.168.10.100                                                                                           
elasticsearch-node-01  IN  A   192.168.10.101
elasticsearch-node-02  IN  A   192.168.10.102
elasticsearch-node-03  IN  A   192.168.10.103
elasticsearch-node-04  IN  A   192.168.10.104
elasticsearch-node-05  IN  A   192.168.10.105
elasticsearch-node-06  IN  A   192.168.10.106
elasticsearch-node-07  IN  A   192.168.10.107
elasticsearch-node-08  IN  A   192.168.10.108
elasticsearch-node-09  IN  A   192.168.10.109
elasticsearch-node-10  IN  A   192.168.10.110
  • 逆引きzone(0.10.168.192.in-addr.arpa.相当)
100     IN      PTR   elasticsearch-node-00.example.com
101     IN      PTR   elasticsearch-node-01.example.com  
102     IN      PTR   elasticsearch-node-02.example.com  
103     IN      PTR   elasticsearch-node-03.example.com  
104     IN      PTR   elasticsearch-node-04.example.com  
105     IN      PTR   elasticsearch-node-05.example.com  
106     IN      PTR   elasticsearch-node-06.example.com  
107     IN      PTR   elasticsearch-node-07.example.com  
108     IN      PTR   elasticsearch-node-08.example.com  
109     IN      PTR   elasticsearch-node-09.example.com  
110     IN      PTR   elasticsearch-node-10.example.com 

A. 取り敢えず集合名でdigして...

$ dig elasticsearch-node.example.com
; <<>> DiG 9.9.4-RedHat-9.9.4-73.el7_6 <<>> elasticsearch-node.example.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 49565
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;elasticsearch-node.example.com          IN      A

;; ANSWER SECTION:
elasticsearch-node.example.com.  600     IN  A   192.168.10.100                                                                         
elasticsearch-node.example.com.  600     IN  A   192.168.10.101
elasticsearch-node.example.com.  600     IN  A   192.168.10.102
elasticsearch-node.example.com.  600     IN  A   192.168.10.103
elasticsearch-node.example.com.  600     IN  A   192.168.10.104
elasticsearch-node.example.com.  600     IN  A   192.168.10.105
elasticsearch-node.example.com.  600     IN  A   192.168.10.106
elasticsearch-node.example.com.  600     IN  A   192.168.10.107
elasticsearch-node.example.com.  600     IN  A   192.168.10.108
elasticsearch-node.example.com.  600     IN  A   192.168.10.109
elasticsearch-node.example.com.  600     IN  A   192.168.10.110      

B. 正引きでIPアドレスが返って来たので、dig -x で1台ずつ逆引きしてホスト名確認して...

$ dig -x 192.168.10.100
; <<>> DiG 9.9.4-RedHat-9.9.4-73.el7_6 <<>> -x 192.168.10.100
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 29433
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;100.10.168.192.in-addr.arpa.    IN      PTR

;; ANSWER SECTION:
100.10.168.192.in-addr.arpa. 600 IN      PTR     elasticsearch-node-00.example.com

C. IPアドレスと一致してるからOK! じゃあ続いてelasticsearch-node-01 を...

と、1台ずつホスト名関連付けを行っている人向けのコマンドをお教えします。

3. とりあえずdig +short

ご存知の方も居らっしゃると思いますが、digのオプションとして、 +short を与えるとIPアドレス/FQDNのみ返ってくるようになります。

$ dig +short dig elasticsearch-node.example.com
192.168.10.100
192.168.10.101
192.168.10.102
192.168.10.103
192.168.10.104
192.168.10.105
192.168.10.106
192.168.10.107
192.168.10.108
192.168.10.109
192.168.10.110
$ dig +short -x 192.168.10.100
elasticsearch-node-00.example.com

これらを組み合わせれば上手く取得できそうな気がしてきます。

4. xargs -L1dig -x

ラウンドロビンレコードを正引きしてsortした結果を、xargs-L オプションを使って行単位でdig -x していきます。

sortする理由は、ラウンドロビンレコードを都度digった時に順番が前後する為です。

xargs と オプションについてはこちら 等々ご参照下さい
https://www.atmarkit.co.jp/ait/articles/1801/19/news014.html

今回はdig +short elasticsearch-node.example.com の結果を1行ずつdig -x してあげれば良いので、実行コマンドは↓になります。

$ dig +short elasticsearch-node.example.com | sort
192.168.10.100
192.168.10.101
192.168.10.102
192.168.10.103
192.168.10.104
192.168.10.105
192.168.10.106
192.168.10.107
192.168.10.108
192.168.10.109
192.168.10.110

$ dig +short elasticsearch-node.example.com | sort |xargs -L1 dig +short -x
elasticsearch-node-00.example.com
elasticsearch-node-01.example.com
elasticsearch-node-02.example.com
elasticsearch-node-03.example.com
elasticsearch-node-04.example.com
elasticsearch-node-05.example.com
elasticsearch-node-06.example.com
elasticsearch-node-07.example.com
elasticsearch-node-08.example.com
elasticsearch-node-09.example.com
elasticsearch-node-10.example.com

$ dig +short elasticsearch-node.example.com | sort | xargs -L1 dig +short -x | sort | xargs -L1 dig +short 
192.168.10.100
192.168.10.101
192.168.10.102
192.168.10.103
192.168.10.104
192.168.10.105
192.168.10.106
192.168.10.107
192.168.10.108
192.168.10.109
192.168.10.110

これで上手いこと取れましたね。
もし、dig +short elasticsearch-node.example.com | sort | xargs -L1 dig +short -x | xargs -L1 dig +short の出力が想定と異なった場合、ラウンドロビン正引きレコード/ホスト正引きレコード/ホスト逆引きレコードのどこかで記載間違いをしている(==NXDOMAINになっているレコードがある)ことが想定されるため、どこかしら設定を見直す必要があることを検知できます。

5. どこかしら設定を見直す為の途中経過も見たい

間のdigの結果をターミナルにも出力させましょう。適宜tee /dev/tty と を噛ませることで確認可能です。

$ dig +short elasticsearch-node.example.com | sort | tee /dev/tty | xargs -L1 dig +short -x | tee /dev/tty | xargs -L1 dig +short | sort
192.168.10.100
192.168.10.101
192.168.10.102
192.168.10.103
192.168.10.104
192.168.10.105
192.168.10.106
192.168.10.107
192.168.10.108
192.168.10.109
192.168.10.110
elasticsearch-node-00.example.com
elasticsearch-node-01.example.com
elasticsearch-node-02.example.com
elasticsearch-node-03.example.com
elasticsearch-node-04.example.com
elasticsearch-node-05.example.com
elasticsearch-node-06.example.com
elasticsearch-node-07.example.com
elasticsearch-node-08.example.com
elasticsearch-node-09.example.com
elasticsearch-node-10.example.com
192.168.10.100
192.168.10.101
192.168.10.102
192.168.10.103
192.168.10.104
192.168.10.105
192.168.10.106
192.168.10.107
192.168.10.108
192.168.10.109
192.168.10.110

これで最初の10行(ラウンドロビンレコード) と最後の10行(sort済の各ホストFQDNの正引き結果)が一致している為、正しく設定ができている、ということが分かりました。

6. 実践

実在するレコードで試してみましょう。 今回はラウンドロビンレコードが良い感じに存在するaolさんを措かりさせていただきます(問題があれば消します。。)。

$ dig +short aol.com | sort
106.10.218.150
124.108.115.87
188.125.72.165
66.218.87.12
67.195.231.10

$ dig +short aol.com | sort | tee /dev/tty | xargs -L1 dig +short -x | sort  | tee /dev/tty | xargs -L1 dig +short | sort
106.10.218.150
124.108.115.87
188.125.72.165
66.218.87.12
67.195.231.10
w2.src4.vip.bf1.yahoo.com.
w2.src4.vip.gq1.yahoo.com.
w2.src4.vip.ir2.yahoo.com.
w2.src4.vip.sg3.yahoo.com.
w2.src4.vip.tw1.yahoo.com.
106.10.218.150
124.108.115.87
188.125.72.165
66.218.87.12
67.195.231.10

これで最初の5行(ラウンドロビンレコード) と最後の5行(sort済の各ホストFQDNの正引き結果)が一致している為、正しく設定ができている、ということが分かりました。

7. おわりに

おそらくもう少しスマートな確認方法が存在すると思いますので、ご存知のかたがいらっしゃればご教示お願いします。。

chatagiri
おうちサーバのおうちgitlabに篭っています
iwate-pu
岩手県滝沢市にある公立大学です。Qiitaではソフトウェア情報学部生や出身の人が多いです。
https://www.iwate-pu.ac.jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away