株式会社コーソル

コーソルDatabaseエンジニアのブログ

技術ブログ

VMの名前解決のためにdnsmasqを導入する

VMを用いた検証環境を運用していると、VMがだんだん増えていきます。 VMが増えるたびに/etc/hostsファイルをメンテナンスするのが面倒になってきたので、社内にDNSサーバを立てることにしました。

DNSサーバといえばBINDが一般的に使用されているようですが、 たかだかホスト名とIPアドレスの対応関係を管理するだけの用途には、 オーバースペックな気がします。(設定ファイルも書きにくい・・・。named.confとかゾーンファイルとか) このため、dnsmasqを使用しました。

dnsmasqの利点は以下の通り

  • 名前解決専用のデータベースのデータメンテナンスの必要がない。/etc/hosts の情報を名前解決のデータベースとして使用してくれます。
  • DNSラウンドロビンに対応しているので、SCAN用のDNSに使用できます。
  • 上位DNSとの連携が簡単で、内部DNS(イントラネット用DNS)として使用しやすい。/etc/resolv.confに上位ネットワークのDNSサーバのIPアドレスを指定しておくと、/etc/hostsで解決できない名前解決要求を上位DNSに委譲します。

社外ホストの名前解決を受付けることができるので、VMの/etc/resolv.confに 上位のDNSサーバのIPアドレスを記載する必要がなくなります。そうそうあることではありませんが、プロバイダの乗り換えの場合など、DNSサーバのIPアドレスが変更される場合があります。VMの/etc/resolv.confに 上位のDNSサーバのIPアドレスを記載していると・・・ 「VMサーバを起動 → /etc/resolv.confの修正」という作業を、全てのVMに対して行う必要があり、とーっても面倒です。

以下、メモの意味合いも含めて、書いておきます。

dnsmasqを導入

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 ←補完対象のドメイン名です

SCANへの応用を想定して構成

test.domainというホスト名に3つのIPアドレスを定義します。

[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よりも便利です。

クライアントPCのDNSサーバ設定を変更

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

プロフィール

On7tWW6m1Ul4

渡部 亮太

・Oracle ACE
・AWS Certified Solutions Architect - Associate
・ORACLE MASTER Platinum Oracle Database 11g, 12c 他多数

カテゴリー

アーカイブ