bind on EC2で権威DNSサーバを構築(RHEL9)

はじめに

今回はbindを利用して権威DNSサーバを構築してみようと思います。
AWSには権威DNSサーバとしての機能も持つ、Route53というとても優秀で便利なサービスがありますが、そうした中でわざわざbindで権威DNSサーバを構築する理由は大きく3点です。

  1. Route53を利用していないシステムはたくさんある。
  2. DNSの仕組みを、実際に構築することを通して理解することができる。
  3. クラウドでしかできない技術者にはなりたくない。

1について、AWSを利用した業務に携わっていようと外部との連携は普通にあります。そのときRoute53しか知らないでは話になりません。

2について、やはり作ってみないと分からないことはたくさんあります。どんなに分かりやすい本を読んで理解した気になっても、実際に作ってみようとするとうまくいかないことの方が多いはずです。机上で学習したときには気づかなかったその見えない壁こそが、周囲との差をつけ、自分をワンアップさせる知識につながるのではないかと思います。

3について、AWSはRoute53含め非常に便利なサービスを数多く提供しています。ただ、ユーザがその便利さにかまけてしまえば、そのユーザの技術力は便利さありきのレベルになってしまいます。筆者は、クラウドの便利さを享受しつつ、クラウドでしかできないは甘受しないエンジニアでありたいと考えています。

このような動機のもと、以下では実際にbindを利用して権威DNSサーバを構築してみたいと思います。

環境

検証では以下の環境を想定しています。

  • Route53にドメイン登録済み
  • サーバはRHEL9 on EC2 (ami-0a3299a47e8a9111b)
  • bindのバージョンは9.16.23-14.el9_3
  • SELinuxは有効
  • EC2はパブリックサブネットに配置
  • セキュリティグループはinboundに対してport53のtcp/udpを両方開ける

本記事では、以上のような前提のもと、Route53管理下のドメインの配下にサブドメインを作り、その管理を委任する形で権威サーバを構築することを狙いとします。

結論ファースト

権威DNSを構築するうえで必要なことはざっくり3つです。

  1. 設定ファイル(/etc/named.conf)を編集
  2. ゾーンデータ(ファイル)を作成
  3. 上位ドメインを管理する権威DNS(筆者環境ではroute53)に、今回作成するサブドメインの管理を、EC2上に作成する権威DNSサーバに委任させるレコードを追加

細かい手順や設定内容などについては以下で詳らかにしていきます。
では、検証を始めましょう。

※ 以下で登場するドメイン名、パブリックIPアドレスなどは後からすべて架空のものに変更しています。読者の方で試される場合は適宜ご自身の環境のものに読み替えていただけますと幸いです。

検証

検証手順

今回は以下の手順で実施していきたいと思います。

ステップ カテゴリ 内容
1 bindで権威DNSサーバの構築 – SELinuxの有効化(確認)
– bindのインストール
– /etc/named.confの編集
– ゾーンデータ(ファイル)を作成・編集
– namedサービスの有効化・起動
2 Route53でサブドメインの管理を委任 – NSレコードの追加
– Aレコードの追加
3 名前解決をテスト – NS レコード
– A レコード
– 再帰問い合わせの拒否

bindで権威DNSサーバの構築

SELinuxの有効化(確認)

先ずはSElinuxの確認です。
RHELのdocを読むと、chroot環境よりもSELinux環境の方がbindの脆弱性に対してセキュアだとありました。

Running BIND on RHEL with SELinux in enforcing mode is more secure than running BIND in a change-root environment.

SELinuxを現場で利用しているところはひょっとすると少ないかもしれませんが、今回は個人の検証環境なので推奨に従ってSELinuxを有効化した環境で権威サーバを構築したいと思います。

ということで、SELinuxが有効であることを確認します。

[root@ip-10-0-1-89 ~]# getenforce
Enforcing

RHEL9ではSELinuxをかなり推奨していますのでデフォルトで有効になっています。きっちりEnforcingと表示も確認できました。

bindのインストール

