Linuxサーバー構築標準教科書通りにDNSサーバーを構築してみる(備忘録)その2

# 内容
今回は、[Linuxサーバー構築標準教科書(Ver.3.0.2) ](https://linuc.org/textbooks/server/)を参照し構築。
資料と異なり、Oracle Linuxを使用。
今回はコンテンツサーバーの構築。
キャッシュサーバーの構築は、[以前の記事](https://qiita.com/gontyan/items/6205cdd474a6f18a8c83)に記載

# 参考資料
>[Linuxサーバー構築標準教科書(Ver.3.0.2) ](https://linuc.org/textbooks/server/)


# 検証環境
* VMware Workstation 16 Player
  * Oracle Linux　8.7.0
* bind9.16-chroot.x86_64
* bind9.16.x86_64

# インストール

bind-chrootはbindを実行したとき、/var/named/chrootディレクトリをルートディレクトリとして動作させるためのもの。
また、動作確認用にbind-utilsもインストールする。
バージョンもキャッシュサーバーと同じものを使用

```shell-session:
[root@ContentsServerB dnsuser]# dnf list | grep bind9
bind9.16.x86_64                                        32:9.16.23-0.9.el8.1                                        @ol8_appstream
bind9.16-chroot.x86_64                                 32:9.16.23-0.9.el8.1                                        @ol8_appstream
bind9.16-libs.x86_64                                   32:9.16.23-0.9.el8.1                                        @ol8_appstream
bind9.16-license.noarch                                32:9.16.23-0.9.el8.1                                        @ol8_appstream
bind9.16-utils.x86_64                                  32:9.16.23-0.9.el8.1                                        @ol8_appstream
bind9.16.src                                           32:9.16.23-0.9.el8.1                                        ol8_appstream                                           32:9.16.23-0.9
[root@ContentsServerB dnsuser]# dnf installed bind9.16-utils.x86_64 bind9.16-chroot.x86_64 bind9.16.x86_64
```
<br>

<br>
正常にインストールされていることを確認

```shell-session:
[root@ContentsServerB dnsuser]# dnf list installed | grep bind
bind9.16.x86_64                             32:9.16.23-0.9.el8.1                        @ol8_appstream
bind9.16-chroot.x86_64                      32:9.16.23-0.9.el8.1                        @ol8_appstream
bind9.16-libs.x86_64                        32:9.16.23-0.9.el8.1                        @ol8_appstream
bind9.16-license.noarch                     32:9.16.23-0.9.el8.1                        @ol8_appstream
bind9.16-utils.x86_64                       32:9.16.23-0.9.el8.1                        @ol8_appstream
[root@ContentsServerB dnsuser]#
```
ContentsB、ContentsCの両方で正常にインストールされていることを確認する。

# 設定
コンテンツサーバーは、キャッシュサーバーへ追加するためのゾーンを設定する必用がある。
ゾーンを追加するためには、

* name.conf(bindの基本設定ファイル)へゾーンを追加
* ゾーンファイルを記述

を実施する必用がある。
<br>

<b>1. named.confへZoneの設定の追加</b>
以下の状態へ変更。


```shell:/etc/named.conf
options {
        listen-on port 53 { 127.0.0.1; 192.168.10.3; };　→有効化するインターフェースの情報を記載。
        listen-on-v6 port 53 { ::1; };
        directory       "/var/named";
        dump-file       "/var/named/data/cache_dump.db";
        statistics-file "/var/named/data/named_stats.txt";
        memstatistics-file "/var/named/data/named_mem_stats.txt";
        secroots-file   "/var/named/data/named.secroots";
        recursing-file  "/var/named/data/named.recursing";
        allow-query     { any; };　　　　　　　　　　　　　→localhostからanyへ修正しlocalhost以外にもこのサーバーへDNS問い合わせができるようにする。
        recursion no;　                                 →yesの場合、リゾルバー(キャッシュサーバーのように名前解決を行う)動作をする。今回はNo

zone "beta.jp" IN {　　　　　　　　　　　　　　　　　　　　 →beta.jpとなっているが、それぞれのZone名を記載する。正引き用のゾーン設定
        type master;
        file "beta.jp.zone";
        allow-update { none;};
};
```
<br>
<br>
<b>2. ゾーンファイルの作成</b>

`/etc/named.conf`で設定したゾーン用のゾーンファイルを作成する。
`/var/named/`へ移動。

```shell-session:
[root@localhost ~]# cd /var/named/
```

`/var/named/named.empty`を`/etc/named.conf`のゾーン設定時に指定した名前に合わせてコピーする。

```shell-session:
[root@localhost ~]# cd /var/named/
[root@localhost named]# ls
chroot  data  dynamic  named.ca  named.empty  named.localhost  named.loopback  slaves
[root@localhost named]# cp -p named.empty beta.jp.zone
[root@localhost named]# ls
beta.jp.zone  chroot  data  dynamic  named.ca  named.empty  named.localhost  named.loopback  slaves
```
コピーが完了したら、ゾーンファイルの編集を行う。

```shell-session:/var/named/beta.jp.zone
$TTL 3H
$ORIGIN beta.jp.

@       IN SOA  @ rname.invalid. (
                                        20230323        ; serial　　→日付
                                        1D      ; refresh
                                        1H      ; retry
                                        1W      ; expire
                                        3H )    ; minimum

        NS      host1.beta.jp.→サーバーのドメイン名を記載
        MX 10   mail.beta.jp. →メール用のドメインを記載


host1   A       192.168.10.3
www     A       192.168.10.3
mail    A       192.168.10.3
vhost1  A       192.168.10.3
vhost2  A       192.168.10.3
→いくつかホストを追加
```


いくつかのDNSレコードの簡単な説明は以下。
他にもレコードはあるので気になる方は調べてみてください。

| レコード | 説明 |
|:-:|:-:|
| SOA  |   ゾーンに関する情報が書かれている。リトライ間隔等|
| A  |  ドメイン名に対応するIPv4アドレスが書かれたレコード |
| AAAA  |  ドメイン名に対応するIPv6アドレスが書かれたレコード |
| MX  |  対象のメールの配送先のホスト名を定義するレコード |
| NS  |  ゾーン情報を管理するネームサーバーのサーバー名を定義するレコード |

<br>
<b>3.ゾーンファイルの構文チェック</b>

作成したゾーンファイルとnamed.confの構文チェックを行う。
問題がなければ以下の状態となる。

```shell-session:
[root@localhost named]# named-checkzone beta.jp. /var/named/beta.jp.zone
zone beta.jp/IN: loaded serial 20230323
OK
[root@localhost named]# named-checkconf
```
named.confの構文チェックでは、間違いがあると以下のような出力がされる。

```shell-session:
[root@localhost named]# named-checkconf
/etc/named.conf:11: missing ';' before '}'
```

<br>
<b>3.ファイアウォール設定</b>

ファイアウォールへDNSを追加し、リロードする。
DNSが追加されていることを確認する。

```shell-session:
[root@localhost named]# firewall-cmd --add-service=dns --permanent
success
[root@localhost named]# firewall-cmd --reload
success
[root@localhost named]#
[root@localhost named]#
[root@localhost named]# firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: ens160 ens224
  sources:
  services: cockpit dhcpv6-client dns ssh
  ports:
  protocols:
  forward: no
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:
```


<b>4.起動</b>

起動して、正常に稼働していることを確認する。

```shell-session:
[root@localhost named]# systemctl start named-chroot
[root@localhost named]# systemctl status named-chroot
● named-chroot.service - Berkeley Internet Name Domain (DNS)
   Loaded: loaded (/usr/lib/systemd/system/named-chroot.service; disabled; vendor preset: disabled)
   Active: active (running) since Wed 2023-03-22 15:02:07 EDT; 9s ago
  Process: 84458 ExecStart=/usr/sbin/named -u named -c ${NAMEDCONF} -t /var/named/chroot $OPTIONS (code=>
  Process: 84456 ExecStartPre=/bin/bash -c if [ ! "$DISABLE_ZONE_CHECKING" == "yes" ]; then /usr/sbin/na>
 Main PID: 84460 (named)
    Tasks: 4 (limit: 5725)
   Memory: 16.3M
   CGroup: /system.slice/named-chroot.service
           mq84460 /usr/sbin/named -u named -c /etc/named.conf -t /var/named/chroot
[root@localhost named]# systemctl enable named-chroot.service
Created symlink /etc/systemd/system/multi-user.target.wants/named-chroot.service → /usr/lib/systemd/system/named-chroot.service.
```


# 検証
各コンテンツサーバーから、それぞれのゾーンの情報が得られか確認する。

| ホスト名 | IPアドレス | ゾーン |
|:-:|:-:|:-:|
|Cache searver   |192.168.10.1   |   |
| ContentsB  |  192.168.10.2 |  alpha.jp |
|  ContentsC |  192.168.10.3 |  beta.jp |


ContentsBから、ContentsCのbeta.jpの情報が取得できていることを確認できた。

```shell-session:ContentsB
[root@ContentsServerB named]# host -v beta.jp
Trying "beta.jp"
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 53925
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 0

;; QUESTION SECTION:
;beta.jp.                       IN      A

;; AUTHORITY SECTION:
beta.jp.                2542    IN      SOA     beta.jp. rname.invalid. 20230323 86400 3600 604800 10800

Received 74 bytes from 192.168.10.1#53 in 1 ms
Trying "beta.jp"
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 25168
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 0

;; QUESTION SECTION:
;beta.jp.                       IN      AAAA

;; AUTHORITY SECTION:
beta.jp.                2542    IN      SOA     beta.jp. rname.invalid. 20230323 86400 3600 604800 10800

Received 74 bytes from 192.168.10.1#53 in 5 ms
Trying "beta.jp"
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 25451
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;beta.jp.                       IN      MX
```
ContentsCから、ContentsCのalpha.jpの情報が取得できていることを確認できた。

```shell-session:ContentsServerC
[root@ContentsServerC ~]# host -v alpha.jp
Trying "alpha.jp"
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 62792
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 0

;; QUESTION SECTION:
;alpha.jp.                      IN      A

;; AUTHORITY SECTION:
alpha.jp.               3441    IN      SOA     alpha.jp. rname.invalid. 20230323 86400 3600 604800 10800

Received 75 bytes from 192.168.10.1#53 in 1 ms
Trying "alpha.jp"
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 13386
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 0

;; QUESTION SECTION:
;alpha.jp.                      IN      AAAA

;; AUTHORITY SECTION:
alpha.jp.               3441    IN      SOA     alpha.jp. rname.invalid. 20230323 86400 3600 604800 10800

Received 75 bytes from 192.168.10.1#53 in 0 ms
Trying "alpha.jp"
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 4646
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;alpha.jp.                      IN      MX

;; ANSWER SECTION:
alpha.jp.               10232   IN      MX      10 mail.alpha.jp.

Received 47 bytes from 192.168.10.1#53 in 1 ms
```






# 最後に
今回は、二回にわたりDNSサーバーを一通り構築してみました。
普段Ciscoばかりを触っているせいか、うまくいかないことが多く、
自分の知識・実力不足を感じた時間となりました。
こうして投稿という形でアウトプットしながら一つ一つ身に着けていきたいと思います。
ありがとうございました。