自宅でDNSサーバ構築実践(BIND/CentOS 8)

インフラサーバ

今回はCentOS 8 でBINDを使用してDNSサーバを構築してみます。
細かいことは気にせずDNSリクエストに応答するサーバを構築することをゴールとします。

※CentOS 8 のインストールから始める方はまずは以下の記事からどうぞ。

DNSサーバ構築の流れ

  1. BINDのインストール
  2. BINDのchroot化
  3. コンフィグファイル(named.conf)の編集
  4. ゾーンファイル(正引き、逆引き)の作成
  5. firewallの設定
  6. 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のフォルダ構成については以下ページに分かりやすくまとめられているため興味があるようでしたらご確認ください。

内部向けDNS構築・解説 CentOS7.1 - Qiita
#概要CentOS7.1を使用して、内部向けDNSを構築します。DNSサーバーとして、BIND9.9.4を使用します。各種サイトや構築を通じて、自分なりの理解した内容などを記載していきます。以下URLを参考にしました…

コンフィグファイル(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

  • 正引き/逆引きゾーンファイルを更新する際は、ゾーンファイル内に記載しているシリアル番号の値を更新前より大きい値としてください。更新前のシリアル番号の値より大きくなっていない場合、上記コマンドを実行してもゾーンファイルに変更なしと認識されてしまい、変更が反映されません。

―――――――――――――

タイトルとURLをコピーしました