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 インストール
1
2
3
# yum -y install dnsmasq

# chkconfig dnsmasq on

Step 2. dnsmasq コンフィグ確認

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

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

/etc/dnsmasq.conf 確認
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
# 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 確認 (コメント・空行除外)
1
2
# cat /etc/dnsmasq.conf | grep -v "^#" | grep -v "^$"
※コメント・空行を除外すると何も出力されない (バージョンによって異なるかもしれません)

Step 3. dnsmasq コンフィグ設定

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

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

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

/etc/dnsmasq.conf
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
・・・

# 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 確認 (コメント・空行除外)
1
2
3
4
5
6
# 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 を登録します。

/etc/hosts
01
02
03
04
05
06
07
08
09
10
11
12
13
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 が表示されること
最終チェック
01
02
03
04
05
06
07
08
09
10
11
# 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.conf
1
2
# cat /etc/resolv.conf
(何も設定してないので、何も出力されない)

Step 6. dnsmasq サービス起動

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

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

dnsmasq サービス起動
1
2
# service dnsmasq start
Starting dnsmasq:                [  OK  ]
53番ポート LISTEN 状態確認
1
2
3
4
5
# 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.conf
1
2
search    my-local-domain.com
nameserver    192.168.20.200

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

/etc/hosts
1
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4

Step 2. 名前解決確認

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

nslookup で名前解決
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
# 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 で名前解決
1
2
3
4
5
6
7
8
# 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 サーバ構築(内部向け) でした。