次に、bind本体のbindパッケージと、ついでにdigなどのクライアントユーティリティが含まれるbind-utilsパッケージをインストールします。出力結果にComplete!と表示されればOKです。

[root@ip-10-0-1-89 ~]# dnf install bind bind-utils
Updating Subscription Management repositories.
Unable to read consumer identity

This system is not registered with an entitlement server. You can use subscription-manager to register.

Last metadata expiration check: 1:59:18 ago on Sat 13 Jan 2024 11:11:43 AM UTC.
Dependencies resolved.
==================================================================================================================================================================================================================
 Package                                           Architecture                           Version                                                Repository                                                  Size
==================================================================================================================================================================================================================
Installing:
 bind                                              x86_64                                 32:9.16.23-14.el9_3                                    rhel-9-appstream-rhui-rpms                                 506 k
 bind-utils                                        x86_64                                 32:9.16.23-14.el9_3                                    rhel-9-appstream-rhui-rpms                                 211 k
Installing dependencies:
 bind-dnssec-doc                                   noarch                                 32:9.16.23-14.el9_3                                    rhel-9-appstream-rhui-rpms                                  48 k
 bind-libs                                         x86_64                                 32:9.16.23-14.el9_3                                    rhel-9-appstream-rhui-rpms                                 1.2 M
 bind-license                                      noarch                                 32:9.16.23-14.el9_3                                    rhel-9-appstream-rhui-rpms                                  13 k
 fstrm                                             x86_64                                 0.6.1-3.el9                                            rhel-9-appstream-rhui-rpms                                  30 k
 libuv                                             x86_64                                 1:1.42.0-1.el9                                         rhel-9-appstream-rhui-rpms                                 153 k
 protobuf-c                                        x86_64                                 1.3.3-13.el9                                           rhel-9-baseos-rhui-rpms                                     37 k
 python3-bind                                      noarch                                 32:9.16.23-14.el9_3                                    rhel-9-appstream-rhui-rpms                                  71 k
 python3-ply                                       noarch                                 3.11-14.el9                                            rhel-9-appstream-rhui-rpms                                 111 k
Installing weak dependencies:
 bind-dnssec-utils                                 x86_64                                 32:9.16.23-14.el9_3                                    rhel-9-appstream-rhui-rpms                                 119 k

Transaction Summary
==================================================================================================================================================================================================================
Install  11 Packages

