技術ブログ
VMを用いた検証環境を運用していると、VMがだんだん増えていきます。 VMが増えるたびに/etc/hostsファイルをメンテナンスするのが面倒になってきたので、社内にDNSサーバを立てることにしました。
DNSサーバといえばBINDが一般的に使用されているようですが、 たかだかホスト名とIPアドレスの対応関係を管理するだけの用途には、 オーバースペックな気がします。(設定ファイルも書きにくい・・・。named.confとかゾーンファイルとか) このため、dnsmasqを使用しました。
dnsmasqの利点は以下の通り
社外ホストの名前解決を受付けることができるので、VMの/etc/resolv.confに 上位のDNSサーバのIPアドレスを記載する必要がなくなります。そうそうあることではありませんが、プロバイダの乗り換えの場合など、DNSサーバのIPアドレスが変更される場合があります。VMの/etc/resolv.confに 上位のDNSサーバのIPアドレスを記載していると・・・ 「VMサーバを起動 → /etc/resolv.confの修正」という作業を、全てのVMに対して行う必要があり、とーっても面倒です。
以下、メモの意味合いも含めて、書いておきます。
dnsmasqが導入されていない場合は、yum install dnsmasqで導入できます。コーソル検証環境では複数あるOracle VM Serverに導入しました。
注意! 本エントリでは、サポートされない手順について記載しています! ⇒ KROWN:158258 OracleVM 3 での Oracle VM Server コマンドラインから許可されている操作(※:参照にはサポート契約が必要)
設定ファイルは /etc/dnsmasq.conf です。
[root@csov3s01 ~]# cat /etc/dnsmasq.conf
# /etc/dnsmasq.conf
# Never forward plain names (without a dot or domain part)
domain-needed ←shorthostnameの名前解決要求を上位DNSサーバに転送しません
# Never forward addresses in the non-routed address spaces.
bogus-priv ←プライベートIPアドレスの逆引き要求を上位DNSサーバに転送しません
# Set this (and domain: see below) if you want to have a domain
# automatically added to simple names in a hosts-file.
expand-hosts ←domain=で指定されたドメイン名を補完します
# Set the domain for dnsmasq. this is optional, but if it is set, it
# does the following things.
# 1) Allows DHCP hosts to have fully qualified domain names, as long
# as the domain part matches this setting.
# 2) Sets the "domain" DHCP option thereby potentially setting the
# domain of all systems configured by DHCP
# 3) Provides the domain part for "expand-hosts"
domain=domain ←補完対象のドメイン名です
[root@csov3s01 ~]# vi /etc/hosts
:
# test
1.1.1.2 test.domain test
1.1.1.1 test.domain test
1.1.1.3 test.domain test
[root@csov3s01 ~]# service dnsmasq restart ← /etc/hostsファイル更新後はdnsmasqの再起動が必要です。
Shutting down dnsmasq: [ OK ]
Starting dnsmasq: [ OK ]
[root@csov3s01 ~]# dig @127.0.0.1 test.domain←自ホスト(127.0.0.1)のdnsmasqに名前解決要求します。
; <<>> DiG 9.3.6-P1-RedHat-9.3.6-20.P1.el5_8.5 <<>> @127.0.0.1 test.domain
; (1 server found)
;; global options: printcmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 41157
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 0
;; QUESTION SECTION:
;test.domain. IN A
;; ANSWER SECTION:
test.domain. 0 IN A 1.1.1.1←★
test.domain. 0 IN A 1.1.1.2
test.domain. 0 IN A 1.1.1.3
;; Query time: 0 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Fri Dec 7 10:42:29 2012
;; MSG SIZE rcvd: 77
[root@csov3s01 ~]# dig @127.0.0.1 test.domain
; <<>> DiG 9.3.6-P1-RedHat-9.3.6-20.P1.el5_8.5 <<>> @127.0.0.1 test.domain
; (1 server found)
;; global options: printcmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 54105
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 0
;; QUESTION SECTION:
;test.domain. IN A
;; ANSWER SECTION:
test.domain. 0 IN A 1.1.1.2←★
test.domain. 0 IN A 1.1.1.3
test.domain. 0 IN A 1.1.1.1
;; Query time: 0 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Fri Dec 7 10:42:30 2012
;; MSG SIZE rcvd: 77
[root@csov3s01 ~]# dig @127.0.0.1 test.domain
; <<>> DiG 9.3.6-P1-RedHat-9.3.6-20.P1.el5_8.5 <<>> @127.0.0.1 test.domain
; (1 server found)
;; global options: printcmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 20685
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 0
;; QUESTION SECTION:
;test.domain. IN A
;; ANSWER SECTION:
test.domain. 0 IN A 1.1.1.3←★
test.domain. 0 IN A 1.1.1.1
test.domain. 0 IN A 1.1.1.2
;; Query time: 0 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Fri Dec 7 10:42:31 2012
;; MSG SIZE rcvd: 77
名前解決要求のたびに、返されるIPアドレスのリストの順序が異なります。 DNSラウンドロビンが機能していることがわかります。
[root@csov3s01 ~]# dig @127.0.0.1 test
; <<>> DiG 9.3.6-P1-RedHat-9.3.6-20.P1.el5_8.5 <<>> @127.0.0.1 test
; (1 server found)
;; global options: printcmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 38992
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 0
;; QUESTION SECTION:
;test. IN A
;; ANSWER SECTION:
test. 0 IN A 1.1.1.3
test. 0 IN A 1.1.1.2
test. 0 IN A 1.1.1.1
;; Query time: 0 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Fri Dec 7 10:42:34 2012
;; MSG SIZE rcvd: 70
[root@csov3s01 ~]# dig @127.0.0.1 test
; <<>> DiG 9.3.6-P1-RedHat-9.3.6-20.P1.el5_8.5 <<>> @127.0.0.1 test
; (1 server found)
;; global options: printcmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 57857
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 0
;; QUESTION SECTION:
;test. IN A
;; ANSWER SECTION:
test. 0 IN A 1.1.1.2
test. 0 IN A 1.1.1.1
test. 0 IN A 1.1.1.3
;; Query time: 0 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Fri Dec 7 10:42:35 2012
;; MSG SIZE rcvd: 70
[root@csov3s01 ~]# dig @127.0.0.1 test
; <<>> DiG 9.3.6-P1-RedHat-9.3.6-20.P1.el5_8.5 <<>> @127.0.0.1 test
; (1 server found)
;; global options: printcmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 33658
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 0
;; QUESTION SECTION:
;test. IN A
;; ANSWER SECTION:
test. 0 IN A 1.1.1.1
test. 0 IN A 1.1.1.3
test. 0 IN A 1.1.1.2
;; Query time: 0 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Fri Dec 7 10:42:35 2012
;; MSG SIZE rcvd: 70
shorthostnameでもOKです。
[root@csov3s01 ~]# dig @127.0.0.1 -x 1.1.1.1 ←★ -xは逆引きの名前解決要求となります。
; <<>> DiG 9.3.6-P1-RedHat-9.3.6-20.P1.el5_8.5 <<>> @127.0.0.1 -x 1.1.1.1
; (1 server found)
;; global options: printcmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 52922
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0
;; QUESTION SECTION:
;1.1.1.1.in-addr.arpa. IN PTR
;; ANSWER SECTION:
1.1.1.1.in-addr.arpa. 0 IN PTR test.domain.←★
;; Query time: 0 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Fri Dec 7 10:47:58 2012
;; MSG SIZE rcvd: 63
[root@csov3s01 ~]# dig @127.0.0.1 -x 1.1.1.2
; <<>> DiG 9.3.6-P1-RedHat-9.3.6-20.P1.el5_8.5 <<>> @127.0.0.1 -x 1.1.1.2
; (1 server found)
;; global options: printcmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 46271
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0
;; QUESTION SECTION:
;2.1.1.1.in-addr.arpa. IN PTR
;; ANSWER SECTION:
2.1.1.1.in-addr.arpa. 0 IN PTR test.domain.←★
;; Query time: 0 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Fri Dec 7 10:48:06 2012
;; MSG SIZE rcvd: 63
[root@csov3s01 ~]# dig @127.0.0.1 -x 1.1.1.3
; <<>> DiG 9.3.6-P1-RedHat-9.3.6-20.P1.el5_8.5 <<>> @127.0.0.1 -x 1.1.1.3
; (1 server found)
;; global options: printcmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 50478
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0
;; QUESTION SECTION:
;3.1.1.1.in-addr.arpa. IN PTR
;; ANSWER SECTION:
3.1.1.1.in-addr.arpa. 0 IN PTR test.domain.←★
;; Query time: 0 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Fri Dec 7 10:48:09 2012
;; MSG SIZE rcvd: 63
digコマンドは yum install bind-util でインストールできます。 トラブルシュート目的には、nslookupよりも便利です。
VMにアクセスする可能性のあるクライアントPCのDNSサーバ設定に、dnsmasqを構成したサーバのIPアドレスを設定します。
一般に、従来設定していたDNSサーバ(以後"DNSサーバ(従来)"と記載)の設定は不要です。必要に応じて、dnsmasqがDNSサーバ(従来)との名前解決を行うからです。
[従来]
DNSサーバ(従来) ←── クライアントPC
DNSサーバ設定 = DNSサーバ(従来)のIPアドレス
[dnsmasq設定後]
DNSサーバ(従来) ←── dnsmasq導入サーバ ←── クライアントPC
DNSサーバ設定 = dnsmasq導入サーバのIPアドレス
/etc/hostsを編集したら、dnsmasqを再起動することで編集内容が反映されます。 もちろん、DNSサーバを冗長化している場合は、全サーバへ/etc/hostsを更新し、dnsmasqを再起動する必要があります。
vi /etc/hosts
scp /etc/hosts otherserver1:/etc/hosts
scp /etc/hosts otherserver2:/etc/hosts
/etc/init.d/dnsmasq restart
ssh otherserver1 /etc/init.d/dnsmasq restart
ssh otherserver2 /etc/init.d/dnsmasq restart