Dnsmasq について

前回の記事で説明したように、Dnsmasq は、DNS サービスと DHCP、TFTP サービスを提供します。

DNS サーバがない時に、複数のサーバ間の連携が必要な場合には、各サーバの /etc/hosts に全てのサーバの FQDN を直接登録する必要がありました。

こういうときに DNS サーバがあると非常に便利ですが、一般的に良く使われている BIND を構築するのは、コンフィグ設定を含め、専門知識も必要そうだし、ささっとやりたいんだけどなんだか難しそう。。と思っている方も少なくないと思います。

やりたいのは、単純に名前解決さえできればいい。 難しそうな BIND を構築するまでもない時こそ Dnsmasq の出番です。

特に、ローカル環境内でのサーバ間の連携時に、プライベート仮想環境内で複数の仮想マシンを使って検証する際には、Dnsmasq が役立ちます。

System Configuration Diagram システム構成図

dnsmasq 内部向けdns

Dnsmasq 内部向け DNS

内部向けの軽量 DNS サーバ構築

今回は、以下の 2台のサーバを使って、内部向けの DNS サーバを構築します。

でも、実際に構築するのは、dns-server がメインで、dns-client は動作確認用です。

  • dns-client
  • dns-server
サーバ名IP アドレスFQDN
dns-client192.168.20.100dns-client.my-local-domain.com
dns-server192.168.20.200dns-server.my-local-domain.com

まずは、Dnsmasq を動かすための dns-server を構築した上で、/etc/hosts に FQDN リストを登録します。

そして、dns-client 側の /etc/resolv.conf にリゾルバを設定し、名前が引けるか(正引き・逆引き両方)確認するシンプルな流れにしたいと思います。

dns-client の FQDN について

大事なのは、dns-server 側の IP アドレスと FQDN です。

dns-client 側の IP アドレス 100番 と FQDN である dns-client.my-local-domain.com は、あまり意識しなくても大丈夫です。

DNS-SERVER 側

Step 1. dnsmasq インストール

yum で dnsmasq をインストールし、サービス登録を実施します。

dnsmasq : yum インストールRaw Code(S)Raw Code(T)
# yum -y install dnsmasq

# chkconfig dnsmasq on

Step 2. dnsmasq コンフィグ確認

dnsmasq をインストールするとデフォルトコンフィグファイルが配置されるので、コンフィグの中身を軽く確認しておきます。

ちなみに、デフォルトコンフィグの中身は、全てコメントアウトされています。

/etc/dnsmasq.conf 確認Raw Code(S)Raw Code(T)
# cat /etc/dnsmasq.conf
---------------------- ここから ----------------------
# Configuration file for dnsmasq.
#
# Format is one option per line, legal options are the same
# as the long options legal on the command line. See
# "/usr/sbin/dnsmasq --help" or "man 8 dnsmasq" for details.

・・・

# Never forward plain names (without a dot or domain part)
#domain-needed
# Never forward addresses in the non-routed address spaces.
#bogus-priva

・・・
---------------------- ここまで ----------------------
/etc/dnsmasq.conf 確認 (コメント・空行除外)Raw Code(S)Raw Code(T)
# cat /etc/dnsmasq.conf | grep -v "^#" | grep -v "^$"
(コメント・空行を除外して grep すると何も出力されない)

Step 3. dnsmasq コンフィグ設定

ここでは、dnsmasq をローカルネットワーク用の内部向け DNS サーバとして動かすための最低限の設定を実施します。

line: 18line: 37 にそれぞれドメイン名をフォーマットに合わせて設定してください。

以下の例では、ドメイン名として my-local-domain.com を指定しています。

/etc/dnsmasq.confRaw Code(S)Raw Code(T)
・・・

# Never forward plain names (without a dot or domain part)
#domain-needed
domain-needed

・・・

# Never forward addresses in the non-routed address spaces.
#bogus-priv
bogus-priv

・・・

# Add local-only domains here, queries in these domains are answered
# from /etc/hosts or DHCP only.
#local=/localnet/
local=/my-local-domain.com/

・・・

# Set this (and domain: see below) if you want to have a domain
# automatically added to simple names in a hosts-file.
#expand-hosts
expand-hosts

・・・

# 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=thekelleys.org.uk
domain=my-local-domain.com

・・・
/etc/dnsmasq.conf 確認 (コメント・空行除外)Raw Code(S)Raw Code(T)
# cat /etc/dnsmasq.conf | grep -v "^#" | grep -v "^$"
domain-needed
bogus-priv
local=/my-local-domain.com/
expand-hosts
domain=my-local-domain.com

Step 4. /etc/hosts に名前登録

待ちに待った名前登録設定です。

/etc/hosts に登録したいサーバの IP アドレス・FQDN・サーバ名を全て登録します。

また、dns-server 自身のIP アドレス・FQDN・サーバ名を必ず登録してください。 理由については、この後説明します。

以下の例では、10台のサーバ server01 ~ server10 を登録します。