Total download size: 2.5 M
Installed size: 7.1 M
Is this ok [y/N]: y
Downloading Packages:
(1/11): fstrm-0.6.1-3.el9.x86_64.rpm                                                                                                                                              454 kB/s |  30 kB     00:00
(2/11): libuv-1.42.0-1.el9.x86_64.rpm                                                                                                                                             2.0 MB/s | 153 kB     00:00
(3/11): python3-ply-3.11-14.el9.noarch.rpm                                                                                                                                        1.4 MB/s | 111 kB     00:00
(4/11): bind-dnssec-doc-9.16.23-14.el9_3.noarch.rpm                                                                                                                               3.4 MB/s |  48 kB     00:00
(5/11): bind-9.16.23-14.el9_3.x86_64.rpm                                                                                                                                           16 MB/s | 506 kB     00:00
(6/11): bind-dnssec-utils-9.16.23-14.el9_3.x86_64.rpm                                                                                                                             3.9 MB/s | 119 kB     00:00
(7/11): bind-license-9.16.23-14.el9_3.noarch.rpm                                                                                                                                  540 kB/s |  13 kB     00:00
(8/11): python3-bind-9.16.23-14.el9_3.noarch.rpm                                                                                                                                  2.1 MB/s |  71 kB     00:00
(9/11): bind-utils-9.16.23-14.el9_3.x86_64.rpm                                                                                                                                    9.9 MB/s | 211 kB     00:00
(10/11): protobuf-c-1.3.3-13.el9.x86_64.rpm                                                                                                                                       2.5 MB/s |  37 kB     00:00
(11/11): bind-libs-9.16.23-14.el9_3.x86_64.rpm                                                                                                                                     19 MB/s | 1.2 MB     00:00
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Total                                                                                                                                                                              10 MB/s | 2.5 MB     00:00
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
  Preparing        :                                                                                                                                                                                          1/1
  Installing       : protobuf-c-1.3.3-13.el9.x86_64                                                                                                                                                          1/11
  Installing       : bind-license-32:9.16.23-14.el9_3.noarch                                                                                                                                                 2/11
  Installing       : fstrm-0.6.1-3.el9.x86_64                                                                                                                                                                3/11
  Installing       : libuv-1:1.42.0-1.el9.x86_64                                                                                                                                                             4/11
  Installing       : bind-libs-32:9.16.23-14.el9_3.x86_64                                                                                                                                                    5/11
  Installing       : bind-utils-32:9.16.23-14.el9_3.x86_64                                                                                                                                                   6/11
  Installing       : bind-dnssec-doc-32:9.16.23-14.el9_3.noarch                                                                                                                                              7/11
  Installing       : python3-ply-3.11-14.el9.noarch                                                                                                                                                          8/11
  Installing       : python3-bind-32:9.16.23-14.el9_3.noarch                                                                                                                                                 9/11
  Installing       : bind-dnssec-utils-32:9.16.23-14.el9_3.x86_64                                                                                                                                           10/11
  Running scriptlet: bind-32:9.16.23-14.el9_3.x86_64                                                                                                                                                        11/11
  Installing       : bind-32:9.16.23-14.el9_3.x86_64                                                                                                                                                        11/11
  Running scriptlet: bind-32:9.16.23-14.el9_3.x86_64                                                                                                                                                        11/11
  Verifying        : libuv-1:1.42.0-1.el9.x86_64                                                                                                                                                             1/11
  Verifying        : fstrm-0.6.1-3.el9.x86_64                                                                                                                                                                2/11
  Verifying        : python3-ply-3.11-14.el9.noarch                                                                                                                                                          3/11
  Verifying        : bind-32:9.16.23-14.el9_3.x86_64                                                                                                                                                         4/11
  Verifying        : bind-dnssec-doc-32:9.16.23-14.el9_3.noarch                                                                                                                                              5/11
  Verifying        : bind-dnssec-utils-32:9.16.23-14.el9_3.x86_64                                                                                                                                            6/11
  Verifying        : bind-license-32:9.16.23-14.el9_3.noarch                                                                                                                                                 7/11
  Verifying        : python3-bind-32:9.16.23-14.el9_3.noarch                                                                                                                                                 8/11
  Verifying        : bind-libs-32:9.16.23-14.el9_3.x86_64                                                                                                                                                    9/11
  Verifying        : bind-utils-32:9.16.23-14.el9_3.x86_64                                                                                                                                                  10/11
  Verifying        : protobuf-c-1.3.3-13.el9.x86_64                                                                                                                                                         11/11
Installed products updated.

Installed:
  bind-32:9.16.23-14.el9_3.x86_64        bind-dnssec-doc-32:9.16.23-14.el9_3.noarch  bind-dnssec-utils-32:9.16.23-14.el9_3.x86_64  bind-libs-32:9.16.23-14.el9_3.x86_64  bind-license-32:9.16.23-14.el9_3.noarch
  bind-utils-32:9.16.23-14.el9_3.x86_64  fstrm-0.6.1-3.el9.x86_64                    libuv-1:1.42.0-1.el9.x86_64                   protobuf-c-1.3.3-13.el9.x86_64        python3-bind-32:9.16.23-14.el9_3.noarch
  python3-ply-3.11-14.el9.noarch

Complete!

無事Complete!と表示されました。

これによって、namedユニットがインストールされます。
実際、systemctlで確認してみると、inactive (dead)ですが存在していますね。

[root@ip-10-0-1-89 ~]# systemctl status named
○ named.service - Berkeley Internet Name Domain (DNS)
     Loaded: loaded (/usr/lib/systemd/system/named.service; disabled; preset: disabled)
     Active: inactive (dead)

