BIND で検証用の DNS サーバを構築する

balaeniceps-rex DNS

ローカル環境に検証用の DNS サーバを構築します。

※ここでは実際に設定、動作したものを掲載していますが、内容について保証するものではありません。流用される場合は各自の責任でお願いします。

構成

作成する検証環境の論理構成は下図のとおりです。

dns-bind-begin-logical

物理構成およびソフトウェアのスタックは下図のとおりです。

dns-bind-begin-physical
  • DNS サーバには BIND を使用します。
  • test.com ドメインの権威サーバはプライマリとセカンダリを用意しゾーン転送を行います。
  • プライマリは test.com の原本管理用とし、名前解決の問い合わせには応じないものとします。

使用しているソフトウェアのバージョンは以下のとおりです。

  • Windows 11 home [10.0.26200]
  • VirtualBox 7.1.6(仮想環境)
  • Rocky Linux 8.10(仮想マシンの OS)
  • BIND 9.11.36(DNS サーバ)

その他の構成情報については以下をご参照ください。

セキュリティ機能の無効化について

本検証環境では、SELinux のアクセス制御と firewalld サービスを無効化しています。

SELinux のアクセス制御の無効化手順は以下のとおりです。

# cp /etc/selinux/config /tmp
# vi /etc/selinux/config
# diff /tmp/config /etc/selinux/config
7c7
< SELINUX=enforcing
---
> SELINUX=permissive

firewalld サービスの無効化手順は以下のとおりです。

# systemctl stop firewalld
# systemctl disable firewalld
Removed /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.

※ firewalld を有効にする場合は適切なポートを解放してください。ゾーン転送は TCP で行われますので、そちらのポートについてもご注意ください。

権威サーバの IP アドレスについて

本検証環境では、1台の VM で複数のドメイン(root、com、test.com)を管理するため、VM に複数の IP アドレスを割り当てています。

IP アドレスを追加するための方法はいくつかありますが、ここでは ifcfg ファイルを編集する方法と、nmcli コマンドによる方法を記載しておきます。

① ifcfg ファイルを編集する方法

インターフェース(enp0s3)に IP アドレスを追加するため ifcfg-enp0s3 ファイルを編集した後、システム再起動します。
以下に ifcfg-enp0s3 ファイルの編集前、編集後および編集前後の差分を示します。

編集前
※ VM 作成時には、10.0.2.50 のみを割り当て、IPv6 は無効化しています。

[root@dns-auth tmp]# cat /etc/sysconfig/network-scripts/ifcfg-enp0s3
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=none
DEFROUTE=yes
IPV4_FAILURE_FATAL=yes
IPV6INIT=no
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=eui64
NAME=enp0s3
UUID=503dbf9f-b024-4aaf-803f-241bcf59ff99
DEVICE=enp0s3
ONBOOT=yes
IPADDR=10.0.2.50
PREFIX=24
GATEWAY=10.0.2.1
DNS1=8.8.8.8
IPV6_DISABLED=yes
[root@dns-auth tmp]#

編集後

[root@dns-auth ~]# cat /etc/sysconfig/network-scripts/ifcfg-enp0s3
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=none
DEFROUTE=yes
IPV4_FAILURE_FATAL=yes
IPV6INIT=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=eui64
NAME=enp0s3
UUID=503dbf9f-b024-4aaf-803f-241bcf59ff99
DEVICE=enp0s3
ONBOOT=yes
IPADDR=10.0.2.50
PREFIX=24
GATEWAY=10.0.2.1
DNS1=8.8.8.8
IPADDR1=10.0.2.52
PREFIX1=24
IPADDR2=10.0.2.53
PREFIX2=24
IPADDR3=10.0.2.54
PREFIX3=24
IPADDR4=10.0.2.56
PREFIX4=24
IPADDR5=10.0.2.57
PREFIX5=24
IPADDR6=10.0.2.58
PREFIX6=24
IPADDR7=10.0.2.60
PREFIX7=24
IPADDR8=10.0.2.61
PREFIX8=24
IPADDR9=10.0.2.62
PREFIX9=24
IPV6_AUTOCONF=no
IPV6ADDR=fd00::34/64
IPV6ADDR_SECONDARIES="fd00::35/64 fd00::36/64 fd00::38/64 fd00::39/64 fd00::3a/64 fd00::3d/64 fd00::3e/64"
[root@dns-auth ~]#

編集前後の差分

[root@dns-auth ~]# diff /tmp/ifcfg-enp0s3 /etc/sysconfig/network-scripts/ifcfg-enp0s3
7c7
< IPV6INIT=no
---
> IPV6INIT=yes
19c19,39
< IPV6_DISABLED=yes
---
> IPADDR1=10.0.2.52
> PREFIX1=24
> IPADDR2=10.0.2.53
> PREFIX2=24
> IPADDR3=10.0.2.54
> PREFIX3=24
> IPADDR4=10.0.2.56
> PREFIX4=24
> IPADDR5=10.0.2.57
> PREFIX5=24
> IPADDR6=10.0.2.58
> PREFIX6=24
> IPADDR7=10.0.2.60
> PREFIX7=24
> IPADDR8=10.0.2.61
> PREFIX8=24
> IPADDR9=10.0.2.62
> PREFIX9=24
> IPV6_AUTOCONF=no
> IPV6ADDR=fd00::34/64
> IPV6ADDR_SECONDARIES="fd00::35/64 fd00::36/64 fd00::38/64 fd00::39/64 fd00::3a/64 fd00::3d/64 fd00::3e/64"
[root@dns-auth ~]#

システムを再起動します。

[root@dns-auth ~]# systemctl reboot

② nmcli コマンドによる方法

nmcli コマンドでインターフェースへの IP アドレスの割り当てを指定します。コマンドの結果は ifcfg ファイルに反映されます。この方法ではシステム再起動なしに、追加の IP アドレスがシステムに反映されます。(念のため再起動もしていますが)
上記と同様の設定を nmcli コマンドで実施している例を以下に示します。

[root@dns-auth ~]# nmcli con mod enp0s3 ipv4.method manual ipv4.addresses 10.0.2.50/24,10.0.2.52/24,10.0.2.53/24,10.0.2.54/24,10.0.2.56/24,10.0.2.57/24,10.0.2.58/24,10.0.2.60/24,10.0.2.61/24,10.0.2.62/24
[root@dns-auth ~]# nmcli con mod enp0s3 ipv6.method manual ipv6.addresses fd00::34/64,fd00::35/64,fd00::36/64,fd00::38/64,fd00::39/64,fd00::3a/64,fd00::3d/64,fd00::3e/64
[root@dns-auth ~]# nmcli con up enp0s3
接続が正常にアクティベートされました (D-Bus アクティブパス: /org/freedesktop/NetworkManager/ActiveConnection/2)
[root@dns-auth ~]#

IP アドレス追加前後に確認したインターフェースの状態を以下に示します。

IP アドレス追加前

