AlmaLinux9.2でDNSサーバを構築する(Bind)

AlmaLinux9.2にBindをインストールしてDNSサーバを構築します。
今回は`test.local`というゾーンを作成してレコードを登録します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201787/048b2188-c613-9249-1da9-9e151fca8ba2.png)


# 環境
AlmaLinux release 9.2 (Turquoise Kodkod)
bind-9.16.23-11.el9.x86_64
bind-utils-9.16.23-11.el9.x86_64

※firewalldとselinuxは停止済み

# 1.DNSパッケージのインストール
DNSサーバ用のパッケージとして、bindをインストールします。
また、DNS系コマンド(nslookup等)向けに、bind-utilsをインストールします。

```text:インストール
# dnf install -y bind bind-utils

パッケージ bind-utils-32:9.16.23-11.el9.x86_64 は既にインストールされています。
依存関係が解決しました。
=================================================================================================================
 パッケージ                      アーキテクチャー      バージョン              リポジトリー                サイズ
=================================================================================================================
インストール:
 bind                            x86_64                32:9.16.23-11.el9       local_dvd_AppStream         488 k
依存関係のインストール:
 bind-dnssec-doc                 noarch                32:9.16.23-11.el9       local_dvd_AppStream          45 k
 python3-bind                    noarch                32:9.16.23-11.el9       local_dvd_AppStream          61 k
 python3-ply                     noarch                3.11-14.el9             local_dvd_BaseOS            103 k
弱い依存関係のインストール:
 bind-dnssec-utils               x86_64                32:9.16.23-11.el9       local_dvd_AppStream         113 k

トランザクションの概要
=================================================================================================================
インストール  5 パッケージ

《中略》

完了しました!
```

# 2.DNS設定ファイル編集(/etc/named.conf)
デフォルトから一部のみ変更しています。

設定部 | 設定項目 | 内容 | 意味
--- | --- | --- | ---
options | listen-on | 53 { 192.168.142.31; }; | 自身のDNS-NWインターフェースの指定
options | allow-query | 192.168.142.0/24 | DNS問合せ元のホスト指定
zone | - | "test.local" | ゾーン名(正引きルール)
\- | type | master | このゾーンはこのサーバがマスター
\- | file | "test.local" | ゾーンデータのファイル名(正引き)
\- | allow-update | none | 他DNSの更新を反映しない
zone | - | "142.168.192.in-addr.arpa" | ゾーン名(逆引きルール)
\- | type | master | このゾーンはこのサーバがマスター
\- | file | "test.local.rev" | ゾーンデータのファイル名(逆引き)
\- | allow-update | none | 他DNSの更新を反映しない




```text:/etc/named.conf
//
// named.conf
//
// Provided by Red Hat bind package to configure the ISC BIND named(8) DNS
// server as a caching only nameserver (as a localhost DNS resolver only).
//
// See /usr/share/doc/bind*/sample/ for example named configuration files.
//

options {
        listen-on port 53 { 192.168.142.31; };     ##### 編集箇所 #####
        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     { 192.168.142.0/24; };     ##### 編集箇所 #####

        /*
         - If you are building an AUTHORITATIVE DNS server, do NOT enable recursion.
         - If you are building a RECURSIVE (caching) DNS server, you need to enable
           recursion.
         - If your recursive DNS server has a public IP address, you MUST enable access
           control to limit queries to your legitimate users. Failing to do so will
           cause your server to become part of large scale DNS amplification
           attacks. Implementing BCP38 within your network would greatly
           reduce such attack surface
        */
        recursion yes;

        dnssec-validation yes;

        managed-keys-directory "/var/named/dynamic";
        geoip-directory "/usr/share/GeoIP";

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

        /* https://fedoraproject.org/wiki/Changes/CryptoPolicy */
        include "/etc/crypto-policies/back-ends/bind.config";
};

logging {
        channel default_debug {
                file "data/named.run";
                severity dynamic;
        };
};

zone "test.local" IN {              ##### 編集箇所 #####
        type master;                ##### 編集箇所 #####
        file "test.local";          ##### 編集箇所 #####
        allow-update { none; };     ##### 編集箇所 #####
};                                  ##### 編集箇所 #####

zone "142.168.192.in-addr.arpa" IN {     ##### 編集箇所 #####
        type master;                     ##### 編集箇所 #####
        file "test.local.rev";           ##### 編集箇所 #####
        allow-update { none; };          ##### 編集箇所 #####
};                                       ##### 編集箇所 #####

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

# 3.正引き用設定ファイル作成
test.localドメインの正引き設定ファイルを作成します。

設定部 | 設定項目 | 内容 | 意味
--- | --- | --- | ---
$ | TTL | 86400 | ゾーンレコードTTL秒。
@ | IN SOA | alma92-h1.test.local.  root.test.local. | プライマリDNSサーバ、管理者メールアドレス(FQDN)
\- | - | 2020020501 ; Serial | ゾーン情報のシリアル番号(バージョン)
\- | - | 28800      ; Refresh | セカンダリDNSサーバーの更新確認間隔(秒)
\- | - | 14400      ; Retry | 更新失敗時の再試行時間(秒)
\- | - | 3600000    ; Expire | 更新失敗時の情報利用時間(秒)
\- | - | 86400 )    ; Minimum | レコードのTTL(秒)
\- | IN NS | alma92-h1.test.local. | 自身が管理しているゾーンのDNSサーバー(FQDN)
alma92-h1 | IN A | 192.168.142.31 | 正引きレコード
alma92-h2 | IN A | 192.168.142.32 | 正引きレコード




```text:/var/named/test.local
$TTL      86400
@         IN       SOA     alma92-h1.test.local.  root.test.local.(
                                        2020020501 ; Serial
                                        28800      ; Refresh
                                        14400      ; Retry
                                        3600000    ; Expire
                                        86400 )    ; Minimum
            IN NS alma92-h1.test.local.