マニュアルによると、このnamedこそがDNSサービス本体です。

named is a Domain Name System (DNS) server, part of the BIND 9 distribution from ISC. For more information on the DNS, see RFCs 1033, 1034, and 1035.

/etc/named.confの編集

このnamedの設定ファイルはnamed.confにありますので、catを使って中身を確認してみます。

以下の出力結果の22行目と23行目に注目していただきたいのですが、Optionsステートメントのコメントアウトで、

AUTHORITATIVE DNS server を構築したいなら recursion は無効化しなさい。
RECURSION (caching) DNS server を構築したいなら recursion を有効化しなさい。

とあります。
今回構築するのは権威サーバ(authoritative dns server)ですので、recursionを無効にする必要があります。これは、権威サーバの場合インターネットに公開することが想定されますが、その権威サーバがフルリゾルバ(RECURSION DNS server)としても機能する場合、DNSリフレクター攻撃の踏み台となったりするなど、サイバー攻撃を受けやすくしてしまう恐れがあるためです。

※1) フルリゾルバや権威サーバの違いについては、残念ながらボリュームが非常に大きくなってしまうため本稿では説明しませんが、記事最後の参考に、お勧めの書籍を記載しておきますので、気になられる方はぜひ一度お読みください。先述したDNSリフレクターなどのセキュリティの話も含め、非常に分かりやすくかつ体系的にDNSを理解できること請け合いです。

※2) named.confの読み方や各設定値についてはBIND 9 Administrator Reference Manualに詳しいです。URLについては記事最後の参考をご参照ください。

[root@ip-10-0-1-89 ~]# cat -n /etc/named.conf
     1  //
     2  // named.conf
     3  //
     4  // Provided by Red Hat bind package to configure the ISC BIND named(8) DNS
     5  // server as a caching only nameserver (as a localhost DNS resolver only).
     6  //
     7  // See /usr/share/doc/bind*/sample/ for example named configuration files.
     8  //
     9
    10  options {
    11          listen-on port 53 { 127.0.0.1; };
    12          listen-on-v6 port 53 { ::1; };
    13          directory       "/var/named";
    14          dump-file       "/var/named/data/cache_dump.db";
    15          statistics-file "/var/named/data/named_stats.txt";
    16          memstatistics-file "/var/named/data/named_mem_stats.txt";
    17          secroots-file   "/var/named/data/named.secroots";
    18          recursing-file  "/var/named/data/named.recursing";
    19          allow-query     { localhost; };
    20
    21          /*
    22           - If you are building an AUTHORITATIVE DNS server, do NOT enable recursion.
    23           - If you are building a RECURSIVE (caching) DNS server, you need to enable
    24             recursion.
    25           - If your recursive DNS server has a public IP address, you MUST enable access
    26             control to limit queries to your legitimate users. Failing to do so will
    27             cause your server to become part of large scale DNS amplification
    28             attacks. Implementing BCP38 within your network would greatly
    29             reduce such attack surface
    30          */
    31          recursion yes;
    32
    33          dnssec-validation yes;
    34
    35          managed-keys-directory "/var/named/dynamic";
    36          geoip-directory "/usr/share/GeoIP";
    37
    38          pid-file "/run/named/named.pid";
    39          session-keyfile "/run/named/session.key";
    40
    41          /* https://fedoraproject.org/wiki/Changes/CryptoPolicy */
    42          include "/etc/crypto-policies/back-ends/bind.config";
    43  };
    44
    45  logging {
    46          channel default_debug {
    47                  file "data/named.run";
    48                  severity dynamic;
    49          };
    50  };
    51
    52  zone "." IN {
    53          type hint;
    54          file "named.ca";
    55  };
    56
    57  include "/etc/named.rfc1912.zones";
    58  include "/etc/named.root.key";
    59

では実際にコンフィグファイルを編集していきましょう。
まずrecursionを無効化します。

sed -i -r 's/(recursion )yes/\1no/g' /etc/named.conf

