PR

Linux Dnsmasqで簡単にDNSサーバを構築する手順

スポンサーリンク
Linux

DNSサーバソフトウェアと言えばBINDだと思いますが、BINDの導入と運用は非常に面倒です。

そこで今回はシンプルで管理も簡単なDNSサーバーソフトウェアDnsmasqを紹介します。

Dnsmasqについて

Dnsmasqは比較的簡単に設定・構築が可能なDNSサーバソフトウェアです。

小規模なネットワーク用途での軽量なソフトウェアで、ほとんどのLinuxディストリビューションに標準で含まれています。

今回インストールするOS

今回はCentOS7.6にインストールします。

[root@cent76 ~]# cat /etc/centos-release
CentOS Linux release 7.6.1810 (Core)

Dnsmasqのインストール

yumコマンドでdnsmasqをインスールします。

[root@cent76 local]# yum install dnsmasq
Loaded plugins: fastestmirror, langpacks
Loading mirror speeds from cached hostfile
 * c7-media:
Resolving Dependencies
--> Running transaction check
---> Package dnsmasq.x86_64 0:2.76-7.el7 will be installed
--> Finished Dependency Resolution

Dependencies Resolved

========================================================================================================================
 Package                    Arch                      Version                         Repository                   Size
========================================================================================================================
Installing:
 dnsmasq                    x86_64                    2.76-7.el7                      c7-media                    278 k

Transaction Summary
========================================================================================================================
Install  1 Package

Total download size: 278 k
Installed size: 586 k
Is this ok [y/d/N]: y
Downloading packages:
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  Installing : dnsmasq-2.76-7.el7.x86_64                                                                            1/1
  Verifying  : dnsmasq-2.76-7.el7.x86_64                                                                            1/1

Installed:
  dnsmasq.x86_64 0:2.76-7.el7

Complete!

Dnsmasqの設定

デフォルトの設定ファイルをバックアップ

念の為デフォルトの設定ファイルをバックアップします。

[root@cent76 ~]# mv /etc/dnsmasq.conf /etc/dnsmasq.conf.default

DNSクエリログの出力先ディレクトリを作成

[root@cent76 ~]# mkdir -p /var/log/dnsmasq

dnsmasq.conf 設定

以下は小規模システムで使用する際の一般的な設定例です。

[root@cent76 ~]# vi /etc/dnsmasq.conf
no-hosts
addn-hosts=/etc/hosts_dnsmasq
log-queries
log-facility=/var/log/dnsmasq/dnsmasq.log
port=53
bogus-priv
resolv-file=/etc/dnsmasq_resolv.conf
strict-order
domain-needed
cache-size=0

設定の説明

no-hosts サーバ上の/etc/hostsで名前解決をさせない
addn-hosts=/etc/hosts_dnsmasq hosts解決をするファイルを指定(サーバ上の/etc/hosts以外のファイル)
log-querie DNSクエリに対してのログを出力する
log-facility=/var/log/dnsmasq/dnsmasq.log ログの出力場所
port=53 Dnsmasqがlistenするポート
bogus-priv プライベートIPアドレス(192.168.x.x, etc)の逆引きを上位DNSサーバに転送せずに「no such domain」で返す
resolv-file=/etc/dnsmasq_resolv.conf 上位DNSの指定ファイル。自分で名前解決が出来ない時にこれに指定しているIPに問い合わせする
strict-order resolv-fileに指定しているIPを上から順番に問い合わせする
domain-needed ドメインの無いホストで問い合わせがあった際に上位DNSサーバに転送しない
cache-size=0 dnsmasqでキャッシュするレコード数。0にするとキャッシュしない

上位DNSの設定

今回は 8.8.8.8(GoogleのパブリックDNS)にしています。

[root@cent76 local]# vi /etc/dnsmasq_resolv.conf
nameserver 8.8.8.8

DNSレコードの設定

名前解決させたいIPを設定します。今回はテキトーなIP2つを設定します。

[root@cent76 local]# vi /etc/hosts_dnsmasq
200.200.200.200 dekirudekiru.com
200.200.200.201 dekinaidekinai.com

自動起動設定

[root@cent76 local]# systemctl enable dnsmasq.service
Created symlink from /etc/systemd/system/multi-user.target.wants/dnsmasq.service to /usr/lib/systemd/system/dnsmasq.service.
[root@cent76 local]# systemctl list-unit-files -t service |grep dnsmasq
dnsmasq.service                               enabled

Dnsmasqの起動

[root@cent76 local]# systemctl start dnsmasq.service
[root@cent76 local]# systemctl status dnsmasq.service
* dnsmasq.service - DNS caching server.
   Loaded: loaded (/usr/lib/systemd/system/dnsmasq.service; enabled; vendor preset: disabled)
   Active: active (running) since Mon 2020-01-19 11:03:36 JST; 2s ago
 Main PID: 18068 (dnsmasq)
   CGroup: /system.slice/dnsmasq.service
           `-18068 /usr/sbin/dnsmasq -k

Jan 19 11:03:36 cent76 systemd[1]: Started DNS caching server..
Jan 19 11:03:36 cent76 dnsmasq[18068]: started, version 2.76 cachesize 150
Jan 19 11:03:36 cent76 dnsmasq[18068]: compile time options: IPv6 GNU-getopt DBus no-i18n IDN DHCP DHCPv6 no-Lu...notify
Jan 19 11:03:36 cent76 dnsmasq[18068]: no servers found in /etc/resolv.conf, will retry
Jan 19 11:03:36 cent76 dnsmasq[18068]: read /etc/hosts - 2 addresses
Hint: Some lines were ellipsized, use -l to show in full.

DNSクライアント(別ホスト)から名前解決を実行

DNSクライアントのresolv.confに、DnsmasqをインストールしたサーバのIPを設定します。

[root@dekisrv ~]# vi /etc/resolv.conf
nameserver 192.168.56.102

DNSクライアントからnslookupで名前を引いてみます。

[root@dekisrv ~]# nslookup dekirudekiru.com
Server:         192.168.56.102
Address:        192.168.56.102#53

Name:   dekirudekiru.com
Address: 200.200.200.200
** server can't find dekirudekiru.com: REFUSED

[root@dekisrv ~]# nslookup dekinaidekinai.com
Server:         192.168.56.102
Address:        192.168.56.102#53

Name:   dekinaidekinai.com
Address: 200.200.200.201
** server can't find dekinaidekinai.com: REFUSED

今回設定したDNSレコード(dekirudekiru.com/dekinaidekinai.com)は存在しないドメイン名なので、「server can’t find」が返ってきていますが、Address: 200.200.200.200/Address: 200.200.200.201が返却されているので、DNSサービスは正常に動作・応答しています。

firewalldでDNSポート53番が開放されていない場合

firewalldが有効で、かつデフォルト設定の場合はDNSポート53が開放されていないので、開放します。

現在割り当てられているzoneを確認

以下の例ではpublicゾーンが割当たっています。

[root@cent76 ~]# firewall-cmd --get-active-zones
public
  interfaces: enp0s8

publicゾーンにdnsサービス(port 53)を追加

–permanentオプションは永続的な設定です。

[root@cent76 ~]# firewall-cmd --add-service=dns --zone=public --permanent
success

firewalldをリロード

[root@cent76 ~]# firewall-cmd --reload
success

publicゾーンに設定されているサービスを確認

dnsが追加されていれば完了です。

[root@cent76 ~]# firewall-cmd --list-services --zone=public
ssh dhcpv6-client dns