BIND DNS 構築/用語メモ

# BINDの基本設定メモ
DNS自体の仕組みとDNS構築時の設定について、細かく日本語で説明したページが見つからなかったので自分用にメモを作成しました。

# バージョン
```
[root@dns named]# named -v
BIND 9.16.23-RH (Extended Support Version) <id:fde3b1f>
[root@dns etc]# cat oracle-release
Oracle Linux Server release 9.5
```
```
[root@dns etc]# dnf info bind
Last metadata expiration check: 1:15:51 ago on Mon 19 May 2025 10:43:32 PM JST.
Installed Packages
Name         : bind
Epoch        : 32
Version      : 9.16.23
Release      : 24.0.1.el9_5.3
Architecture : x86_64
Size         : 1.4 M
Source       : bind-9.16.23-24.0.1.el9_5.3.src.rpm
Repository   : @System
From repo    : ol9_appstream
```
```
[root@dns etc]# dnf info bind-utils
Last metadata expiration check: 1:17:03 ago on Mon 19 May 2025 10:43:32 PM JST.
Installed Packages
Name         : bind-utils
Epoch        : 32
Version      : 9.16.23
Release      : 24.0.1.el9_5.3
Architecture : x86_64
Size         : 644 k
Source       : bind-9.16.23-24.0.1.el9_5.3.src.rpm
Repository   : @System
From repo    : ol9_appstream
```
    

## /etc/named.conf 設定例
### ◆全体
```:/etc/named.conf
options {
    listen-on port 53 { any; };
    directory "/var/named";
    allow-query { any; };
    recursion yes;
    forwarders { 8.8.8.8; 8.8.4.4; }; // Google Public DNS
};

//～～～～　中略　～～～～～

zone "." IN {
    type hint;
    file "named.ca";
};

zone "example123.local" IN {
    type master;
    file "example123.local.zone";
};

zone "179.168.192.in-addr.arpa" IN {
    type master;
    file "192.168.179.zone";
};

```

### ◆options ブロック

```:/etc/named.conf
options {
    listen-on port 53 { any; };
    directory "/var/named";
    allow-query { any; };
    recursion yes;
    forwarders { 8.8.8.8; 8.8.4.4; }; // Google Public DNS
};
```

* `listen-on port 53 { any; };` → ポート 53 で任意のインターフェースからのクエリを受付ける
* `directory "/var/named";` → ゾーンファイルの保存ディレクトリ
* `allow-query { any; };` → すべてのクライアントからのクエリを許可
* `recursion yes;` → 再帰的クエリを許可
* `forwarders` → 外部DNSサーバへの転送先

#### ■補足
【recursionとforwarders】
recursion yes; が設定されていると、BINDは「再帰的な名前解決を代行する」DNSリゾルバになる。
自分が権威を持たないドメイン（例：www.google.com）の問い合わせを受けたとき：
forwarders が設定されていれば、まずフォワーダーDNSに問い合わせる
forwarders のDNSが応答すれば、それをそのままクライアントに返す
forwarders のDNSが応答しなければ、BINDはルートDNSからたどって自力で解決を試みる（ただし forward only; がない場合）

### ◆zone 設定

```:/etc/named.conf
zone "." IN {
    type hint;
    file "named.ca";
};
```
"." はルートゾーンを意味します。
type hint は、再帰的名前解決の出発点としてルートDNSの情報を使うという指定。
named.ca（または named.root）には、ルートDNSサーバの一覧（A〜Mなど）が記載されている。
「ルートDNS（ルートネームサーバ、root DNS server）」とは、インターネット全体の名前解決の最上位にあるDNSサーバ群のこと。世界でたった13か所だけある。

```:/etc/named.conf
zone "example123.local" IN {
    type master;
    file "example123.local.zone";
};
```
このBINDサーバが example123.local の権威DNSサーバ（マスター）であることを意味する。
type master → ゾーンファイルをローカルで保持・管理する「マスターDNS」。
file "example123.local.zone" → /var/named/example123.local.zone にゾーンファイルがある前提。
★目的：example123.local および、そのゾーンに属するホスト名（FQDN）」の名前解決を提供する。

```:/etc/named.conf
zone "179.168.192.in-addr.arpa" IN {
    type master;
    file "192.168.179.zone";
};
```
このサーバが 192.168.179.0/24 の逆引きゾーンの管理者であることを意味する。
type master → 逆引き情報もローカルで持っている。
file "192.168.179.zone" → /var/named/192.168.179.zone に PTR レコード（後で説明）が記載されている。
★目的：クライアントや他のDNSサーバが 192.168.179.31 のようなIPを逆引きしたときに、
→ ns1.example123.local. のようなFQDNを返す。

#### ■補足
【逆引きゾーン名】
逆引きゾーン名では「IPアドレスのネットワーク部分だけを使い、ホスト部分（最後のオクテット）を取り除く」。最後に `in-addr.arpa` を付加する。
179.168.192.in-addr.arpa は、192.168.179.0/24 の逆引きゾーンを意味し、ホスト部（最後のオクテット）は除かれている。

---

## ゾーンファイル設定例

### ◆ゾーンファイル内の記号の意味
* `@` → /etc/named.confで指定した「ゾーン名（origin）」を示す。
    * ゾーン名は正引きなら"example123.local"。逆引きなら"179.168.192.in-addr.arpa."。
* `;` → これ以降をコメントアウト
* `.` → FQDNの後ろに付ける

### ◆正引き・逆引き　共通設定

```
     1  $TTL 86400
     2  @   IN  SOA     ns1.example123.local. admin.example.com. (
     3                  2023101301 ; Serial
     4                  3600       ; Refresh
     5                  1800       ; Retry
     6                  604800     ; Expire
     7                  86400      ; Minimum
     8                  )
```