次に、allow-query-cacheのリストをnoneにします。
allow-query-cacheもrecursionに関連するもので、recursionを無効化するとデフォルトで無効化されますが、念のためここでも明示的に無効化しておきます。

sed -i -r '/recursion yes;/a \        allow-query-cache { none; };' /etc/named.conf

この権威サーバはインターネット上に公開する想定のため、すべてのIPアドレスからの問い合わせを許可します。

sed -i -r 's/(allow-query     \{ )localhost/\1any/g' /etc/named.conf

上に同じく、queryを投げられるipアドレスは絞らないため、以下二行でデフォルトのステートメントをコメントアウトします。

sed -i -r 's/listen-on port 53 \{ 127.0.0.1; \};/#&/g' /etc/named.conf
sed -i -r 's/listen-on-v6 port 53 \{ ::1; \};/#&/g' /etc/named.conf

次に、この権威サーバーが管理者として委任されるサブドメインとなるゾーン(正引き)を定義します。
親ドメインがhogehoge.comのため、サブドメインをfugafuga.hogehoge.comとして定義します。
以下のコマンドを実行します。

cat <<EOF >> /etc/named.conf
zone "fugafuga.hogehoge.com" {
  type master;
  file "fugafuga.hogehoge.com";
};

EOF

このコマンドによる設定内容は以下の通りです。

  • type masterによって、このサーバがfugafuga.hogehoge.comというゾーンのマスターの権威サーバであることを設定します。(今回は作成しませんが、通常、権威DNSは冗長化構成を取ります。その場合、masterとは別にslaveを作成するため、上記のような設定項目があります。)
  • file "fugafuga.hogehoge.com"はゾーンデータの場所を指定しています。
    named.confの13行目にdirectory "/var/named";というステートメントがありましたが、これは以降の相対パスのベースを示しています。
    つまり、ゾーンデータは、/var/named/fugafuga.hogehoge.comにあるぞ、と指示したことになります。

named.confの設定は以上ですので、最終的なファイルの内容を確認してみましょう。
以下のようになっています。

[root@ip-10-0-0-122 ~]# cat -n /etc/named.conf
     1  //
     2  // named.conf
     3  //
     4  // Provided by Red Hat bind package to configure the ISC BIND named(8) DNS
     5  // server as a caching only nameserver (as a localhost DNS resolver only).
     6  //
     7  // See /usr/share/doc/bind*/sample/ for example named configuration files.
     8  //
     9
    10  options {
    11          #listen-on port 53 { 127.0.0.1; };
    12          #listen-on-v6 port 53 { ::1; };
    13          directory       "/var/named";
    14          dump-file       "/var/named/data/cache_dump.db";
    15          statistics-file "/var/named/data/named_stats.txt";
    16          memstatistics-file "/var/named/data/named_mem_stats.txt";
    17          secroots-file   "/var/named/data/named.secroots";
    18          recursing-file  "/var/named/data/named.recursing";
    19          allow-query     { any; };
    20
    21          /*
    22           - If you are building an AUTHORITATIVE DNS server, do NOT enable recursion.
    23           - If you are building a RECURSIVE (caching) DNS server, you need to enable
    24             recursion.
    25           - If your recursive DNS server has a public IP address, you MUST enable access
    26             control to limit queries to your legitimate users. Failing to do so will
    27             cause your server to become part of large scale DNS amplification
    28             attacks. Implementing BCP38 within your network would greatly
    29             reduce such attack surface
    30          */
    31          recursion no;
    32
    33          dnssec-validation yes;
    34
    35          managed-keys-directory "/var/named/dynamic";
    36          geoip-directory "/usr/share/GeoIP";
    37
    38          pid-file "/run/named/named.pid";
    39          session-keyfile "/run/named/session.key";
    40
    41          /* https://fedoraproject.org/wiki/Changes/CryptoPolicy */
    42          include "/etc/crypto-policies/back-ends/bind.config";
    43  };
    44
    45  logging {
    46          channel default_debug {
    47                  file "data/named.run";
    48                  severity dynamic;
    49          };
    50  };
    51
    52  zone "." IN {
    53          type hint;
    54          file "named.ca";
    55  };
    56
    57  include "/etc/named.rfc1912.zones";
    58  include "/etc/named.root.key";
    59
    60  zone "fugafuga.hogehoge.com" {
    61    type master;
    62    file "fugafuga.hogehoge.com";
    63  };
    64

