DNSマスターサーバ構築

# 使用環境
サーバー：Red Hat Enterprise Linux 9 (RHEL9)
仮想化：VMware Workstation 17 Pro

# 設定値
アドレス：192.168.0.100/24
ホスト名：dns
ドメイン名：example.com

# 正引きゾーンファイルの設定
**【正引きゾーンとは？】**
ドメイン名 → IPアドレス を解決するための領域

**ゾーンファイルの書き方**
```:/var/named/example.com.zone
example.com.		    3600	IN	SOA  dns.example.com. dnsadmin.example.com.(
	2025053101 ; シリアル番号（変更ごとに+1）
	3600       ; リフレッシュ（秒）
	1800       ; リトライ（秒）
	604800     ; 有効期間（秒）
	86400 )    ; キャッシュTTL（秒）

example.com.     	    3600	IN	NS   dns.example.com.
example.com.     	    3600	IN	NS   dns.slave.example.com.

dns.example.com. 	    3600	IN	A    192.168.0.100
dns.slave.example.com. 	3600	IN	A    192.168.0.101

localhost.example.com. 	3600	IN	A    127.0.0.1
```

<details><summary>詳細な解説</summary>
１　SOAレコード（１～６行目）

| 行数 | 項目 | 説明 |
|:-:|:-:|:-:|
| １ | example.com. | ゾーン名。FQDN |
| １ | 3600 | このレコードのキャッシュ有効期限（以下略） |
| １ | IN | インターネットクラス（以下略） |
| １ | SOA | Start Of Authority：このゾーンの権威開始を示すレコード |
| １ | dns.example.com. | プライマリDNSサーバ名 |
| １ | dnsadmin.example.com. | 管理者メールアドレス（＠を.に変換） |
| ２ | 2025053101 | シリアル番号。更新のたびに＋1（形式例：YYYYMMDDnn） |
| ３ | 3600 | スレーブがマスターに問い合わせる周期（秒） |
| ４ | 1800 | マスターに問い合わせ失敗時の再試行期間（秒） |
| ５ | 604800 | スレーブがマスターと連絡取れないまま保持できる最大期間（秒） |
| ６ | 86400 | 名前が存在しないときのキャッシュ時間（ネガティブキャッシュTTL） |

２　NSレコード（８～９行目）
| 行数 | 項目 | 説明 |
|:-:|:-:|:-:|
| 8,9 | example.com. | このゾーンの名前空間に対するネームサーバの指定 |
| 8,9 | NS | ネームサーバレコード |
| 8 | dns.example.com. | プライマリDNSサーバ |
| 9 | dns.slave.example.com. | セカンダリDNSサーバ（スレーブ） |

:::note warn
NSレコードで指定したサーバには必ず以下の`Aレコード`が必要
さもないと名前解決が不可能です！！
:::

３　Aレコード（１１～１４行目）
| 行数 | 項目 | 説明 |
|:-:|:-:|:-:|
| １１ | dns.example.com. | DNSサーバ自身のFQDN |
| １１～１４ | A | アドレスコード（IPv4アドレスを定義） |
| １１ | 192.168.0.100 | 実際のサーバもアドレス |

</details>

<details><summary>ゾーンファイルの書き方（省略ver）</summary>

```:/var/named/example.com.zone
$TTL 3600
@     IN  SOA  dns.example.com. dnsadmin.example.com. (
          2025053101 ; シリアル番号
          3600       ; リフレッシュ
          1800       ; リトライ
          604800     ; 有効期限
          86400 )    ; ネガティブキャッシュTTL

      IN  NS   dns.example.com.
      IN  NS   dns.slave.example.com.

dns           IN  A    61.120.151.82
dns.slave     IN  A    202.11.16.212
localhost     IN  A    127.0.0.1
```
**省略のポイント**
| 書き方 | 省略した部分 |
|:-:|:-:|
| TTL 3600 | TTLを1時間に統一。各レコードに毎回書かなくてOKに |
| @ | example.com. の省略記号（ゾーン名） |
| NSレコードの先頭省略 | @ が暗黙的に適用される（example.com.） |
| dns | ゾーン名が補完されて dns.example.com. に自動解釈される |

:::note warn
省略した際に使う＠は、後述する`named.conf`でzone ディレクティブで指定されたものに自動的に変換されます。
:::

</details>


# 逆引きゾーンファイルの設定
**【逆引きゾーンとは？】**
IPアドレス → ドメイン を解決するための領域

**ゾーンファイルの書き方**
```:/var/named/example.com.rev.zone
$TTL 3600
0.168.192.in-addr.arpa.      IN  SOA  dns.example.com. dnsadmin.example.com. (
    2025053101 ; シリアル番号（変更ごとに+1）
    3600       ; リフレッシュ（秒）
    1800       ; リトライ（秒）
    604800     ; 有効期間（秒）
    86400 )    ; キャッシュTTL（秒）

0.168.192.in-addr.arpa.      IN  NS   dns.example.com.
0.168.192.in-addr.arpa.      IN  NS   dns.slave.example.com.

100.0.168.192.in-addr.arpa.  IN  PTR  dns.example.com.
101.0.168.192.in-addr.arpa.  IN  PTR  dns.slave.example.com.

```
大体は正引きファイルと一緒です。省略の仕方も同じです。
一点だけ解説します。
| 項目 | 説明 |
|:-:|:-:|
| PTR | IPアドレスと紐づくホスト名の指定 |


