Posted at

dnsmasqを使った内部用DNSサーバの構築


目的

小規模の内部用(プライベート)用のDNSをお手軽に立てたいので、dnsmasqを使用することにしました。

dnsmasqは主に以下の機能があります。


  • 簡易DNS機能

  • DHCP機能

今回は使用しないのでDNCP機能はOFF。


dnsmasqの利点


  • ホストファイル(形式のファイル)でDNSの設定ができる

  • 設定がお手軽


環境

CentOS 7

# cat /etc/redhat-release 

CentOS Linux release 7.5.1804 (Core)


インストール

# yum -y install dnsmasq

詳細を見る限りはPXE boot用のサーバも立てれそうですね。

# rpm -qi dnsmasq

Name : dnsmasq
Version : 2.76
Release : 5.el7
Architecture: x86_64
Install Date: 2018年10月22日 21時48分16秒
Group : System Environment/Daemons
Size : 599747
License : GPLv2 or GPLv3
Signature : RSA/SHA256, 2018年04月25日 19時57分38秒, Key ID 24c6a8a7f4a80eb5
Source RPM : dnsmasq-2.76-5.el7.src.rpm
Build Date : 2018年04月11日 09時53分22秒https://www.netflix.com/watch/80193444?trackId=14170044&tctx=0%2C0%2Ca10330a1-1690-4222-b019-31df947e3cd0-821344456%2C92037450-d886-4632-88e7-6f886e47e33b_32240913X19XX1541076134697%2C92037450-d886-4632-88e7-6f886e47e33b_ROOT
Build Host : x86-01.bsys.centos.org
Relocations : (not relocatable)
Packager : CentOS BuildSystem <http://bugs.centos.org>
Vendor : CentOS
URL : http://www.thekelleys.org.uk/dnsmasq/
Summary : A lightweight DHCP/caching DNS server
Description :
Dnsmasq is lightweight, easy to configure DNS forwarder and DHCP server.
It is designed to provide DNS and, optionally, DHCP, to a small network.
It can serve the names of local machines which are not in the global
DNS. The DHCP server integrates with the DNS server and allows machines
with DHCP-allocated addresses to appear in the DNS with names configured
either in each host or in a central configuration file. Dnsmasq supports
static and dynamic DHCP leases and BOOTP for network booting of diskless
machines.


設定ファイル

dnsmasqの設定ファイルの主な設定箇所は以下です。

今回はhostsファイルを直接使わずに、別のファイルを用意するやり方です。


/etc/dnsmasq.conf

port=53

# -> Port番号設定
no-hosts
# -> デフォルトの /etc/hosts をDNSのレコードとして使用しない
addn-hosts=/etc/hosts-dnsmasq
# -> 読み込むホストファイルを指定
expand-hosts
# -> ドメイン名を自動的に付加する
domain=icebird.local
# -> ローカルのドメイン名を設定する
domain-needed
# -> 外部のDNSへ問い合わせをする場合は、ホスト名では問い合わせない
bogus-priv
# -> プライベートIPアドレスの逆引を上位のDNSへ問い合わせない(無駄なので)


ホストファイル


/etc/hosts-dnsmasq

192.168.1.200 dns



サービス起動

systemctl start dnsmasq

systemctl enable dnsmasq

firewalld はポートに合わせて適切に設定しておいてね。


設定の更新

ホストファイルや設定ファイルを更新した場合は、reloadで反映されます。



systemctl restart dnsmasq


名前解決確認


dig結果

# dig @localhost dns 

; <<>> DiG 9.9.4-RedHat-9.9.4-61.el7 <<>> @localhost dns
; (2 servers found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 62888
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;dns. IN A

;; ANSWER SECTION:
dns. 0 IN A 192.168.1.200

;; Query time: 0 msec
;; SERVER: ::1#53(::1)
;; WHEN: 木 11月 01 23:09:54 JST 2018
;; MSG SIZE rcvd: 48

# dig @localhost dns.icebird.local

; <<>> DiG 9.9.4-RedHat-9.9.4-61.el7 <<>> @localhost dns.icebird.local
; (2 servers found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 10675
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;dns.icebird.local. IN A

;; ANSWER SECTION:
dns.icebird.local. 0 IN A 192.168.1.200

;; Query time: 0 msec
;; SERVER: ::1#53(::1)
;; WHEN: 木 11月 01 23:10:20 JST 2018
;; MSG SIZE rcvd: 62



インターネット上のドメイン名を名前解決した結果

デフォルトでは /etc/resolv.conf を読み込みこみ、そのDNSサーバへForwardします。

# dig @localhost www.google.com

; <<>> DiG 9.9.4-RedHat-9.9.4-61.el7 <<>> @localhost www.google.com
; (2 servers found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 1018
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;www.google.com. IN A

;; ANSWER SECTION:
www.google.com. 250 IN A 172.217.161.68

;; Query time: 10 msec
;; SERVER: ::1#53(::1)
;; WHEN: 木 11月 01 23:10:34 JST 2018
;; MSG SIZE rcvd: 59


tcpdumpでパケットの確認

実際に dnsmsq がどう名前解決しているのか調べてるためにパケットキャプチャを採取します。

tcpdumpコマンドを流しながらdigコマンドを使用してください。


tcpdump

# tcpdump -n -i any dst port 53 

23:24:01.264241 IP6 ::1.58302 > ::1.domain: 380+ [1au] A? www.google.com. (43)
23:24:01.264336 IP6 2408:10:96ae:ac00:9190:32a5:3fda:ab3.19769 > 2408:10:96ae:ac00:225:dcff:fe3a:fd22.domain: 61678+ [1au] A? www.google.com. (43)


dig

# dig @localhost www.google.com

; <<>> DiG 9.9.4-RedHat-9.9.4-61.el7 <<>> @localhost www.google.com
; (2 servers found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 380
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;www.google.com. IN A

;; ANSWER SECTION:
www.google.com. 286 IN A 172.217.161.68

;; Query time: 13 msec
;; SERVER: ::1#53(::1)
;; WHEN: 木 11月 01 23:24:01 JST 2018
;; MSG SIZE rcvd: 59


OSの/etc/resolv.confの設定は以下です。

設定されたアドレスに問い合わせていますね。


/etc/resolv.conf

...

nameserver 2408:10:96ae:ac00:225:dcff:fe3a:fd22