この設定ファイルが問題ないか、named-checkconfを利用して構文チェックを行います。
標準出力に何も出力されなければnamed.confの構文は正しいことが確認できます。

[root@ip-10-0-1-89 ~]# named-checkconf
[root@ip-10-0-1-89 ~]#

OKですね。

ゾーンデータ(ファイル)を作成・編集

では、次にzoneステートメントのfileで指定したゾーンデータのファイルを作成していきます。

ゾーンデータとなるファイルを作成します。

touch /var/named/fugafuga.hogehoge.com

設定値を追記します。
※ヒアドキュメントを利用する場合、’$’を’\’でエスケープするのがポイントです。
これをしないと変数展開の結果最初にスペースが入り、構文チェックでエラーを起こします。

cat << EOF >> /var/named/fugafuga.hogehoge.com
\$TTL 8h
\$ORIGIN fugafuga.hogehoge.com.
@       IN SOA (
        ns1.fugafuga.hogehoge.com.   ; MNAME
        admin.fugafuga.hogehoge.com. ; RNAME
        2023011401                  ; SERIAL
        1d                          ; REFRESH
        3h                          ; RETRY
        3d                          ; EXPIRE
        3h )                        ; MINIMUM

        NS                          ns1
ns1     A                           33.33.33.33
EOF

念のため、ファイルの中身を確認してみます。

[root@ip-10-0-0-122 ~]# cat /var/named/fugafuga.hogehoge.com
$TTL 8h
$ORIGIN fugafuga.hogehoge.com.
@       IN SOA (
        ns1.fugafuga.hogehoge.com.   ; MNAME
        admin.fugafuga.hogehoge.com. ; RNAME
        2023011401                  ; SERIAL
        1d                          ; REFRESH
        3h                          ; RETRY
        3d                          ; EXPIRE
        3h )                        ; MINIMUM

        NS                          ns1
ns1     A                           33.33.33.33

ちゃんと$も変数展開されず、余計なスペースが入っていないことが確認できました。

次に、ファイルのパーミッションを、namedグループのみ読み取り可能となるようセットします。

chown root:named /var/named/fugafuga.hogehoge.com
chmod 640 /var/named/fugafuga.hogehoge.com

ゾーンデータの設定は以上で完了ですので、named-checkzoneというユーティリティを使って構文チェックを行います。

[root@ip-10-0-1-89 ~]# named-checkzone fugafuga.hogehoge.com /var/named/fugafuga.hogehoge.com
zone fugafuga.hogehoge.com/IN: loaded serial 2023011401
OK

無事、OKと表示されましたね。

namedサービスの有効化・起動

設定ファイルが完成しましたので、namedサービスを有効化します。

[root@ip-10-0-1-89 ~]# systemctl enable --now named
Created symlink /etc/systemd/system/multi-user.target.wants/named.service → /usr/lib/systemd/system/named.service.

namedサービスのステータスを確認してみます。

[root@ip-10-0-1-89 ~]# systemctl status named
● named.service - Berkeley Internet Name Domain (DNS)
     Loaded: loaded (/usr/lib/systemd/system/named.service; enabled; preset: disabled)
     Active: active (running) since Sun 2024-01-14 14:58:37 UTC; 21s ago
    Process: 3228 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>
    Process: 3230 ExecStart=/usr/sbin/named -u named -c ${NAMEDCONF} $OPTIONS (code=exited, status=0/SUCCESS)
   Main PID: 3231 (named)
      Tasks: 4 (limit: 4329)
     Memory: 22.8M
        CPU: 51ms
     CGroup: /system.slice/named.service
             └─3231 /usr/sbin/named -u named -c /etc/named.conf

