今回はCentOS 8 でBINDを使用してDNSサーバを構築してみます。
細かいことは気にせずDNSリクエストに応答するサーバを構築することをゴールとします。
※CentOS 8 のインストールから始める方はまずは以下の記事からどうぞ。
DNSサーバ構築の流れ
- BINDのインストール
- BINDのchroot化
- コンフィグファイル(named.conf)の編集
- ゾーンファイル(正引き、逆引き)の作成
- firewallの設定
- bind-chrootサービスの起動
DNSサーバ構築
BINDのインストール
まずは以下のコマンドでBINDで使用するパッケージをインストールします。
yum -y install bind bind-chroot bind-utils
インストールされるパッケージは以下の3つです。
- bind → BIND本体
- bind-chroot → BINDをchroot化するため
- bind-utils → digなどのDNS関連コマンドを使用するため
インストール後、BINDサービスの状態を確認してみます。
systemctl status named.service
● named.service - Berkeley Internet Name Domain (DNS)
Loaded: loaded (/usr/lib/systemd/system/named.service; disabled; vendor preset: disabled)
Active: inactive (dead)
systemctl status named-chroot.service
● named-chroot.service - Berkeley Internet Name Domain (DNS)
Loaded: loaded (/usr/lib/systemd/system/named-chroot.service; disabled; vendor preset: disabled)
Active: inactive (dead)
namedもnamed-chrootも停止していることが分かります。
BINDのchroot化
BINDのルートディレクトリはLinuxのルートディレクトリと同じですが、chroot化することによりBINDのルートディレクトリを「/var/named/chroot」に変更します。
これにより、BINDは/chrootより上位フォルダにはアクセスできなくなるためセキュリティの面でメリットがあります。
chroot化のコマンドは以下です。
/usr/libexec/setup-named-chroot.sh /var/named/chroot on
chroot化したBINDのフォルダ構成については以下ページに分かりやすくまとめられているため興味があるようでしたらご確認ください。

コンフィグファイル(named.conf)の編集
まず、以下のようなLANを想定して各ホストの名前解決ができるDNSサーバを構築することを考えます。ドメインは「mynetwork.local」とします。
以下のネットワークを想定して設定するだけなので、実際に以下のようなネットワークが存在する必要はありません。
実際に構築するDNSサーバのIPアドレスは自宅のローカルネットワークに合わせて設定してください。