# 逆引きローカルゾーンファイル
**【逆引きローカルゾーンファイルとは？】**
ループバックIPアドレスからローカルホスト名を解決する際に参照されるファイルです。

:::note info
ここで「正引きは？」と思われた方もいると思いますが、正引きは正引きゾーンファイルの最終行に書き込んでありました。
「なぜ逆引きは一緒に書かないの？」そう思われた方もいると思いますが、これはデフォルトのファイルがあるので、それを使用します。
:::

**ゾーンファイルの書き方**
```:/var/named/named.localhost
$TTL 3600
@       IN  SOA  @ rname.invalid. (
            0          ; シリアル
            3600       ; リフレッシュ
            1800       ; リトライ
            604800     ; 有効期限
            86400 )    ; ネガティブTTL

NS    @
A     127.0.0.1
AAAA  ::1
```
これは大体デフォルトで大丈夫です。


# ヒントファイルの設定
**【ヒントファイルとは？】**
ルートDNSを定義するファイルです

**ヒントファイルの書き方**
```:/var/named/named.ca
.                  3600000    IN    NS    dns.wxample.com
dns.example.com    3600000    IN    A     192.168.0.100
```
| 項目 | 説明 |
|:-:|:-:|
| . | ルートゾーン（すべてのDNS起点）|
| NS | ルートネームサーバ |
| A | 各サーバのIPv4アドレス |
| 3600000 | TTL |

# ゾーンファイルの文法チェック
今まで記述した各種ゾーンファイルの文法が正しいか、コマンドを用いてチェックします。

**正引きゾーンファイル**
```:bash
$ named checkzone dns.example.com /var/named/example.com.zone
zone dns.example.com/IN: loaded serial 20250531
OK     ←これが出ればとりあえずOK
```
**逆引きゾーンファイル**
```:bash
$ named checkzone 0.168.192.in-addr.arpa. /var/named/example.com.rev.zone
zone 0.168.192.in-addr.arpa./IN: loaded serial 20250531
OK     ←これが出ればとりあえずOK
```

:::note warn
ここでOKが出てもこの先でエラーが出ることはあります。
OKが出たからと言って、完全には信用せずに、エラーが出た際はログなどを読んだりしてください。
ゾーンファイルを何度も見返すのも大事です。
:::



# ブートファイルの設定
BINDが起動するとき、最初に読み込む **設定の起点ファイル** です。
ここで「どのゾーンを管理するか」「どのACLを使うか」「どの設定ファイルを読み込むか」などを定義します。
```:/etc/named.conf
　　　　　　～(略)～
11行 　　listen-on port 53 { any; };
12行 　　listen-onv6 port 53 { any; };
　　　　　　～(略)～
19行 　　allow-query { any; };
　　　　　　～(略)～
33行 　　dnssec-validation no;
　　　　　　～(略)～
追記　　 include "/etc/named.int.zones";
```
| 行数 | 説明 |
|:-:|:-:|
| 11-12 | どのインターフェースで受け付けるか制限 |
| 19 | 受け付ける相手を制限します（例　192.168.0.0/24,localhost） |
| 33 | dnssecを使用するかを設定します（今回は勉強用なので使用しません） |
| 追記 | これから書くゾーンの設定情報をかいたファイルを読み込めるようにします |

### ゾーンファイルを読み込む他雨の設定ファイルを作ります
ファイル名は、ブートファイルの追記で指定したファイル名になります。
```:/etc/named.int.conf
zone "example.com" {
    type master;
    file "example.com.zone";
    allow-transfer { any; }
};
zone "0.168.192.in-addr.arpa." {
    type master;
    file "example.com.rev.zone";
    allow-transfer { any; }
};
```
| 項目 | 説明 |
|:-:|:-:|
| type | マスターサーバを宣言します |
| file | ファイル名 |
| allow-transfer | ゾーンの転送設定 |


【ここでも文法チェック】
```:bash
named-checkconf /etc/named.conf
```
**※エラーがない場合は出力がなく、プロンプトが返ってくるのみです。**

# リゾルバの設定
リゾルバとは、DNSサーバに問い合わせをする機能になります。
もし自サーバのゾーンファイルに、問い合わせされたものが書いていなかった際に上位のDNSサーバに問い合わせる際に使用します。
```:bash
＃ドメインの設定
$ nmcli connection modify ens160 ipv4.dns-search example.com 
＃DNSサーバ設定
$ nmcli connection modify ens160 ipv4.dns "192.168.0.100 192.168.0.200"
```

# 検索スイッチファイルの設定
名前解決を行う際の優先順位を決めるための設定です。
```:/etc/nsswitch.conf
(略)
hosts: dns files myhostname
(略)
```

# 最後にサービスの起動
```:bash
$ systemctl start named
```

# 確認
確認のためほかのホストから`nslook`や`dig`を使用して名前解決を行ってみてください。