無事有効化されました。
これでEC2インスタンス側の設定は全て完了です。

次は、上位ドメインに対して、今回作成したゾーン(サブドメイン)の管理を今回作成した権威DNSサーバに委任する設定を行います。
筆者の環境では、上位ドメインをroute53で管理しているため、route53に設定(レコード)を追加していきます。

Route53でサブドメインの管理を委任

管理を委任するといっても、具体的にすることは以下二つです。

  • NSレコードの追加
  • Aレコードの追加

NSレコードによって、「対象のサブドメインの管理先は○○の権威DNSサーバにありますよ」、という設定をすることができます。

また、Aレコードによって、「その権威DNSサーバのIPアドレスは○○ですよ」、という設定をすることができます。

これらの設定の組み合わせによって、管理の委任と同時に再帰問い合わせが実現されるというわけですね。

では、以下で実際にレコードの追加を行ってきます。

NSレコードの追加

まずはNSレコードです。
画像は省略してしまいますが、Route53のナビゲーションペインからホストゾーンのページを開き、対象のホストゾーンを選択したら、右上の[レコードを作成]を押して、以下の要領に従ってレコードを追加してみましょう

  1. レコード名は権威DNSサーバでゾーン定義したサブドメインとなる値を入力します。
  2. レコードタイプはNSを選びましょう。
  3. は絶対ドメイン名で権威DNSサーバのホストネーム(末尾に’.’)を指定します。
  4. TTLはお好きな値を設定します。
  5. ルーティングポリシーについては、シンプルルーティングで今回の要件を十分に満たしますので、シンプルルーティングを選びます。
  6. 最後に右下のレコードを作成をクリックしてNSレコードの追加が完了です。

Aレコードの追加

次にAレコードです。
画像は省略してしまいますが、NSレコード同じページから以下要領にしたがってレコードを追加します。

  1. レコード名はNSレコードの値として入力した権威DNSサーバ(プライマリ)のホストネームを入力します。
  2. レコードタイプはAを選びましょう。
  3. はパブリックIPを指定します。
  4. TTLはお好きな値を設定します。
  5. ルーティングポリシーについては、NSの時と同じ理由でシンプルルーティングを選びます。
  6. 最後に右下のレコードを作成をクリックしてAレコードの追加が完了です。

名前解決をテスト

さて、ここまでの作業で名前解決ができるようになりました。
実際にテストを行ってみます。

以下のテストケースに沿ってテストを行ってみたいと思います。

ケースID テストの説明 コマンド 期待される結果
#1 NS レコードの確認 dig +norec @ns1.fugafuga.hogehoge.com fugafuga.hogehoge.com NS fugafuga.hogehoge.com の NS レコードが ns1.fugafuga.hogehoge.com として返されること。
#2 A レコードの確認 dig +norec @ns1.fugafuga.hogehoge.com ns1.fugafuga.hogehoge.com A ns1.fugafuga.hogehoge.com の A レコードが IP アドレス 33.33.33.33 として返されること。
#3 再帰問い合わせの拒否の確認 dig @ns1.fugafuga.hogehoge.com google.com ステータスが REFUSED として返され、再帰問い合わせが拒否されること。

#1 NS レコードの確認

digの+norecは非再帰問い合わせを指定するオプションです。@ホスト名で問い合わせ先を指定できます。つまり、実行コマンドはns1.fugafuga.hogehoge.com に対して、非再帰問い合わせを行っています。そして、以下の実行結果から、fugafuga.hogehoge.com ドメインの NS レコードが正常に名前解決されたことが分かります。応答には NOERROR ステータスが含まれ、ANSWER SECTION:にてns1.fugafuga.hogehoge.com が正しく NS レコードとしてリストされています。これは、権威DNSサーバーが指定されたドメインの名前解決を正確に行っていることを示しており、NS レコードのテストケースはクリアされています。

hoge@fuga:~ dig +norec @ns1.fugafuga.hogehoge.com fugafuga.hogehoge.com NS

