はじめに
今回はbindを利用して権威DNSサーバを構築してみようと思います。
AWSには権威DNSサーバとしての機能も持つ、Route53というとても優秀で便利なサービスがありますが、そうした中でわざわざbindで権威DNSサーバを構築する理由は大きく3点です。
- Route53を利用していないシステムはたくさんある。
- DNSの仕組みを、実際に構築することを通して理解することができる。
- クラウドでしかできない技術者にはなりたくない。
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つです。
- 設定ファイル(/etc/named.conf)を編集
- ゾーンデータ(ファイル)を作成
- 上位ドメインを管理する権威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パッケージをインストールします。出力結果に
と表示されればOKです。Complete!
[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
このコマンドによる設定内容は以下の通りです。
によって、このサーバがfugafuga.hogehoge.comというゾーンのマスターの権威サーバであることを設定します。(今回は作成しませんが、通常、権威DNSは冗長化構成を取ります。その場合、masterとは別にslaveを作成するため、上記のような設定項目があります。)type master
はゾーンデータの場所を指定しています。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のナビゲーションペインからホストゾーンのページを開き、対象のホストゾーンを選択したら、右上の[レコードを作成]を押して、以下の要領に従ってレコードを追加してみましょう
は権威DNSサーバでゾーン定義したサブドメインとなる値を入力します。レコード名
はNSを選びましょう。レコードタイプ
は絶対ドメイン名で権威DNSサーバのホストネーム(末尾に’.’)を指定します。値
はお好きな値を設定します。TTL
については、シンプルルーティングで今回の要件を十分に満たしますので、シンプルルーティングを選びます。ルーティングポリシー
- 最後に右下の
をクリックしてNSレコードの追加が完了です。レコードを作成
Aレコードの追加
次にAレコードです。
画像は省略してしまいますが、NSレコード同じページから以下要領にしたがってレコードを追加します。
はNSレコードの値として入力した権威DNSサーバ(プライマリ)のホストネームを入力します。レコード名
はAを選びましょう。レコードタイプ
はパブリックIPを指定します。値
はお好きな値を設定します。TTL
については、NSの時と同じ理由でシンプルルーティングを選びます。ルーティングポリシー
- 最後に右下の
をクリックして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 ステータスが含まれ、
にてns1.fugafuga.hogehoge.com が正しく NS レコードとしてリストされています。これは、権威DNSサーバーが指定されたドメインの名前解決を正確に行っていることを示しており、NS レコードのテストケースはクリアされています。ANSWER SECTION:
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 ステータスを持っており、
にて正確な IP アドレス 33.33.33.33 が返されています。これは、指定されたホスト名が適切に IP アドレスに解決されており、A レコードのテストケースも成功裏にクリアされていることを意味します。ANSWER SECTION:
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の名前解決の際に再帰問い合わせが行われることになります。結果をみてみると、ステータスが
が返されていることが分かります。これは、権威DNSサーバーが再帰問い合わせを拒否していることを示しており、意図した通り、フルリゾルバとしての機能を無効化できていることが確認できます。もちろんテストケースはクリアです。REFUSED
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も作成して冗長化しようと思いましたが、記事が長くなるのでやめました。ごめんなさい。
それではまたお会いしましょう。
あでゅーー
参考
-
『DNSがよくわかる教科書』(書籍)
フルリゾルバと権威サーバの違いそのほかDNS周りの知識について非常に分かりやすく解説されています。大変勉強になりますのでおすすめです!
https://amzn.asia/d/dO5CSTT -
公式のマニュアル(BIND 9 Administrator Reference Manual)
設定値一つ一つの意味を確認するのにとても参考になりました。きっちり理解したうえで設定したい方はこちら。
https://bind9.readthedocs.io/en/latest/ -
RHEL9-doc
※ 手順通り構築するとフルリゾルバと権威サーバが同居する設定となってしまいます。
分けるのがベストプラクティスですので注意です。
https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/9/html/managing_networking_infrastructure_services/assembly_setting-up-and-configuring-a-bind-dns-server_networking-infrastructure-services#doc-wrapper -
ブログ(BIND 9.10.2 の公式マニュアルに学ぶ DNS の基本)
https://www.qoosky.io/techs/bfd754c61f -
ブログ(【BIND】権威DNSサーバの構築)
https://qiita.com/OPySPGcLYpJE0Tc/items/2f02280efe96c8faf566 -
named(8) – Linux man page
https://linux.die.net/man/8/named -
named.conf(5) – Linux man page
https://linux.die.net/man/5/named.conf -
ゾーンの構文チェックでエラーが出た際参考になりました。
https://serverfault.com/questions/798031/no-current-owner-name-error-when-running-named-checkzone-on-both-forward-and-rev