#### ■各行の意味
```:1行目
$TTL 86400
```
TTL（Time To Live）＝キャッシュの有効期限（秒）
```:2行目
@   IN  SOA     ns1.example123.local. admin.example.com. (
```
「Start of Authority（SOA）＝権威開始レコード」とは、そのDNSゾーンの基本情報を定義する最初のレコードである。
`ns1.example123.local.` は、このゾーンのプライマリネームサーバーを示す。この例の場合、FQDNはこのDNS設定を行っているサーバ自身のIPアドレスを設定している。
`admin.example.com.`は、管理者メールを示す。（. → @）と読み替える。

* プライマリDNSサーバ【プライマリネームサーバ】とは、あるドメイン名の情報を管理する権限を持つDNSサーバのうち、主系統 (メイン)のサーバのこと。

```:3~7行目
                  2023101301 ; Serial
                  3600       ; Refresh
                  1800       ; Retry
                  604800     ; Expire
                  86400      ; Minimum
```
| 項目名                        | 値              | 意味と用途                                                                                       |
| -------------------------- | -------------- | ------------------------------------------------------------------------------------------- |
| **Serial**（シリアル番号）         | `2023101301`   | ゾーンデータのバージョン番号。セカンダリDNSが変更を検知するために使用。<br>更新のたびにこの値を**増やす必要がある**。通常は `YYYYMMDDnn` の形式で管理される。 |
| **Refresh**（リフレッシュ間隔）      | `3600` 秒（1時間）  | セカンダリDNSがマスターDNSに「更新ある？」と問い合わせる間隔。                                                          |
| **Retry**（再試行間隔）           | `1800` 秒（30分）  | Refresh に失敗したときに、再試行するまでの時間。                                                                |
| **Expire**（期限切れ）           | `604800` 秒（7日） | マスターにずっと接続できなかった場合、セカンダリDNSがゾーン情報を**破棄するまでの最大期間**。                                          |
| **Minimum**（ネガティブキャッシュTTL） | `86400` 秒（1日）  | 存在しないドメインの**NXDOMAIN結果をキャッシュする時間**（※古い仕様では全体のTTLとされていたが、今は主にネガティブTTLとして扱われる）。               |

```:9行目
@  IN  NS     ns1.example123.local.
```
NSレコード（Name Server Record）は、そのゾーンの「権威DNSサーバの名前」を他のDNSに知らせるためのもの。
SOA レコードで指定したプライマリネームサーバ（例：ns1.example123.local.）は、NSレコードとしても必ずゾーン内に定義するのが原則。
一つのゾーンに複数のNSレコードを定義して冗長化するのが一般的（ns1, ns2 など）。
この例の場合、このゾーン（@）の名前解決を担当するDNSサーバは `ns1.example123.local.`であることを示す。
この ns1.example123.local. は、通常このゾーンファイル内か別のゾーンファイル内で A レコード（IPv4）や AAAA レコード（IPv6）としてIPアドレスに解決できるようにしておく必要がある。(逆引きも同様)

### ◆正引きゾーンファイル例

```bash
[root@dns ~]# cat -n /var/named/example123.local.zone
     1  $TTL 86400
     2  @   IN  SOA     ns1.example123.local. admin.example.com. (
     3                  2023101301 ; Serial
     4                  3600       ; Refresh
     5                  1800       ; Retry
     6                  604800     ; Expire
     7                  86400      ; Minimum
     8                  )
     9  @  IN  NS     ns1.example123.local.
    10  @  IN  MX  10 mail.example123.local.
    11 
    12  @   IN  A   192.168.179.27
    13  ns1 IN  A   192.168.179.31
    14  mail IN  A   192.168.179.27
```


#### ■各行の意味
```:10行目
@  IN  MX  10 mail.example123.local.
```
MXレコード（Mail Exchange Record） は、DNSの中で メール配送の宛先を指定するためのレコード。「このゾーン宛のメールは mail.example123.local. に送ってくれ」というメール配送の経路情報を示す。

```:12行目
@   IN  A   192.168.179.27
```
MXレコードがあっても、@（ゾーン名）にAレコードがなければ、逆引きや接続元ホスト名解決には使えない。
だから、@ IN A xxx.xxx.xxx.xxx は通常必要。Aレコードについては一つ下を参照。

```:13~14行目
ns1 IN  A   192.168.179.31
mail IN  A   192.168.179.27
```
Aレコード（Address Record） は、
ホスト名（FQDN）をIPv4アドレスに対応付けるためのDNSレコード。

### ◆逆引きゾーンファイル例

```bash
[root@dns ~]# cat -n /var/named/192.168.179.zone
     1  $TTL 86400
     2  @   IN  SOA     ns1.example123.local. admin.example.com. (
     3                  2023101301 ; Serial
     4                  3600       ; Refresh
     5                  1800       ; Retry
     6                  604800     ; Expire
     7                  86400      ; Minimum
     8                  )
     9  @  IN  NS      ns1.example123.local.
    10  31  IN  PTR     ns1.example123.local.
    11  27  IN  PTR     mail.example123.local.
```

#### ■各行の意味
```:10~11行目
31  IN  PTR     ns1.example123.local.
27  IN  PTR     mail.example123.local.
```

PTRレコード（Pointer Record） は、DNSにおける「逆引き（IPアドレス → ホスト名）」を実現するレコード。

## クライアントからクエリ
### ◆正引きの問い合わせ
```sh
$ nslookup mail.example123.local
```
```
$ dig mail.example123.local
```

### ◆逆引きの問い合わせ
```sh
$ nslookup 192.168.179.27
```
```
$ dig -x 192.168.179.27
```