; <<>> DiG 9.18.12-0ubuntu0.22.04.3-Ubuntu <<>> +norec @ns1.fugafuga.hogehoge.com fugafuga.hogehoge.com NS
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 28507
;; flags: qr aa; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 2

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
; COOKIE: 1b35bccbc509fea10100000065abd50b0ec1e1699425ccf7 (good)
;; QUESTION SECTION:
;fugafuga.hogehoge.com.          IN      NS

;; ANSWER SECTION:
fugafuga.hogehoge.com.   28800   IN      NS      ns1.fugafuga.hogehoge.com.

;; ADDITIONAL SECTION:
ns1.fugafuga.hogehoge.com. 28800 IN      A       33.33.33.33

;; Query time: 10 msec
;; SERVER: 33.33.33.33#53(ns1.fugafuga.hogehoge.com) (UDP)
;; WHEN: Sat Jan 20 18:19:59 JST 2024
;; MSG SIZE  rcvd: 111

#2 A レコードの確認

以下の実行結果を見てみると、ns1.fugafuga.hogehoge.com の A レコードのクエリに対する応答も NOERROR ステータスを持っており、ANSWER SECTION:にて正確な IP アドレス 33.33.33.33 が返されています。これは、指定されたホスト名が適切に IP アドレスに解決されており、A レコードのテストケースも成功裏にクリアされていることを意味します。

hoge@fuga:~ dig +norec @ns1.fugafuga.hogehoge.com ns1.fugafuga.hogehoge.com A

; <<>> DiG 9.18.12-0ubuntu0.22.04.3-Ubuntu <<>> +norec @ns1.fugafuga.hogehoge.com ns1.fugafuga.hogehoge.com A
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 64111
;; flags: qr aa; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
; COOKIE: 3224a19dccb59ce90100000065abd6e285b31db7489433ce (good)
;; QUESTION SECTION:
;ns1.fugafuga.hogehoge.com.      IN      A

;; ANSWER SECTION:
ns1.fugafuga.hogehoge.com. 28800 IN      A       33.33.33.33

;; AUTHORITY SECTION:
fugafuga.hogehoge.com.   28800   IN      NS      ns1.fugafuga.hogehoge.com.

;; Query time: 10 msec
;; SERVER: 33.33.33.33#53(ns1.fugafuga.hogehoge.com) (UDP)
;; WHEN: Sat Jan 20 18:28:30 JST 2024
;; MSG SIZE  rcvd: 111

#3 再帰問い合わせの拒否の確認

以下では、dig コマンドに@ns1.fugafuga.hogehoge.comをつけることで、ns1.fugafuga.hogehoge.com を問い合わせ先に指定しています。今回は+norecがついていませんので、google.comの名前解決の際に再帰問い合わせが行われることになります。結果をみてみると、ステータスが REFUSED が返されていることが分かります。これは、権威DNSサーバーが再帰問い合わせを拒否していることを示しており、意図した通り、フルリゾルバとしての機能を無効化できていることが確認できます。もちろんテストケースはクリアです。

hoge@fuga:~ dig  @ns1.fugafuga.hogehoge.com google.com

; <<>> DiG 9.18.12-0ubuntu0.22.04.3-Ubuntu <<>> @ns1.fugafuga.hogehoge.com google.com
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: REFUSED, id: 37402
;; flags: qr rd; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 1
;; WARNING: recursion requested but not available

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
; COOKIE: 312a44106396437d0100000065abd792684862db5ab6909f (good)
;; QUESTION SECTION:
;google.com.                    IN      A

;; Query time: 10 msec
;; SERVER: 33.33.33.33#53(ns1.fugafuga.hogehoge.com) (UDP)
;; WHEN: Sat Jan 20 18:31:40 JST 2024
;; MSG SIZE  rcvd: 67

以上!!
無事名前解決できることが確認できました!!

おわりに

本当はslaveも作成して冗長化しようと思いましたが、記事が長くなるのでやめました。ごめんなさい。
それではまたお会いしましょう。
あでゅーー

参考

Last modified: 2024-01-21

Author