127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
192.168.20.1    server01.my-local-domain.com server01
192.168.20.2    server02.my-local-domain.com server02
192.168.20.3    server03.my-local-domain.com server03
192.168.20.4    server04.my-local-domain.com server04
192.168.20.5    server05.my-local-domain.com server05
192.168.20.6    server06.my-local-domain.com server06
192.168.20.5    server07.my-local-domain.com server07
192.168.20.8    server08.my-local-domain.com server08
192.168.20.9    server09.my-local-domain.com server09
192.168.20.10    server10.my-local-domain.com server10
192.168.20.100    dns-client.my-local-domain.com dns-client
192.168.20.200    dns-server.my-local-domain.com dns-server

Step 5. 重要 : 最終チェック

dnsmasq サービスを開始する前に以下を必ずチェックしてください。

サーバ自身のマシン名が設定されていなかったり、/etc/hostsdns-server の FQDN が登録されていなかったり、各ドメイン名情報とホスト名が一致しない場合、サービス起動に失敗します。

  • dns-server 自身の IP アドレス確認
  • /etc/hosts に dns-server の IP と FQDN が登録されていること
  • /etc/sysconfig/network に dns-server の FQDN が設定されていること
  • hostname コマンドを実行したときに、dns-server の FQDN が表示されること
最終チェックRaw Code(S)Raw Code(T)
# ip addr | grep "inet" | fgrep -v '127.0.0.1'
inet 192.168.20.200/24 brd 192.168.20.255 scope global eth0

# cat /etc/hosts | fgrep '192.168.20.200'
192.168.20.200    dns-server.my-local-domain.com dns-server

# cat /etc/sysconfig/network | grep "HOSTNAME"
HOSTNAME=dns-server.my-local-domain.com

# hostname
dns-server.my-local-domain.com

ちなみに、リゾルバは特に何も設定していません。

/etc/resolv.confRaw Code(S)Raw Code(T)
# cat /etc/resolv.conf
(何も設定してないので、何も出力されない)

Step 6. dnsmasq サービス起動

最後に、以下のコマンドを実行し、dnsmasq サービスを開始します。

サービスが問題なく立ち上がったら 53番ポートが LISTEN 状態であることを確認してください。

dnsmasq サービス起動Raw Code(S)Raw Code(T)
# service dnsmasq start
Starting dnsmasq:                [  OK  ]
53番ポート LISTEN 状態確認Raw Code(S)Raw Code(T)
# netstat -anp | fgrep ':53'
tcp     0      0  0.0.0.0:53      0.0.0.0:*     LISTEN      5647/dnsmasq
tcp     0      0  :::53           :::*          LISTEN      5647/dnsmasq
udp     0      0  0.0.0.0:53      0.0.0.0:*                 5647/dnsmasq
udp     0      0  :::53           :::*                      5647/dnsmasq

LISTEN 状態について

上記の結果 0.0.0.0 は、検証のため全て受け付けるようになっています。

また、UDP ポートには、LISTEN というステータスが付きませんので、上記のような結果が出ていれば大丈夫です。

DNS-CLIENT 側

後は、dns-client 側でリゾルバのネームサーバとして dns-server の IP アドレスを設定した上で、名前が引けることを確認するために、nslookupdig コマンドを使って、正引き・逆引きを両方確認します。

Step 1. リゾルバ設定

リゾルバの検索ドメインに dns-server のドメイン名を。 ネームサーバとして dns-server の IP アドレスを設定します。

/etc/resolv.confRaw Code(S)Raw Code(T)
search    my-local-domain.com
nameserver    192.168.20.200

ちなみに、/etc/hosts は、特に何も設定していません。

/etc/resolv.confRaw Code(S)Raw Code(T)
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4

Step 2. 名前解決確認

最後に nslookupdig コマンドで名前が引けるかどうか確認します。

nslookup で名前解決Raw Code(S)Raw Code(T)
# nslookup server01
Server:         192.168.20.200
Address:        192.168.20.200#53

Name:   server01.my-local-domain.com
Address: 192.168.20.1


# nslookup server01.my-local-domain.com
Server:         192.168.20.200
Address:        192.168.20.200#53

Name:   server01.my-local-domain.com
Address: 192.168.20.1


# nslookup 192.168.20.1
Server:         192.168.20.200
Address:        192.168.20.200#53

1.20.168.192.in-addr.arpa       name = server01.my-local-domain.com.
dig で名前解決Raw Code(S)Raw Code(T)
# dig +short server01
192.168.20.1

# dig +short server01.my-local-domain.com
192.168.20.1

# dig +short -x 192.168.20.1
server01.my-local-domain.com.

終わりに

これでローカルネットワーク環境向けの軽量 DNS サーバが出来上がりました。

最後に補足で一点だけ。

/etc/hosts を修正したらサービス再起動

dns-server 側の /etc/hosts ファイルを編集した後、設定を反映するためには、dnsmasq サービスの再起動が必要です。

# service dnsmasq restart

以上、Dnsmasq 軽量 DNS サーバ構築(内部向け) でした。