[root@dns-auth ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 08:00:27:f5:45:dc brd ff:ff:ff:ff:ff:ff
    inet 10.0.2.50/24 brd 10.0.2.255 scope global noprefixroute enp0s3
       valid_lft forever preferred_lft forever
[root@dns-auth ~]#

IP アドレス追加後

[root@dns-auth ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 08:00:27:f5:45:dc brd ff:ff:ff:ff:ff:ff
    inet 10.0.2.50/24 brd 10.0.2.255 scope global noprefixroute enp0s3
       valid_lft forever preferred_lft forever
    inet 10.0.2.52/24 brd 10.0.2.255 scope global secondary noprefixroute enp0s3
       valid_lft forever preferred_lft forever
    inet 10.0.2.53/24 brd 10.0.2.255 scope global secondary noprefixroute enp0s3
       valid_lft forever preferred_lft forever
    inet 10.0.2.54/24 brd 10.0.2.255 scope global secondary noprefixroute enp0s3
       valid_lft forever preferred_lft forever
    inet 10.0.2.56/24 brd 10.0.2.255 scope global secondary noprefixroute enp0s3
       valid_lft forever preferred_lft forever
    inet 10.0.2.57/24 brd 10.0.2.255 scope global secondary noprefixroute enp0s3
       valid_lft forever preferred_lft forever
    inet 10.0.2.58/24 brd 10.0.2.255 scope global secondary noprefixroute enp0s3
       valid_lft forever preferred_lft forever
    inet 10.0.2.60/24 brd 10.0.2.255 scope global secondary noprefixroute enp0s3
       valid_lft forever preferred_lft forever
    inet 10.0.2.61/24 brd 10.0.2.255 scope global secondary noprefixroute enp0s3
       valid_lft forever preferred_lft forever
    inet 10.0.2.62/24 brd 10.0.2.255 scope global secondary noprefixroute enp0s3
       valid_lft forever preferred_lft forever
    inet6 fd00::3e/64 scope global noprefixroute
       valid_lft forever preferred_lft forever
    inet6 fd00::3d/64 scope global noprefixroute
       valid_lft forever preferred_lft forever
    inet6 fd00::3a/64 scope global noprefixroute
       valid_lft forever preferred_lft forever
    inet6 fd00::39/64 scope global noprefixroute
       valid_lft forever preferred_lft forever
    inet6 fd00::38/64 scope global noprefixroute
       valid_lft forever preferred_lft forever
    inet6 fd00::36/64 scope global noprefixroute
       valid_lft forever preferred_lft forever
    inet6 fd00::35/64 scope global noprefixroute
       valid_lft forever preferred_lft forever
    inet6 fd00::34/64 scope global noprefixroute
       valid_lft forever preferred_lft forever
    inet6 fe80::a00:27ff:fef5:45dc/64 scope link noprefixroute
       valid_lft forever preferred_lft forever
[root@dns-auth ~]#

補足.

以下のコマンドでも追加可能ですが、永続化されません(システム再起動で設定が揮発します)。検証のため一時的に追加したい場合には使えると思います。

ip addr add 10.0.2.52/24 dev enp0s3
ip addr add 10.0.2.53/24 dev enp0s3
  :

ip addr add fd00::34/64 dev enp0s3
ip addr add fd00::35/64 dev enp0s3
  :
BIND のインストールについて

本検証環境では dnf で BIND をインストールしています。
※ 下記例では bind と bind-utils のパッケージをインストールしていますが、bind-utils は既にインストールされていたためスキップされています。

[root@dns-auth ~]# dnf install bind bind-utils -y

<snip>

インストール済み:
  bind-32:9.11.36-16.el8_10.6.x86_64

完了しました!
[root@dns-auth ~]#

インストール状況の確認は以下のとおりです。

[root@dns-auth ~]# rpm -qa | grep bind
bind-utils-9.11.36-16.el8_10.6.x86_64
bind-license-9.11.36-16.el8_10.6.noarch
bind-9.11.36-16.el8_10.6.x86_64          << 追加したパッケージ
python3-bind-9.11.36-16.el8_10.6.noarch
bind-libs-9.11.36-16.el8_10.6.x86_64
bind-libs-lite-9.11.36-16.el8_10.6.x86_64
[root@dns-auth ~]#
[root@dns-auth ~]# named -v
BIND 9.11.36-RedHat-9.11.36-16.el8_10.6 (Extended Support Version) <id:68dbd5b>
[root@dns-auth ~]#

サービス(named)の起動状況の確認は以下のとおりです。
※下記例ではサービス停止中ですが、自動起動設定(enable)と起動(start)は BIND の設定後に行う予定のため、このままにしておきます。

[root@dns-auth ~]# systemctl status named
● named.service - Berkeley Internet Name Domain (DNS)
   Loaded: loaded (/usr/lib/systemd/system/named.service; disabled; vendor preset: disabled)
   Active: inactive (dead)
[root@dns-auth ~]
バージョン等の確認について

備忘録としてバージョン等の確認方法を記載しておきます。

Window OS バージョン確認

> systeminfo

VirtualBox バージョン確認

VirtualBox マネージャーの[ヘルプ] > [VirtualBox について]

仮想マシン OS 情報確認

# hostnamectl

BIND バージョン確認

# named -v
# rpm -qa | grep bind

named が含まれるパッケージ確認

# rpm -qf `which named`

dig が含まれるパッケージ確認

# rpm -qf `which dig`

権威サーバの設定

本検証環境の権威サーバ用の VM は1台のみです。この1台の VM で全てのドメイン(ルート、com、test.com)を管理します。

それぞれのドメインを管理する NS サーバのホスト名とアドレスは下表のとおりです。

ドメインNS サーバのホスト名IP アドレス
ルート[x-z].root-servers.net.(*1)10.0.2.[52-55], fd00::[34-37]
com[x-z].gtld-servers.net.(*1)10.0.2.[56-59], fd00::[38-3b]
test.comns.test.com(*2)
ns1.test.com
ns2.test.com
10.0.2.60(*2)
10.0.2.61, fd00::3d
10.0.2.62, fd00::3e
*1 インターネット上のホスト名を参考にしています。
*2 便宜上、test.com のプライマリサーバにつけている名前です。ただしプライマリサーバでは名前解決の問い合わせ要求を受け付けないため、この名前/アドレスのリソースレコードをゾーンに登録することはありません。また同様の理由から IPv6 アドレスが必要ないため、プライマリサーバ用の IPv6 アドレスは用意していません。
参考:ルートと com の NS レコード

インターネットで定義されている、ルートと com の NS レコードを確認する例を以下に示します。

[root@dns-auth ~]# dig @8.8.8.8 com. a +trace | grep -w NS | grep -v RRSIG
.                       87203   IN      NS      c.root-servers.net.
.                       87203   IN      NS      k.root-servers.net.
.                       87203   IN      NS      h.root-servers.net.
.                       87203   IN      NS      e.root-servers.net.
.                       87203   IN      NS      b.root-servers.net.
.                       87203   IN      NS      i.root-servers.net.
.                       87203   IN      NS      j.root-servers.net.
.                       87203   IN      NS      a.root-servers.net.
.                       87203   IN      NS      l.root-servers.net.
.                       87203   IN      NS      m.root-servers.net.
.                       87203   IN      NS      g.root-servers.net.
.                       87203   IN      NS      f.root-servers.net.
.                       87203   IN      NS      d.root-servers.net.
com.                    172800  IN      NS      l.gtld-servers.net.
com.                    172800  IN      NS      j.gtld-servers.net.
com.                    172800  IN      NS      h.gtld-servers.net.
com.                    172800  IN      NS      d.gtld-servers.net.
com.                    172800  IN      NS      b.gtld-servers.net.
com.                    172800  IN      NS      f.gtld-servers.net.
com.                    172800  IN      NS      k.gtld-servers.net.
com.                    172800  IN      NS      m.gtld-servers.net.
com.                    172800  IN      NS      i.gtld-servers.net.
com.                    172800  IN      NS      g.gtld-servers.net.
com.                    172800  IN      NS      a.gtld-servers.net.
com.                    172800  IN      NS      c.gtld-servers.net.
com.                    172800  IN      NS      e.gtld-servers.net.
[root@dns-auth ~]#

権威サーバ(BIND)のコンフィグ設定

権威サーバ(BIND)の /etc/named.conf を設定します。
本検証環境では1台の VM(1つの BIND)で全ての権威サーバの機能をまかなうため、ゾーン毎の定義をそれぞれの view ステートメントに分けています。
おおまかな構成は以下のとおりです。

options {
  // BIND の基本的な設定やデフォルトの設定を行います。
};

view "ROOT" {
  // ルートドメインの NS サーバが管理するゾーンに関する設定を行います。
  // ここでは3つのアドレスでクエリを受け付けることでルートドメインの NS サーバが
  // 3台([x-z].root-servers.net)存在しているように見せています。
};

view "COM" {
  // com ドメインの NS サーバが管理するゾーンに関する設定を行います。
  // ここでは3つのアドレスでクエリを受け付けることで com ドメインの NS サーバが
  // 3台([x-z].gtld-servers.net)存在しているように見せています。
};

view "TESTCOM-PRIM" {
  // test.com ドメインのプライマリサーバが管理するゾーンに関する設定を行います。
  // クライアントからのクエリは受け付けませんが、ゾーン転送のマスターとしての
  // 設定を行います。
};

view "TESTCOM-SEC1" {
  // test.com ドメインのセカンダリサーバ1が管理するゾーンに関する設定を行います。
  // プライマリからゾーンデータを受け取るための設定を行います。
};

view "TESTCOM-SEC2" {
  // test.com ドメインのセカンダリサーバ2が管理するゾーンに関する設定を行います。
  // プライマリからゾーンデータを受け取るための設定を行います。
};
参考:ゾーン転送の流れについて

ゾーン転送は、「セカンダリ(スレーブ)が起点として開始されるゾーン転送」と「プライマリ(マスタ)が起点として開始されるゾーン転送」があります。
流れはそれぞれ以下のとおりです。

・セカンダリ(スレーブ)が起点として開始されるゾーン転送

①セカンダリは定期的にプライマリに対し、SOA レコードを請求する。
②受け取った SOA のシリアル番号がセカンダリより大きい場合、更新があったものと判断し、セカンダリはプライマリにゾーンデータを要求する。
③プライマリはセカンダリにゾーンデータを送信する。

・プライマリ(マスタ)が起点として開始されるゾーン転送

①プライマリはゾーンデータに変更があったことをセカンダリに通知する(NOTIFY)。
②NOTIFY に含まれるシリアル番号がセカンダリより大きい場合、セカンダリはプライマリにゾーンデータを要求する。
③プライマリはセカンダリにゾーンデータを送信する。

test.com 関連の view ステートメントには、上記処理に必要な通信相手のアドレスや通信許可に関する設定を行います。

設定に関する詳細につきましては、named.conf 内のコメントをご参照ください。

/etc/named.conf
// NSサーバのアドレスもしくはアドレス範囲に対し、ACLで別名をつけます。
// ルートドメインおよび comドメインのNSサーバは複数台想定のため、サブネット(30および126ビットマスクでアドレス4つ)で定義しています。
// ただし、ルートドメインおよび comドメインのNSサーバは各3台を予定しており、未使用アドレスが各1つづつ発生します。
// 未使用アドレスについては、VMのインターフェースには割り当てないことで、同アドレス宛のクエリがBINDまで届かないようにします 。
acl root_v4         { 10.0.2.52/30; }; //52-55
acl root_v6         { fd00::34/126; }; //34-37
acl com_v4          { 10.0.2.56/30; }; //56-59
acl com_v6          { fd00::38/126; }; //38-3b
acl testcom_prim_v4 { 10.0.2.60/32; };
acl testcom_sec1_v4 { 10.0.2.61/32; };
acl testcom_sec1_v6 { fd00::3d/128; };
acl testcom_sec2_v4 { 10.0.2.62/32; };
acl testcom_sec2_v6 { fd00::3e/128; };

masters testcom_prim { 10.0.2.60; };
masters testcom_sec  { 10.0.2.61; 10.0.2.62; };

options {
  // listen対象のポートとアドレスを指定します。
  listen-on port 53 {
//    any; 127.0.0.1;
    root_v4;
    com_v4;
    testcom_prim_v4;
    testcom_sec1_v4;
    testcom_sec2_v4;
  };
  listen-on-v6 port 53 {
//    any; ::1;
    root_v6;
    com_v6;
    testcom_sec1_v6;
    testcom_sec2_v6;
  };

  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";

  // 全てのリゾルバのIPアドレスからのクエリに応答します。
  allow-query { any; };

  // 権威サーバなので非再帰問合せ(反復問い合わせ)は行いません。
  recursion       no;
  allow-recursion { none; };

  // 権威サーバなのでキャッシュでの応答はしません。
  allow-query-cache { none; };

  // DNSSECの有効/無効の設定です。本検証環境では無効とします。
  dnssec-enable     no;
  dnssec-validation no;

  // 自身のゾーンデータの転送を許可するかどうかの設定ですが、ゾーンごとに異なるためデフォルト不許可としています。
  // 許可が必要な場合、viewステートメントのブロック内で個別に設定します。
  allow-transfer { none; };

  // Dynamic DNSの設定ですが、本検証環境では未対応とします。
  allow-update { none; };

  /* Path to ISC DLV key */
  bindkeys-file "/etc/named.iscdlv.key";

  managed-keys-directory "/var/named/dynamic";

  pid-file "/run/named/named.pid";
  session-keyfile "/run/named/session.key";
};

// ルートドメインのNSサーバに関する定義
view "ROOT" {
  // 送信元は無制限(any)、送信先はルートドメインのNSサーバ宛(root_v[4,6])の通信を受け付けます。
  // 送信先にサブネットを指定することで、ルートドメインのNSサーバが複数台存在するかのように見せています。
  match-clients      { any; };
  match-destinations { root_v4; root_v6; };

  zone "." IN {
    // デフォルトでは、zone "." ステートメントには、キャッシュサーバがルートドメインのNSサーバへ接続するためのルートヒントが定義されています。(hint と named.ca)
    // 本検証環境では、ルートへの参照をローカル環境内で完結させるため、このステートメントを通常のゾーン管理と同様の設定に書き換えています。

//    type hint;
//    file "named.ca";

    // NSサーバがゾーンのマスタであることを示します。
    // ゾーン転送の際はゾーンデータの送信側になりますが、master だからといってゾーン転送が必須というわけではありません。
    type master;

    // ゾーンデータが登録されているファイルです。directory ステートメントに指定されているパスからの相対パスです。
    file "root.zone";
  };

  include "/etc/named.rfc1912.zones";
};

// com ドメインのNSサーバに関する定義
view "COM" {
  // 送信元は無制限(any)、送信先はcomドメインのNSサーバ宛(com_v[4,6])の通信を受け付けます。
  // 送信先にサブネットを指定することで、comドメインのNSサーバが複数台存在するかのように見せています。
  match-clients      { any; };
  match-destinations { com_v4; com_v6; };

  zone "com" IN {
    type master;
    file "com.zone";
  };

  include "/etc/named.rfc1912.zones";
};

// test.com ドメインのプライマリサーバに関する定義
view "TESTCOM-PRIM" {
  // 送信元はtest.comドメインのセカンダリ(testcom_sec[1,2]_v4)、送信先はプライマリ宛(testcom_prim_v4)の通信を受け付けます。
  // プライマリでは問い合わせ対応は行いませんが、ゾーン転送に必要なセカンダリからのアクセスを許可します。
  match-clients      { testcom_sec1_v4; testcom_sec2_v4; };
  match-destinations { testcom_prim_v4; };

  zone "test.com" IN {
    type master;

    // ゾーン転送をセカンダリに対して許可します。
    allow-transfer { testcom_sec1_v4; testcom_sec2_v4; };

    // ゾーンデータの更新通知に関する設定です。
    // explicit を指定した場合、also-notifyに指定したNSサーバに対してのみに通知されます。
    // yes を指定した場合、also-notifyに指定したNSサーバ + ゾーンデータのNSレコードに定義されているNSサーバへ通知されます。
    notify explicit;
    also-notify { testcom_sec; };

    // ゾーンデータの更新通知をプライマリサーバのアドレスから送信するための設定です。
    // 本検証環境の権威サーバ(VM)には複数のアドレスが割り当てられているため、この設定がないとプライマリサーバ以外のアドレスから送信されてしまう可能性があります。
    // (notify-source でのアドレス指定にはACLは使えないようです。)
    notify-source 10.0.2.60;

    file "test.com.zone";
  };

  include "/etc/named.rfc1912.zones";
//  include "/etc/named.root.key";
};

// test.com ドメインのセカンダリサーバ1に関する定義
view "TESTCOM-SEC1" {
  // 送信元は無制限(any)、送信先はtest.comドメインのセカンダリ1宛(testcom_sec1_v[4,6])の通信を受け付けます。
  match-clients      { any; };
  match-destinations { testcom_sec1_v4; testcom_sec1_v6; };

  zone "test.com" IN {
    // NSサーバがゾーンのスレーブ(ゾーン転送における受信側)であることを指定します。
    type slave;

    // ゾーン転送のマスタ(プライマリサーバ)を指定します。
    masters { testcom_prim; };

    // ゾーンデータの更新通知の送信元を指定します。
    allow-notify { testcom_prim_v4; };

    // ゾーン転送の要求をセカンダリ1のアドレスから送信するための設定です。
    // 本検証環境の権威サーバ(VM)には複数のアドレスが割り当てられているため、この設定がないとセカンダリ1以外のアドレスから送信されてしまう可能性があります。
    // (transfer-source でのアドレス指定にはACLは使えないようです。)
    transfer-source 10.0.2.61;

    // ゾーン転送で受け取るゾーンファイルは、デフォルトでは RAW 形式(バイナリ)です。
    // text を指定するとテキスト形式で受信します。本設定ではゾーン転送後の確認のため text を指定します。
    // (RAW 形式に比べテキスト形式はパフォーマンスが落ちるようです)
    masterfile-format text;

    // プライマリから送信されてくるゾーンデータを格納するファイルの指定です。ゾーン転送で勝手に作られるので手動で編集することはありません。
    file "test.com.sec1.zone";
  };

  include "/etc/named.rfc1912.zones";
//  include "/etc/named.root.key";
};

// test.com ドメインのセカンダリサーバ2に関する定義
// ※セカンダリサーバ1と同様の設定なので説明は割愛します。
view "TESTCOM-SEC2" {
  match-clients { any; };
  match-destinations { testcom_sec2_v4; testcom_sec2_v6; };

  zone "test.com" IN {
    type slave;
    masters { testcom_prim; };
    allow-notify { testcom_prim_v4; };
    transfer-source 10.0.2.62;
    masterfile-format text;

    file "test.com.sec2.zone";
  };

  include "/etc/named.rfc1912.zones";
//  include "/etc/named.root.key";
};

named.conf の構文をチェックします。何も表示されなければ問題ありません。

[root@dns-auth etc]# named-checkconf
[root@dns-auth etc]#
補足:ACL 関連のチェックエラーについて

named.conf のチェックで以下のメッセージが出力されました。

[root@dns-auth etc]# named-checkconf
/etc/named.conf:125: unable to find masters list 'testcom_sec1_v4'
/etc/named.conf:125: unable to find masters list 'testcom_sec2_v4'
/etc/named.conf:150: unable to find masters list 'testcom_prim_v4'
/etc/named.conf:181: unable to find masters list 'testcom_prim_v4'
[root@dns-auth etc]#

以下のステートメント(ゾーン転送の通知関連の定義)でのアドレス指定に ACL を使用していたのが原因のようです。

also-notify
masters

ネットで調べるといづれも ACL は使用可能らしいのですが、メッセージに従い以下の masters list を定義し、上記ステートメントに指定することでワーニング(?)を解消しました。

masters testcom_prim { 10.0.2.60; };
masters testcom_sec  { 10.0.2.61; 10.0.2.62; };

権威サーバ(BIND)のゾーン設定

本検証環境で用意するゾーンファイルは下表のとおりです。

ドメインゾーンファイル
ルートroot.zone
comcom.zone
test.comtest.com.zone
test.com.sec1.zone(*1)
test.com.sec2.zone(*1)
*1 ゾーン転送で自動的に作成されるファイルです。

ルートドメインのゾーンファイルを作成し、構文チェックを行います。

[root@dns-auth ~]# cd /var/named
[root@dns-auth named]# vi root.zone
[root@dns-auth named]# chown root:named root.zone
[root@dns-auth named]# named-checkzone . /var/named/root.zone
zone ./IN: loaded serial 0
OK
[root@dns-auth named]#

com ドメインのゾーンファイルを作成し、構文チェックを行います。
※ NS サーバ名が外部名(xx.com ではなく xx.net)なのでいろいろメッセージが出ていますが、グルーとしてアドレスも同時に設定しており net ドメインへ別途問い合わせが行くことはないため、ここでは無視します。

[root@dns-auth named]# vi com.zone
[root@dns-auth named]# chown root:named com.zone
[root@dns-auth named]# named-checkzone com /var/named/com.zone
/var/named/com.zone:13: ignoring out-of-zone data (x.gtld-servers.net)
/var/named/com.zone:14: ignoring out-of-zone data (y.gtld-servers.net)
/var/named/com.zone:15: ignoring out-of-zone data (z.gtld-servers.net)
/var/named/com.zone:16: ignoring out-of-zone data (x.gtld-servers.net)
/var/named/com.zone:17: ignoring out-of-zone data (y.gtld-servers.net)
/var/named/com.zone:18: ignoring out-of-zone data (z.gtld-servers.net)
zone com/IN: test.com/NS 'ns1.test.com' (out of zone) has no addresses records (A or AAAA)
zone com/IN: test.com/NS 'ns2.test.com' (out of zone) has no addresses records (A or AAAA)
zone com/IN: loaded serial 0
OK
[root@dns-auth named]#

test.com ドメインのゾーンファイルを作成し、構文チェックを行います。

[root@dns-auth named]# vi test.com.zone
[root@dns-auth named]# chown root:named test.com.zone
[root@dns-auth named]# named-checkzone test.com /var/named/test.com.zone
zone test.com/IN: loaded serial 1
OK
[root@dns-auth named]#

ゾーンファイルの内容については以下をご参照ください。

/var/named/root.zone
$ORIGIN .
$TTL 87203
@ IN SOA x.root-servers.net. root. (
  0000000000    ; serial
          1D    ; refresh
          1H    ; retry
          1W    ; expire
          3H )  ; minimum

                    IN NS   x.root-servers.net.
                    IN NS   y.root-servers.net.
                    IN NS   z.root-servers.net.
x.root-servers.net. IN A    10.0.2.52
y.root-servers.net. IN A    10.0.2.53
z.root-servers.net. IN A    10.0.2.54
x.root-servers.net. IN AAAA fd00::34
y.root-servers.net. IN AAAA fd00::35
z.root-servers.net. IN AAAA fd00::36

com.                IN NS   x.gtld-servers.net.
com.                IN NS   y.gtld-servers.net.
com.                IN NS   z.gtld-servers.net.
x.gtld-servers.net. IN A    10.0.2.56
y.gtld-servers.net. IN A    10.0.2.57
z.gtld-servers.net. IN A    10.0.2.58
x.gtld-servers.net. IN AAAA fd00::38
y.gtld-servers.net. IN AAAA fd00::39
z.gtld-servers.net. IN AAAA fd00::3a
/var/named/com.zone
$ORIGIN com.
$TTL 172800
@ IN SOA x.gtld-servers.net. root.com. (
  0000000000    ; serial
          1D    ; refresh
          1H    ; retry
          1W    ; expire
     2000000 )  ; minimum

                    IN NS   x.gtld-servers.net.
                    IN NS   y.gtld-servers.net.
                    IN NS   z.gtld-servers.net.
x.gtld-servers.net. IN A    10.0.2.56
y.gtld-servers.net. IN A    10.0.2.57
z.gtld-servers.net. IN A    10.0.2.58
x.gtld-servers.net. IN AAAA fd00::38
y.gtld-servers.net. IN AAAA fd00::39
z.gtld-servers.net. IN AAAA fd00::3a

test.com.           IN NS   ns1.test.com.
test.com.           IN NS   ns2.test.com.
ns1.test.com.       IN A    10.0.2.61
ns2.test.com.       IN A    10.0.2.62
ns1.test.com.       IN AAAA fd00::3d
ns2.test.com.       IN AAAA fd00::3e
/var/named/test.com.zone
$ORIGIN test.com.
$TTL 604800

; SOAのNSサーバには、セカンダリサーバ1のホスト名(ns1)を指定しています。プライマリサーバは外部に公開しないためこのような設定にしています。
@ IN SOA ns1.test.com. root.test.com. (
  0000000001    ; serial
          1D    ; refresh
          1H    ; retry
          1W    ; expire
     2000000 )  ; minimum

               IN NS   ns1.test.com.
               IN NS   ns2.test.com.
ns1.test.com.  IN A    10.0.2.61
ns2.test.com.  IN A    10.0.2.62
ns1.test.com.  IN AAAA fd00::3d
ns2.test.com.  IN AAAA fd00::3e

www            IN A    3.4.5.6

権威サーバ(BIND)のサービス開始と動作確認

初回なのでサービスの自動起動の設定と、サービスの開始を同時に行います。
※ 開始だけならば、systemctl start named を実行します。

[root@dns-auth ~]# systemctl enable --now named
Created symlink /etc/systemd/system/multi-user.target.wants/named.service → /usr/lib/systemd/system/named.service.
[root@dns-auth ~]#

起動状況を確認します。起動とともに test.com のゾーン転送(AXFR)が行われていることがログから確認できます。

[root@dns-auth ~]# systemctl status named
● named.service - Berkeley Internet Name Domain (DNS)
   Loaded: loaded (/usr/lib/systemd/system/named.service; enabled; vendor preset: disabled)
   Active: active (running) since Tue 2026-03-24 18:53:15 JST; 9s ago
  Process: 1744 ExecStop=/bin/sh -c /usr/sbin/rndc stop > /dev/null 2>&1 || /bin/kill -TERM $MAINPID (code=exited, status=0/SUCCESS)
  Process: 1768 ExecStart=/usr/sbin/named -u named -c ${NAMEDCONF} $OPTIONS (code=exited, status=0/SUCCESS)
  Process: 1764 ExecStartPre=/bin/bash -c if [ ! "$DISABLE_ZONE_CHECKING" == "yes" ]; then /usr/sbin/named-checkconf -z "$NAMEDCONF"; else echo "Checking of zone files is disabled"; fi (code=exited, status=0/SUCCE>
 Main PID: 1770 (named)
    Tasks: 7 (limit: 23224)
   Memory: 41.4M
   CGroup: /system.slice/named.service
           └1770 /usr/sbin/named -u named -c /etc/named.conf

 3月 24 18:53:16 dns-auth.mydomain named[1770]: client @0x7f7e201918b0 fd00::3e#52123: view TESTCOM-SEC2: received notify for zone 'test.com'
 3月 24 18:53:16 dns-auth.mydomain named[1770]: zone test.com/IN/TESTCOM-SEC2: refused notify from non-master: fd00::3e#52123
 3月 24 18:53:16 dns-auth.mydomain named[1770]: zone test.com/IN/TESTCOM-SEC2: Transfer started.
 3月 24 18:53:16 dns-auth.mydomain named[1770]: transfer of 'test.com/IN/TESTCOM-SEC2' from 10.0.2.60#53: connected using 10.0.2.62#55983
 3月 24 18:53:16 dns-auth.mydomain named[1770]: client @0x7f7e1802db60 10.0.2.62#55983 (test.com): view TESTCOM-PRIM: transfer of 'test.com/IN': AXFR started (serial 1)
 3月 24 18:53:16 dns-auth.mydomain named[1770]: client @0x7f7e1802db60 10.0.2.62#55983 (test.com): view TESTCOM-PRIM: transfer of 'test.com/IN': AXFR ended
 3月 24 18:53:16 dns-auth.mydomain named[1770]: zone test.com/IN/TESTCOM-SEC2: transferred serial 1
 3月 24 18:53:16 dns-auth.mydomain named[1770]: transfer of 'test.com/IN/TESTCOM-SEC2' from 10.0.2.60#53: Transfer status: success
 3月 24 18:53:16 dns-auth.mydomain named[1770]: transfer of 'test.com/IN/TESTCOM-SEC2' from 10.0.2.60#53: Transfer completed: 1 messages, 9 records, 247 bytes, 0.001 secs (247000 bytes/sec)
 3月 24 18:53:16 dns-auth.mydomain named[1770]: zone test.com/IN/TESTCOM-SEC2: sending notifies (serial 1)
[root@dns-auth ~]#

test.com.sec[1,2].zone がゾーン転送で作成されたファイルです。

[root@dns-auth ~]# ll /var/named
合計 36
-rw-r--r--. 1 root  named  797  3月 20 19:39 com.zone
drwxrwx---. 2 named named   75  3月 23 16:39 data
drwxrwx---. 2 named named   60  3月 10 17:10 dynamic
-rw-r-----. 1 root  named 2112 11月  6 13:06 named.ca
-rw-r-----. 1 root  named  152 11月  6 13:06 named.empty
-rw-r-----. 1 root  named  152 11月  6 13:06 named.localhost
-rw-r-----. 1 root  named  168 11月  6 13:06 named.loopback
-rw-r--r--. 1 root  named  924  3月 20 19:27 root.zone
drwxrwx---. 2 named named    6 11月  6 13:05 slaves
-rw-r--r--. 1 named named  423  3月 24 18:53 test.com.sec1.zone
-rw-r--r--. 1 named named  423  3月 24 18:53 test.com.sec2.zone
-rw-r--r--. 1 root  named  636  3月 20 19:37 test.com.zone
[root@dns-auth ~]#

権威サーバの 53(DNS)ポートの状況を確認します。

[root@dns-auth ~]# lsof -nP -iUDP:53 -iTCP:53
COMMAND  PID  USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
named   1770 named   21u  IPv4  29051      0t0  TCP 10.0.2.52:53 (LISTEN)
named   1770 named   22u  IPv4  29053      0t0  TCP 10.0.2.53:53 (LISTEN)
named   1770 named   23u  IPv4  29055      0t0  TCP 10.0.2.54:53 (LISTEN)
named   1770 named   24u  IPv4  29057      0t0  TCP 10.0.2.56:53 (LISTEN)
named   1770 named   25u  IPv4  29059      0t0  TCP 10.0.2.57:53 (LISTEN)
named   1770 named   26u  IPv4  29061      0t0  TCP 10.0.2.58:53 (LISTEN)
named   1770 named   27u  IPv4  29063      0t0  TCP 10.0.2.60:53 (LISTEN)
named   1770 named   28u  IPv4  29065      0t0  TCP 10.0.2.61:53 (LISTEN)
named   1770 named   29u  IPv4  29067      0t0  TCP 10.0.2.62:53 (LISTEN)
named   1770 named   30u  IPv6  29069      0t0  TCP [fd00::3e]:53 (LISTEN)
named   1770 named   31u  IPv6  29071      0t0  TCP [fd00::3d]:53 (LISTEN)
named   1770 named   32u  IPv6  29073      0t0  TCP [fd00::3a]:53 (LISTEN)
named   1770 named   33u  IPv6  29075      0t0  TCP [fd00::39]:53 (LISTEN)
named   1770 named   34u  IPv6  29077      0t0  TCP [fd00::38]:53 (LISTEN)
named   1770 named   35u  IPv6  29079      0t0  TCP [fd00::36]:53 (LISTEN)
named   1770 named   36u  IPv6  29081      0t0  TCP [fd00::35]:53 (LISTEN)
named   1770 named   37u  IPv6  29083      0t0  TCP [fd00::34]:53 (LISTEN)
named   1770 named  512u  IPv4  29049      0t0  UDP 10.0.2.52:53
named   1770 named  513u  IPv4  29052      0t0  UDP 10.0.2.53:53
named   1770 named  514u  IPv4  29054      0t0  UDP 10.0.2.54:53
named   1770 named  515u  IPv4  29056      0t0  UDP 10.0.2.56:53
named   1770 named  516u  IPv4  29058      0t0  UDP 10.0.2.57:53
named   1770 named  517u  IPv4  29060      0t0  UDP 10.0.2.58:53
named   1770 named  518u  IPv4  29062      0t0  UDP 10.0.2.60:53
named   1770 named  519u  IPv4  29064      0t0  UDP 10.0.2.61:53
named   1770 named  520u  IPv4  29066      0t0  UDP 10.0.2.62:53
named   1770 named  521u  IPv6  29068      0t0  UDP [fd00::3e]:53
named   1770 named  522u  IPv6  29070      0t0  UDP [fd00::3d]:53
named   1770 named  523u  IPv6  29072      0t0  UDP [fd00::3a]:53
named   1770 named  524u  IPv6  29074      0t0  UDP [fd00::39]:53
named   1770 named  525u  IPv6  29076      0t0  UDP [fd00::38]:53
named   1770 named  526u  IPv6  29078      0t0  UDP [fd00::36]:53
named   1770 named  527u  IPv6  29080      0t0  UDP [fd00::35]:53
named   1770 named  528u  IPv6  29082      0t0  UDP [fd00::34]:53
[root@dns-auth ~]#

別ノードから権威サーバへの疎通を確認します。

ルートドメインの NS サーバへ www.test.com のアドレスを問い合わせ、com への委任情報(com の NS サーバ情報)が回答されることを確認します。

[root@dns-client ~]# dig @10.0.2.52 www.test.com A +norec +noall +comments +authority +additional
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 52702
;; flags: qr; QUERY: 1, ANSWER: 0, AUTHORITY: 3, ADDITIONAL: 7

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
; COOKIE: 09eb18a887af2862eb8796ee69c2604797737cd6e831ff2e (good)
;; AUTHORITY SECTION:
com.                    87203   IN      NS      x.gtld-servers.net.
com.                    87203   IN      NS      z.gtld-servers.net.
com.                    87203   IN      NS      y.gtld-servers.net.

;; ADDITIONAL SECTION:
x.gtld-servers.net.     87203   IN      A       10.0.2.56
y.gtld-servers.net.     87203   IN      A       10.0.2.57
z.gtld-servers.net.     87203   IN      A       10.0.2.58
x.gtld-servers.net.     87203   IN      AAAA    fd00::38
y.gtld-servers.net.     87203   IN      AAAA    fd00::39
z.gtld-servers.net.     87203   IN      AAAA    fd00::3a

[root@dns-client ~]#

com ドメインの NS サーバへ www.test.com のアドレスを問い合わせ、test.com への委任情報(test.com の NS サーバ情報)が回答されることを確認します。

[root@dns-client ~]# dig @10.0.2.56 www.test.com A +norec +noall +comments +authority +additional
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 20165
;; flags: qr; QUERY: 1, ANSWER: 0, AUTHORITY: 2, ADDITIONAL: 5

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
; COOKIE: ba90c83a8c1000583b063d5169c2607d829a1c68d16ed15f (good)
;; AUTHORITY SECTION:
test.com.               172800  IN      NS      ns1.test.com.
test.com.               172800  IN      NS      ns2.test.com.

;; ADDITIONAL SECTION:
ns1.test.com.           172800  IN      A       10.0.2.61
ns2.test.com.           172800  IN      A       10.0.2.62
ns1.test.com.           172800  IN      AAAA    fd00::3d
ns2.test.com.           172800  IN      AAAA    fd00::3e

[root@dns-client ~]#

test.com ドメインの NS サーバへ www.test.com のアドレスを問い合わせ、回答されることを確認します。

[root@dns-client ~]# dig @10.0.2.61 www.test.com A +norec +noall +comments +answer +authority +additional
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 52710
;; flags: qr aa; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 5

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
; COOKIE: 8dc848d13e21baede889110069c2609883098a1b2d345a5f (good)
;; ANSWER SECTION:
www.test.com.           604800  IN      A       3.4.5.6

;; AUTHORITY SECTION:
test.com.               604800  IN      NS      ns1.test.com.
test.com.               604800  IN      NS      ns2.test.com.

;; ADDITIONAL SECTION:
ns1.test.com.           604800  IN      A       10.0.2.61
ns2.test.com.           604800  IN      A       10.0.2.62
ns1.test.com.           604800  IN      AAAA    fd00::3d
ns2.test.com.           604800  IN      AAAA    fd00::3e

[root@dns-client ~]#

キャッシュサーバの設定

非再帰問い合わせ(反復問い合わせ)の際、デフォルトではルートヒントを元に、インターネット上のルート DNS サーバへ最初の問い合わせを行います。本検証環境では、先に構築した検証環境内のルート DNS サーバへ問い合わせるように設定を変更します。

キャッシュサーバ(BIND)のコンフィグ設定

キャッシュサーバ(BIND)の /etc/named.conf を設定します。設定に関する詳細につきましては、named.conf 内のコメントをご参照ください。

/etc/named.conf
// アクセス元のアドレス範囲(キャッシュサーバ自身および検証環境内のIPアドレス)に対し、ACLで別名をつけます。
acl "MySubnet" { 127.0.0.1; 10.0.2.0/24; ::1; fd00::0/64; };

options {
  listen-on port 53    { any; 127.0.0.1; };
  listen-on-v6 port 53 { any; ::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";

  // 検証環境内のIPアドレスからのクエリに応答します。
  allow-query       { MySubnet; };

  // キャッシュサーバなのでスタブリゾルバからの再帰問合せに応じ、権威サーバへの非再帰問合せ(反復問い合わせ)を行います。
  recursion         yes;
  allow-recursion   { MySubnet; };

  // キャッシュサーバなのでキャッシュでの応答に対応します。
  allow-query-cache { MySubnet; };

  // DNSSECの有効/無効の設定です。本検証環境では無効とします。
  dnssec-enable     no;
  dnssec-validation no;

  /* Path to ISC DLV key */
  bindkeys-file "/etc/named.iscdlv.key";

  managed-keys-directory "/var/named/dynamic";

  pid-file "/run/named/named.pid";
  session-keyfile "/run/named/session.key";
};

zone "." IN {
  // ルートヒントをインターネットのルートドメイン接続情報から、検証環境内のルートドメイン接続情報へ変更します。
  type hint;
//  file "named.ca";
  file "localhints.ca";
};

include "/etc/named.rfc1912.zones";
//include "/etc/named.root.key";

named.conf の構文をチェックします。何も表示されなければ問題ありません。

[root@dns-cache ~]# named-checkconf
[root@dns-cache ~]#

キャッシュサーバ(BIND)のルートヒント設定

検証環境用のルートヒントファイルを用意します。

[root@dns--cache ~]# cd /var/named
[root@dns--cache named]# vi localhints.ca
[root@dns--cache named]# chown root:named localhints.ca
[root@dns--cache named]# cat localhints.ca
.                   518400 IN NS   x.root-servers.net.
.                   518400 IN NS   y.root-servers.net.
.                   518400 IN NS   z.root-servers.net.
x.root-servers.net. 518400 IN A    10.0.2.52
y.root-servers.net. 518400 IN A    10.0.2.53
z.root-servers.net. 518400 IN A    10.0.2.54
x.root-servers.net. 518400 IN AAAA fd00::34
y.root-servers.net. 518400 IN AAAA fd00::35
z.root-servers.net. 518400 IN AAAA fd00::36
[root@dns--cache named]#

キャッシュサーバ(BIND)のサービス開始と動作確認

初回なのでサービスの自動起動の設定と、サービスの開始を同時に行います。
※ 開始だけならば、systemctl start named を実行します。

[root@dns-cache ~]# systemctl enable --now named
Created symlink /etc/systemd/system/multi-user.target.wants/named.service → /usr/lib/systemd/system/named.service.
[root@dns-cache ~]#

起動状況を確認します。

[root@dns-cache ~]# systemctl status named
● named.service - Berkeley Internet Name Domain (DNS)
   Loaded: loaded (/usr/lib/systemd/system/named.service; enabled; vendor preset: disabled)
   Active: active (running) since Tue 2026-03-24 20:35:45 JST; 1min 9s ago
  Process: 24125 ExecStart=/usr/sbin/named -u named -c ${NAMEDCONF} $OPTIONS (code=exited, status=0/SUCCESS)
  Process: 24121 ExecStartPre=/bin/bash -c if [ ! "$DISABLE_ZONE_CHECKING" == "yes" ]; then /usr/sbin/named-checkconf -z ">
 Main PID: 24126 (named)
    Tasks: 7 (limit: 23224)
   Memory: 20.0M
   CGroup: /system.slice/named.service
           └24126 /usr/sbin/named -u named -c /etc/named.conf

 3月 24 20:35:45 dns-cache.mydomain named[24126]: command channel listening on ::1#953
 3月 24 20:35:45 dns-cache.mydomain named[24126]: managed-keys-zone: loaded serial 0
 3月 24 20:35:45 dns-cache.mydomain named[24126]: zone 0.in-addr.arpa/IN: loaded serial 0
 3月 24 20:35:45 dns-cache.mydomain named[24126]: 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.ip>
 3月 24 20:35:45 dns-cache.mydomain named[24126]: zone localhost.localdomain/IN: loaded serial 0
 3月 24 20:35:45 dns-cache.mydomain named[24126]: zone localhost/IN: loaded serial 0
 3月 24 20:35:45 dns-cache.mydomain named[24126]: zone 1.0.0.127.in-addr.arpa/IN: loaded serial 0
 3月 24 20:35:45 dns-cache.mydomain named[24126]: all zones loaded
 3月 24 20:35:45 dns-cache.mydomain named[24126]: running
 3月 24 20:35:45 dns-cache.mydomain systemd[1]: Started Berkeley Internet Name Domain (DNS).
[root@dns-cache ~]#

キャッシュサーバの 53(DNS)ポートの状況を確認します。

[root@dns-cache ~]# lsof -nP -iUDP:53 -iTCP:53
COMMAND   PID  USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
named   24126 named   21u  IPv4  48865      0t0  TCP 127.0.0.1:53 (LISTEN)
named   24126 named   22u  IPv4  48867      0t0  TCP 10.0.2.67:53 (LISTEN)
named   24126 named   23u  IPv6  48869      0t0  TCP [::1]:53 (LISTEN)
named   24126 named   24u  IPv6  48871      0t0  TCP [fd00::43]:53 (LISTEN)
named   24126 named   25u  IPv6  48873      0t0  TCP [fe80::a00:27ff:fee0:1947]:53 (LISTEN)
named   24126 named  512u  IPv4  48863      0t0  UDP 127.0.0.1:53
named   24126 named  513u  IPv4  48866      0t0  UDP 10.0.2.67:53
named   24126 named  514u  IPv6  48868      0t0  UDP [::1]:53
named   24126 named  515u  IPv6  48870      0t0  UDP [fd00::43]:53
named   24126 named  516u  IPv6  48872      0t0  UDP [fe80::a00:27ff:fee0:1947]:53
[root@dns-cache ~]#

別ノードからキャッシュサーバへの疎通を確認します。

疎通を確認する前にキャッシュをクリアしておきます。
※ 起動直後のため本来必要ありませんが、備忘録として記載しておきます。

[root@dns-cache ~]# rndc flush
[root@dns-cache ~]#
参考:rndc について

rndc は bind パッケージに含まれるツールです。

[root@dns-cache named]# rpm -qf `which rndc`
bind-9.11.36-16.el8_10.6.x86_64
[root@dns-cache named]#

キャッシュサーバへ www.test.com のアドレスを問い合わせ、回答されることを確認します。

[root@dns-client ~]# dig @10.0.2.67 www.test.com A +noall +comments +answer +authority +additional
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 44955
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 5

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
; COOKIE: becf8bfa4a5b456703cfd17b69c27a0e7ab9ebb65d1b1dbf (good)
;; ANSWER SECTION:
www.test.com.           604800  IN      A       3.4.5.6

;; AUTHORITY SECTION:
test.com.               172800  IN      NS      ns1.test.com.
test.com.               172800  IN      NS      ns2.test.com.

;; ADDITIONAL SECTION:
ns2.test.com.           172800  IN      A       10.0.2.62
ns1.test.com.           172800  IN      A       10.0.2.61
ns2.test.com.           172800  IN      AAAA    fd00::3e
ns1.test.com.           172800  IN      AAAA    fd00::3d

[root@dns-client ~]#

キャッシュをファイルにダンプし登録状況を確認します。
ダンプ先は named.conf の dump-file ステートメントに定義されているパスです。

[root@dns-cache ~]# rndc dumpdb
[root@dns-cache ~]# cat /var/named/data/cache_dump.db

<snip>

; authanswer
.                       87107   IN NS   z.root-servers.net.
                        87107   IN NS   x.root-servers.net.
                        87107   IN NS   y.root-servers.net.
; glue
com.                    87107   NS      z.gtld-servers.net.
                        87107   NS      y.gtld-servers.net.
                        87107   NS      x.gtld-servers.net.
; glue
test.com.               172704  NS      ns2.test.com.
                        172704  NS      ns1.test.com.
; glue
ns1.test.com.           172704  A       10.0.2.61
; glue
                        172704  AAAA    fd00::3d
; glue
ns2.test.com.           172704  A       10.0.2.62
; glue
                        172704  AAAA    fd00::3e
; authanswer
www.test.com.           604704  A       3.4.5.6
; authanswer
x.gtld-servers.net.     87107   A       10.0.2.56
; authanswer
                        87107   AAAA    fd00::38
; authanswer
y.gtld-servers.net.     87107   A       10.0.2.57
; authanswer
                        87107   AAAA    fd00::39
; authanswer
z.gtld-servers.net.     87107   A       10.0.2.58
; authanswer
                        87107   AAAA    fd00::3a
; glue
x.root-servers.net.     87107   A       10.0.2.52
; glue
                        87107   AAAA    fd00::34
; glue
y.root-servers.net.     87107   A       10.0.2.53
; glue
                        87107   AAAA    fd00::35
; glue
z.root-servers.net.     87107   A       10.0.2.54
; glue
                        87107   AAAA    fd00::36
<snip>

[root@dns-cache ~]#
参考:委任情報のキャッシュについて

委任情報(NS サーバのホスト名とそのアドレス)は親と子で同じレコードを持ちます。
キャッシュされるのはどちらか気になったので確認しました。

com の NS サーバ(10.0.2.56)に登録されている test.com NS 情報を確認します。

[root@dns-client ~]# dig @10.0.2.56 test.com NS +norec | grep test.com
; <<>> DiG 9.11.36-RedHat-9.11.36-16.el8_10.6 <<>> @10.0.2.56 test.com NS +norec
;test.com.                      IN      NS
test.com.               172800  IN      NS      ns2.test.com.
test.com.               172800  IN      NS      ns1.test.com.
ns1.test.com.           172800  IN      A       10.0.2.61
ns2.test.com.           172800  IN      A       10.0.2.62
ns1.test.com.           172800  IN      AAAA    fd00::3d
ns2.test.com.           172800  IN      AAAA    fd00::3e
[root@dns-client ~]#

test.com の NS サーバ(10.0.2.61)に登録されている test.com の NS 情報を確認します。

[root@dns-client ~]# dig @10.0.2.61 test.com NS +norec | grep test.com
; <<>> DiG 9.11.36-RedHat-9.11.36-16.el8_10.6 <<>> @10.0.2.61 test.com NS +norec
;test.com.                      IN      NS
test.com.               604800  IN      NS      ns2.test.com.
test.com.               604800  IN      NS      ns1.test.com.
ns1.test.com.           604800  IN      A       10.0.2.61
ns2.test.com.           604800  IN      A       10.0.2.62
ns1.test.com.           604800  IN      AAAA    fd00::3d
ns2.test.com.           604800  IN      AAAA    fd00::3e
[root@dns-client ~]#

キャッシュされている test.com の NS 情報ですが、TTL から親(com)ドメインに登録されていた情報とわかります。

[root@dns-cache ~]# cat /var/named/data/cache_dump.db | grep test.com
test.com.               172704  NS      ns2.test.com.
                        172704  NS      ns1.test.com.
ns1.test.com.           172704  A       10.0.2.61
ns2.test.com.           172704  A       10.0.2.62
www.test.com.           604704  A       3.4.5.6
[root@dns-cache ~]#

BIND では親ドメインの委任情報がキャッシュされるようですが、RFC では特に規定されていないようです。他の DNS 製品では違った結果になる可能性があります。

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