alma92-h1   IN A 192.168.142.31
alma92-h2   IN A 192.168.142.32
```


# 4.逆引き用設定ファイル作成
test.localドメインの逆引き設定ファイルを作成します。

設定部 | 設定項目 | 内容 | 意味
--- | --- | --- | ---
$ | TTL | 86400 | ゾーンレコードTTL秒。
@ | IN SOA | alma92-h1.test.local.  root.test.local. | プライマリDNSサーバ、管理者メールアドレス(FQDN)
\- | - | 2020020501 ; Serial | ゾーン情報のシリアル番号(バージョン)
\- | - | 28800      ; Refresh | セカンダリDNSサーバーの更新確認間隔(秒)
\- | - | 14400      ; Retry | 更新失敗時の再試行時間(秒)
\- | - | 3600000    ; Expire | 更新失敗時の情報利用時間(秒)
\- | - | 86400 )    ; Minimum | レコードのTTL(秒)
\- | IN NS | alma92-h1.test.local. | 自身が管理しているゾーンのDNSサーバー(FQDN)
31 | IN PTR | alma92-h1.test.local. | 逆引きレコード
32 | IN PTR | alma92-h2.test.local. | 逆引きレコード


```text: /var/named/test.local.rev
$TTL      86400
@         IN       SOA     alma92-h1.test.local.  root.test.local.(
                                        2020020501 ; Serial
                                        28800      ; Refresh
                                        14400      ; Retry
                                        3600000    ; Expire
                                        86400 )    ; Minimum
     IN NS alma92-h1.test.local.
31   IN PTR alma92-h1.test.local.
32   IN PTR alma92-h2.test.local.
```

# 5.DNSコンフィグ確認
各設定のコンフィグ内容が正しいかを確認していきます。

**基本設定ファイル**

```:/etc/named.conf
# named-checkconf
```

**ゾーン設定ファイル**

```:/var/named/test.local
# named-checkzone test.local /var/named/test.local
zone test.local/IN: loaded serial 2020020501
OK
```

```:/var/named/test.local.rev
# named-checkzone test.local.rev /var/named/test.local.rev
zone test.local.rev/IN: loaded serial 2020020501
OK
```



# 7.サービス起動
DNSサービスを起動します。

```text:DNSサービスの再起動
# systemctl restart named
```
```text:DNSサービス自動起動設定
# systemctl enable named
```

```text:DNSサービス確認
# 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 2023-06-04 20:06:35 JST; 6s ago
    Process: 28260 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, stat>
    Process: 28262 ExecStart=/usr/sbin/named -u named -c ${NAMEDCONF} $OPTIONS (code=exited, status=0/SUCCESS)
   Main PID: 28263 (named)
      Tasks: 4 (limit: 11107)
     Memory: 15.6M
        CPU: 115ms
     CGroup: /system.slice/named.service
             mq28263 /usr/sbin/named -u named -c /etc/named.conf
```


# 8.DNSクライアント設定
クライアントとなるサーバ側の設定としては、パッケージのインストールを行い、リゾルバ設定を記述すればOKです。

```:パッケージインストール
# yum install -y bind-utils
《中略》
完了しました!
```


```:リゾルバ設定
# vi /etc/resolv.conf
```

```:/etc/resolv.conf
# Generated by NetworkManager
search test.local
nameserver 192.168.142.31
```

:::note info
rhel7ぐらいまでは`domain`でドメイン記載していましたが、最近はドメインを複数記載可能な`search`に代用されているようです。
:::


# 8.DNS動作確認
DNSクライアント側から、nslookupコマンドでDNSサーバの応答を確認します。

```:正引き確認
# nslookup alma92-h1
Server:         192.168.142.31
Address:        192.168.142.31#53

Name:   alma92-h1.test.local
Address: 192.168.142.31
```

```:逆引き確認
# nslookup 192.168.142.31
31.142.168.192.in-addr.arpa     name = alma92-h1.test.local.
```