BINDのコンフィグファイルである named.conf を編集します。
/var/named/chroot/etc/named.conf
まずは、ディレクトリを移動してください。
cd /var/named/chroot/etc
以下のコマンドで named.conf が存在していることを確認してください。
ls -l
合計 704
drwxr-x---. 3 root named 23 11月 4 14:58 crypto-policies
-rw-r--r--. 2 root root 318 5月 11 10:00 localtime
drwxr-x---. 2 root named 6 7月 26 01:39 named
-rw-r-----. 1 root named 1705 7月 26 01:39 named.conf ←★
-rw-r-----. 1 root named 931 6月 21 2007 named.rfc1912.zones
-rw-r--r--. 1 root named 1886 4月 13 2017 named.root.key
drwxr-x---. 3 root named 25 11月 4 14:58 pki
-rw-r--r--. 1 root root 6568 9月 10 2018 protocols
-rw-r--r--. 1 root root 692241 9月 10 2018 services
次に named.conf のバックアップを取っておきます。
cp -p named.conf named.conf.org
named.conf がコピーされていることを確認します。
ls -l
合計 708
drwxr-x---. 3 root named 23 11月 4 14:58 crypto-policies
-rw-r--r--. 2 root root 318 5月 11 10:00 localtime
drwxr-x---. 2 root named 6 7月 26 01:39 named
-rw-r-----. 1 root named 1705 7月 26 01:39 named.conf
-rw-r-----. 1 root named 1705 7月 26 01:39 named.conf.org ←★
-rw-r-----. 1 root named 931 6月 21 2007 named.rfc1912.zones
-rw-r--r--. 1 root named 1886 4月 13 2017 named.root.key
drwxr-x---. 3 root named 25 11月 4 14:58 pki
-rw-r--r--. 1 root root 6568 9月 10 2018 protocols
-rw-r--r--. 1 root root 692241 9月 10 2018 services
それでは named.conf を vi で編集していきます。
vi named.conf
編集後の named.conf は以下の通りです。
acl "mynetwork" {
192.168.179.0/24;
};
options {
listen-on port 53 { 127.0.0.1; 192.168.179.5; };
listen-on-v6 port 53 { ::1; };
directory "/var/named";
dump-file "/var/named/data/cache_dump.db";
statistics-file "/var/named/data/named_stats.txt";
memstatistics-file "/var/named/data/named_mem_stats.txt";
secroots-file "/var/named/data/named.secroots";
recursing-file "/var/named/data/named.recursing";
allow-query { localhost; mynetwork; };
recursion yes;
dnssec-enable no;
dnssec-validation no;
managed-keys-directory "/var/named/dynamic";
pid-file "/run/named/named.pid";
session-keyfile "/run/named/session.key";
/* https://fedoraproject.org/wiki/Changes/CryptoPolicy */
include "/etc/crypto-policies/back-ends/bind.config";
};
logging {
channel default_debug {
file "data/named.run";
severity dynamic;
};
};
view "internal" {
match-clients { localhost; mynetwork; };
zone "." IN {
type hint;
file "named.ca";
};
zone "mynetwork.local" {
type master;
file "mynetwork.local";
};
zone "179.168.192.in-addr.arpa" {
type master;
file "179.168.192.in-addr.arpa.rev";
};
include "/etc/named.rfc1912.zones";
include "/etc/named.root.key";
};
コメントアウトについて
コンフィグファイル内に設定内容だけでなく説明文などを記載したい場合のためにコメントアウトという仕組みがあります。
named.conf では、「//」と記載するとその行の「//」より右側が、「/*」と「*/」を記載すると 「/*」と「*/」 で囲われた範囲がコメントアウトとみなされます。
コメントアウトされた範囲内の文字はシステムからは無視されます。
編集箇所を上から順に軽く説明します。
まず、以下の acl “mynetwork” {} の部分では、丸ごと追加した内容ですが、IPアドレスのグループを定義しています。 “mynetwork” がグループ名で、「192.168.179.0/24;」の部分がそのグループに属するIPアドレス(ネットワークセグメント)です。この acl は後に出てくる設定項目で対象IPアドレスを指定する際に使用します。 192.168.179.0/24 は今回想定するネットワークの各ホストが所属するネットワークです。
acl "mynetwork" {
192.168.179.0/24;
};
次は、以下の options {} の部分です。この部分では bind 全体にかかわる設定項目を記載します。
- 変更箇所(1)
listen-on port 53 {}ではDNSサーバのインターフェイスの内、どのインターフェイスに受信したリクエストに対して回答するかを設定します。デフォルトでは127.0.0.1のみが設定されているため、192.168.179.5(DNSサーバのIP)を追加しました。 - 変更箇所(2)
allow-query {} ではリクエストを受け付ける送信元IPアドレスを設定します。デフォルトでは localhost のみが設定されているため、acl として定義している mynetwork を追加します。 - 変更箇所(3)(4)
セキュリティを高める技術であるDNSSECの設定で、デフォルトでは yes になっていますが、今回は使用しないため no に変更しました。
options {
listen-on port 53 { 127.0.0.1; 192.168.179.5; }; ←★変更箇所(1)
listen-on-v6 port 53 { ::1; };
directory "/var/named";
dump-file "/var/named/data/cache_dump.db";
statistics-file "/var/named/data/named_stats.txt";
memstatistics-file "/var/named/data/named_mem_stats.txt";
secroots-file "/var/named/data/named.secroots";
recursing-file "/var/named/data/named.recursing";
allow-query { localhost; mynetwork; }; ←★変更箇所(2)
recursion yes;
dnssec-enable no; ←★変更箇所(3)
dnssec-validation no; ←★変更箇所(4)
managed-keys-directory "/var/named/dynamic";
pid-file "/run/named/named.pid";
session-keyfile "/run/named/session.key";
/* https://fedoraproject.org/wiki/Changes/CryptoPolicy */
include "/etc/crypto-policies/back-ends/bind.config";
};
次は logging {} の部分ですが、こちらはログの設定をする部分となります。今回はデフォルトから変更していません。
最後は view “internal” {} の部分です。新たに追加したセクションです。
view “識別名” {} では、特定のIPアドレス(DNSクエリ送信元)に対してDNSサーバが回答する情報を指定しています。”識別名”の部分に入る文字列はただの識別名なので何でもOKです。
view "internal" {
match-clients { localhost; mynetwork; }; ←★対象とするDNSクエリ送信元 IP アドレスを指定
zone "." IN { ←★view{}の外にあったものを中に入れた
type hint; ←★view{}の外にあったものを中に入れた
file "named.ca"; ←★view{}の外にあったものを中に入れた
}; ←★view{}の外にあったものを中に入れた
zone "mynetwork.local" { ←★正引きゾーンファイルを指定
type master; ←★masterとすることで"mynetwork.local" についてマスターサーバであることを示す
file "mynetwork.local"; ←★"mynetwork.local"についてのゾーンファイルが"mynetwork.local"であることを示す
};
zone "179.168.192.in-addr.arpa" { ←★逆引きゾーンファイルを指定
type master; ←★masterとすることで"179.168.192.in-addr.arpa" についてマスターサーバであることを示す
file "179.168.192.in-addr.arpa.rev"; ←★"179.168.192.in-addr.arpa"についてのゾーンファイルが"179.168.192.in-addr.arpa.rev"であることを示す
};
include "/etc/named.rfc1912.zones"; ←★view{}の外にあったものを中に入れた
include "/etc/named.root.key"; ←★view{}の外にあったものを中に入れた
};
named.conf の構文チェック
以下のコマンドで named.conf の構文チェックができます。
named-checkconf
エラーがある場合はその内容が表示されます。エラーが無い場合は何も表示されません。
ゾーンファイル(正引き、逆引き)の作成
次に、ゾーンファイルを作成します。ゾーンファイルはデフォルトでは存在しないため、新規にファイルを作成します。ゾーンファイルは以下のディレクトリ内に作成します。
/var/named/chroot/var/named
まずはディレクトリを移動してください。
cd /var/named/chroot/var/named
続いて、正引きゾーンファイル mynetwork.local を作成します。
vi mynetwork.local
mynetwork.local の内容は以下の通りです。「testSV」の部分は自分が構築しているDNSサーバのホスト名に置き換えてください。
$TTL 3600
@ IN SOA testSV.mynetwork.local. root.mynetwork.local. (
2019110401 ; serial ←シリアル番号、更新するたびに値を大きくします
3600 ; refresh 1hr
900 ; retry 15min
604800 ; expire 1w
86400 ; min 24hr
)
IN NS testSV.mynetwork.local.
testSV IN A 192.168.179.5 ; ←★ホスト名:testSV.mynetwork.local は IP:192.168.179.5 という意味
host1 IN A 192.168.179.10
host2 IN A 192.168.179.20
host3 IN A 192.168.179.30
コメントアウトについて
ゾーンファイルでは、セミコロン「;」がコメントアウトの意味となります。
続いて、逆引きゾーンファイル 179.168.192.in-addr.arpa.rev を作成します。
vi 179.168.192.in-addr.arpa.rev
179.168.192.in-addr.arpa.rev の内容は以下の通りです。 「testSV」の部分は自分が構築しているDNSサーバのホスト名に置き換えてください。
$TTL 3600
@ IN SOA testSV.mynetwork.local. root.mynetwork.local. (
2019110401 ; serial ←シリアル番号、更新するたびに値を大きくします
3600 ; refresh 1hr
900 ; retry 15min
604800 ; expire 1w
86400 ; min 24hr
)
IN NS testSV.mynetwork.local.
5 IN PTR testSV.mynetwork.local. ←★IP:192.168.179.5 は ホスト名:testSV.mynetwork.local という意味
10 IN PTR host1.mynetwork.local.
20 IN PTR host2.mynetwork.local.
30 IN PTR host3.mynetwork.local.
以上で、各ファイルの編集と作成は完了です。
ゾーンファイルの構文チェック
named.conf の構文チェックは named-checkconf で実施しますが、このコマンドに -z のオプションを付けることでゾーンファイルを含めて構文チェックをすることができます。
named-checkconf -z
ゾーンファイルを含めて構文チェックをする場合は、エラーが無い場合でもゾーンファイルを読み込むログが出力されます。
named-checkconf -z
zone mynetwork.local/IN: loaded serial 2019110401
zone 179.168.192.in-addr.arpa/IN: loaded serial 2019110402
zone localhost.localdomain/IN: loaded serial 0
zone localhost/IN: loaded serial 0
zone 1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa/IN: loaded serial 0
zone 1.0.0.127.in-addr.arpa/IN: loaded serial 0
zone 0.in-addr.arpa/IN: loaded serial 0
firewallの設定
構築したDNSサーバでDNSリクエストを受け付けるようにするために firewall でDNSポートの通信許可設定を行います。
以下コマンド firewall-cmd –list-all で firewall の設定状況を確認します。
firewall-cmd --list-all
public (active) ←★publicゾーンの設定
target: default
icmp-block-inversion: no
interfaces: wlp2s0 ←★DNSサーバのインターフェイス
sources:
services: cockpit dhcpv6-client ssh ←★DNSが無い
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
DNSポートが開放されていないため、DNSポートを開放します。
firewall-cmd --add-service=dns --zone=public --permanent
success
設定の確認
firewall-cmd --list-services --zone=public --permanent
cockpit dhcpv6-client dns ssh ←★DNSが追加された
最後にリロードして設定を反映させます。
firewall-cmd --reload
success
bind-chrootサービスの起動
以下コマンドにて bind-chroot サービスを起動させます。
systemctl start named-chroot
systemctl enable named-chroot ← ★自動起動設定
systemctl status named-chroot
● named-chroot.service - Berkeley Internet Name Domain (DNS)
Loaded: loaded (/usr/lib/systemd/system/named-chroot.service; enabled; vendor preset: disabled)
Active: active (running) since Mon 2019-11-04 15:32:09 JST; 4h 34min ago
Process: 4904 ExecReload=/bin/sh -c /usr/sbin/rndc reload > /dev/null 2>&1 || /bin/kill -HUP $MAINPID (code=exited>
Main PID: 4838 (named)
Tasks: 7 (limit: 21781)
Memory: 106.0M
CGroup: /system.slice/named-chroot.service
mq4838 /usr/sbin/named -u named -c /etc/named.conf -t /var/named/chroot
サービスが起動しました。
動作確認
構築したDNSサーバとネットワーク接続した Windows PC から nslookup をしてみます。
正引き確認
nslookup testSV.mynetwork.local 192.168.179.5
サーバー: testSV.mynetwork.local
Address: 192.168.179.5
名前: testSV.mynetwork.local
Address: 192.168.179.5
nslookup host1.mynetwork.local 192.168.179.5
サーバー: testSV.mynetwork.local
Address: 192.168.179.5
名前: host1.mynetwork.local
Address: 192.168.179.10
nslookup host2.mynetwork.local 192.168.179.5
サーバー: testSV.mynetwork.local
Address: 192.168.179.5
名前: host2.mynetwork.local
Address: 192.168.179.20
nslookup host3.mynetwork.local 192.168.179.5
サーバー: testSV.mynetwork.local
Address: 192.168.179.5
名前: host3.mynetwork.local
Address: 192.168.179.30
逆引き確認
nslookup 192.168.179.5 192.168.179.5
サーバー: testSV.mynetwork.local
Address: 192.168.179.5
名前: testSV.mynetwork.local
Address: 192.168.179.5
nslookup 192.168.179.10 192.168.179.5
サーバー: testSV.mynetwork.local
Address: 192.168.179.5
名前: host1.mynetwork.local
Address: 192.168.179.10
nslookup 192.168.179.20 192.168.179.5
サーバー: testSV.mynetwork.local
Address: 192.168.179.5
名前: host2.mynetwork.local
Address: 192.168.179.20
nslookup 192.168.179.30 192.168.179.5
サーバー: testSV.mynetwork.local
Address: 192.168.179.5
名前: host3.mynetwork.local
Address: 192.168.179.30
備考
設定ファイル変更時の注意点
- 設定ファイル(named.conf、正引き/逆引きゾーンファイル)の内容を更新した後は、以下のコマンドで設定変更を反映させてください
systemctl reload named-chroot
- 正引き/逆引きゾーンファイルを更新する際は、ゾーンファイル内に記載しているシリアル番号の値を更新前より大きい値としてください。更新前のシリアル番号の値より大きくなっていない場合、上記コマンドを実行してもゾーンファイルに変更なしと認識されてしまい、変更が反映されません。
―――――――――――――