DNS、CDNサービスの詳細解説(五)



# DNS逆引きゾーンとスレーブサーバーの実装ガイド

## 1. 逆引きゾーンの設定

### 1.1 逆引きゾーン構成の基本
逆引きゾーンはIPアドレスからFQDNへの変換を可能にします。  
**ゾーン名の命名規則**：
```
ネットワークアドレスを逆順 + .in-addr.arpa.
例：10.0.0.0/24 → 0.0.10.in-addr.arpa.
```

### 1.2 主要設定手順
#### (1) ゾーン定義の追加
```nginx
zone "0.0.10.in-addr.arpa" {
    type master;
    file "10.0.0.zone";
};
```

#### (2) ゾーンファイルの作成
```bind
$TTL 86400
$ORIGIN 0.0.10.in-addr.arpa.
@   IN  SOA  ns1.example.com. admin.example.com. (
    2023082101  ; Serial
    1H          ; Refresh
    5M          ; Retry
    7D          ; Expire
    1D )        ; Minimum

    NS  ns1.example.com.
100 PTR www.example.com.
200 PTR mail.example.com.
```

**重要なポイント**：
- PTRレコードのみを使用
- ホスト部は最後のオクテットのみ記述
- ORIGINディレクティブでベースドメインを定義

### 1.3 実践的な設定例
#### マスターサーバー側設定
```bash
# ゾーンファイルのコピー
cp -p /var/named/named.loopback /var/named/10.0.0.zone

# 構文チェック
named-checkzone 0.0.10.in-addr.arpa /var/named/10.0.0.zone
```

#### クライアント側検証コマンド
```bash
# 逆引きテスト
dig -x 10.0.0.100 @10.0.0.8

# 期待される出力
;; ANSWER SECTION:
100.0.0.10.in-addr.arpa. 86400 IN PTR www.example.com.
```

## 2. スレーブサーバーの実装

### 2.1 スレーブサーバーの要件
| 項目                  | 要件                          |
|-----------------------|------------------------------|
| ネットワーク接続性    | マスターサーバーと通信可能    |
| タイム同期            | NTPによる時刻同期必須         |
| ソフトウェアバージョン| BINDのバージョン一致推奨       |
| ディレクトリ権限      | /var/named/slaves 書き込み可能|

### 2.2 マスターサーバー側設定
```nginx
zone "example.com" {
    type master;
    file "example.com.zone";
    allow-transfer { 10.0.0.18; }; // スレーブのIPを許可
};
```

**ゾーンファイルの必須項目**：
```bind
@    IN  NS  ns1.example.com.
     IN  NS  ns2.example.com.
ns2  IN  A   10.0.0.18
```

### 2.3 スレーブサーバー側設定
```nginx
zone "example.com" {
    type slave;
    masters { 10.0.0.8; };
    file "slaves/example.com.slave";
};
```

**自動生成ファイルの確認**：
```bash
ls -l /var/named/slaves/
total 4
-rw-r--r-- 1 named named 432 Aug 21 10:00 example.com.slave
```

### 2.4 ゾーン転送の検証
#### 転送トリガー方法
```bash
# マスター側でシリアル番号更新
perl -pi -e 's/(\d+)(\s+;\s+Serial)/$1+1 . $2/e' /var/named/example.com.zone

# スレーブ側で強制転送
rndc retransfer example.com
```

#### 転送状態の確認
```bash
# ログ確認
tail -f /var/log/named.log
```

## 3. フェイルオーバーの検証

### 3.1 テストシナリオ
1. マスターサーバー停止
```bash
systemctl stop named
```

2. クライアント側でのDNS問い合わせ
```bash
dig www.example.com @10.0.0.18
```

**期待される動作**：
- スレーブサーバーから正常に応答
- TTL値がマスター設定を継承

### 3.2 自動フェイルバック
マスター復旧時：
```bash
systemctl start named
```
スレーブは自動的に最新データを同期

## 4. 高度な設定テクニック

### 4.1 複数スレーブの設定
```nginx
// マスター設定
allow-transfer { 10.0.0.18; 10.0.0.28; };
```

### 4.2 TSIGによる安全なゾーン転送
```bash
# 鍵生成
dnssec-keygen -a HMAC-SHA512 -b 512 -n HOST example-transfer

# 設定ファイル追記
key "example-transfer" {
    algorithm hmac-sha512;
    secret "xxxxxxxxxxxxxxxxxxxx==";
};
```

## 5. トラブルシューティングガイド

### 5.1 よくある問題と解決策
| 現象                     | 確認ポイント                   | 解決方法                     |
|--------------------------|--------------------------------|------------------------------|
| ゾーン転送が完了しない   | ファイアウォール設定（TCP 53） | ポート開放                   |
| スレーブがデータを取得できない | マスターのallow-transfer設定 | ACLの再確認                 |
| 逆引きが機能しない       | PTRレコードの記述形式         | 最後のオクテットのみを使用   |

### 5.2 有用なデバッグコマンド
```bash
# ゾーン転送の強制実行
rndc retransfer example.com

# 転送状態の詳細表示
named-checkzone -D example.com /var/named/slaves/example.com.slave
```

## 6. パフォーマンスチューニング

### 6.1 キャッシュ設定の最適化
```nginx
options {
    max-transfer-time-in 60;
    transfers-in 10;
    transfers-per-ns 2;
};
```

### 6.2 スレッドプール設定
```nginx
options {
    listen-on port 53 { any; };
    coresize default;
    max-cache-size 512M;
    recursive-clients 1000;
};
```