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