NTT-PCのVPSと自宅DNSで、DNSのスレーブ・マスタを構成する

[前回まで](https://qiita.com/harasakih/items/d7bbf65ca33b3c89d0a9)
自宅にあるサーバ類を、ipv6で外部公開しようと思うが、PUBLICに公開するのではなく、セキュアな自分専用のDNSを作り上げたい。

# PLAN:ゾーン転送
- VPSをDNSのスレーブとし、自宅DNSをマスタとして構成する。平文のゾーン情報を起きたくないのもあるけど、今仕事でやっていることなので、POCも兼ねて。
- 自宅はipv6プラスで、PORT53を公開することができないので、許可範囲内の別PORTを使う。
- 外部のDNSは、DNS問合はデフォルトポート(53)とし、ゾーン転送は上記の５３ではないPORT(本事例では、11111)で行う。

# PLAN:bind設定
- VPSにあるslaveのDNSは、キャッシュサーバとして動作させるとともに、自分勝手ドメインの未公認権威サーバ(slave)とする。
- 自分勝手ドメインのmasterは、前述の通り自宅DNS。

# 設定例
1. master側のDNS
2. slave側のDNS
3. 自宅HOME-GWのNAPT（ポートフォワード）
4. その他ハマりポイント
5. ゾーン情報の更新

## 1.master側
```conf:/etc/named.conf
# master側(ipv6+のHGW内部)
options {
        listen-on port 11111 { any; };

zone "myzone"     {
    type master;
    file "/etc/named/db.myzone";
    allow-transfer  { www.xxx.yyy.zzz; };
    also-notify     { www.xxx.yyy.zzz; };
};
```

- 11111は、ipv6のHOMW-GWで割り当てられている、NAPTのPORTに合わせる
- www.xxx.yyy.zzzはスレーブ(VPS)のIPアドレス

## 2.slave側
```conf:/etc/named.conf
# slave側(VPSサーバ）
options {
    listen-on port 53 { any; };

zone "myzone"     {
    type            slave;
    file            "/var/named/slaves/sv.myzone";
    masters         PORT 11111 { aaa.bbb.ccc.ddd; };
    allow-transfer  { none; }; // 再転送は禁止
 };
```

- aaa.bbb.ccc.dddはmaster(自宅HOME-GWのグローバルアドレス)のIPアドレス

## 3.HOME-GWの設定
masterで公開するPORT(上記例では 11111)のフォワード先を、自宅DNS（プライベートアドレス)に設定する。tcp,udpの両方を設定。

## 4.その他ハマりポイント
直接のDNS設定ではないが、ハマったこと。

- fiewalld. 特にmaster側(自宅DNS）はデフォルトではないPORTを開けるので。
- FWの許可。HOME-GWの後ろに置いたFWの許可もれ。
- slave側のゾーンファイルの置き場所。bindのログ(named.run)を見たら、permisson deniedとかになっていた。ディレクトリ権限を設定したもだめ。結局、ディレクトリを変更しOK。
- ```/etc/named/sv.myzone``` はゾーン転送がNG。スレーブ側のデフォルト ```/var/named/slaves/sv.myzone``` に変更したらOKになった。

## 5.ゾーン情報の更新
マスタ側でゾーン情報を変更し、スレーブと同期する。
ゾーン「myzone」を更新する例

### (1). ゾーン情報の更新
ゾーン情報を更新する。SOAのSerialを更新(増加)すること。

```conf:/etc/named/db.myzone
@ IN  SOA ns0.myzone. postmaster.myzone. (
     2019102701   ; Serial
            24h   ; Refresh スレーブサーバが更新の有無をチェックする周期
```

### (2). 更新したゾーン情報をリロード：マスタ

```bash:
# rndc reload myzone
```

### (3). マスタ側から更新
マスタからスレーブに更新を通知し、同期する。

```bash:
# rndc notify myzone
```

### (4). スレーブ側から更新
スレーブ側からゾーン情報を取得し、同期する。

```bash:
# rndc retransfer myzone
```


# ゾーン転送のシーケンス
 master側からnotifyをしてゾーン転送する際の、通信プロトコルを調べた結果。自宅側はゾーン転送に使うPORTを、tcp,udpとも開ける必要がある。

## master側から nofity した場合

| master<br>自宅 | direction | slave<br>VPS | what |
| :--- | :---: | :--- | :--- |
| */tcp | -> | 53/tcp | notify |
| */tcp | <- | 53/tcp | notify*- |
| 11111/udp | <- | **/udp | |
| 11111/udp | -> | **/udp | |
| 11111/tcp | <- | ****/tcp | SYN |
| 11111/tcp | -> | ****/tcp | SYN+ACK |
| 11111/tcp | <- | ****/tcp | ACK |
| 11111/tcp | <-> | ****/tcp | 転送 |


## slave側から retransfer した場合

| master<br>自宅 | direction | slave<br>VPS | what |
| :--- | :---: | :--- | :--- |
| 11111/udp | <- | **/udp | |
| 11111/udp | -> | **/udp | |
| 11111/tcp | <- | ****/tcp | SYN |
| 11111/tcp | -> | ****/tcp | SYN+ACK |
| 11111/tcp | <- | ****/tcp | ACK |
| 11111/tcp | <-> | ****/tcp | 転送 |

## ただのDNS-query（クライアント〜リゾルバ）
| client | direction | DNS-server | what |
| :--- | :---: | :--- | :--- |
| */udp | -> | 53/udp | A? query.fqdn.jp. |
| */udp | <- | 53/udp | A www.xxx.yyy.zzz |

この時、リゾルははルートから再帰問合をガツガツやっている。

# slave-DNSをキャッシュサーバとして動作させる設定
```conf:/etc/named.conf
# 
    recursion yes;
    allow-recursion { any; };
#
    forward    only;
    forwarders { 8.8.8.8; };
```
resursion yes
●キャッシュサーバとして動作させるので、yes

forward only
●only : キャッシュサーバとするが、自分では何もせず他に任せたい。フォワーダから回答できないときは、エラー
○first : フォワーダから回答がない場合は、自分で反復問合をする。？