結局DHCPv6入れてDNSはunboundにした話

#1. 結局DHCPv6

以前「[YAMAHA RTシリーズルーターをIPv6ネイティブ環境に接続して、v6用DNSをLAN内サーバーに設定させた話](https://qiita.com/1nagawa/items/dd86b33d31c68c58dad0)」という記事を書いたのですが、結局ローカルにDHCPv6サーバーを立てて動かすようになりました。
何故かって理由なのですが、どうもWindowsではIPv6 DNSを真面目に設定してある方が、IPv6を空にしてIPv4 DNSに任せるよりも早い「気がする」のです。「気がする」です。気分の問題です（ここ重要）。以前の記事通りにIPv4 DNSがちゃんと動いていれば別に困ることはないはずです。
そんなわけで、DHCPv6でDNS情報を広告させることにしました。

#2. ISC DHCPの設定

CentOS8で作っていたDNSサーバー上にDHCPを構築しました。
DHCPは新しいKea DHCPも試したのですが動作が安定せず、ごく安パイにISC DHCPをdnf installで入れました。
書いたconfigはこれだけです。

```/etc/dhcp/dhcpd6.conf
subnet6 2001:db8::/64
{
    option dhcp6.name-servers 2001:db8::2;
    option dhcp6.domain-search "local.example.net";
}
```

もちろんDNSサーバー側にもスタティックなIPv6アドレスを付与しておき、DHCPv6で配布する情報と合わせておきます。

```
firewall-cmd --add-service=dhcpv6 --permanent
firewall-cmd --reload
```

でファイアウォールを開けて、

```
systemctl enable dhcpd6
systemctl start dhcpd6
```

で起動。問題なく動いていれば、すぐにDNSサーバー情報が各端末に伝播するでしょう。

DHCPv6サーバーを作ったので、ついでにDHCPv4サーバーも相乗りさせてRTX830のDHCPは止めました。

```/etc/dhcp/dhcpd.conf
default-lease-time          43200;
max-lease-time              86400;

authoritative;

subnet 192.168.0.0 netmask 255.255.255.0 {
    range 192.168.0.21 192.168.0.99;
    option broadcast-address 192.168.0.255;
    option routers 192.168.0.1;
    option domain-name "local.example.net";
    option domain-name-servers 192.168.0.2;
}
```

当たり前ですが、DNS情報しか配っていないv6に比べてv4はconfigが多いですね。

```
firewall-cmd --add-service=dhcp --permanent
firewall-cmd --reload
```

でファイアウォールを開けて、

```
systemctl enable dhcpd
systemctl start dhcpd
```

で起動します。
動作確認は端末側で```ipconfig /renew```とか、スマホだったらWi-Fiを切断→接続とかしてアドレスリースを確認します。

#3. unboundの設定

DNSはpdns-recursorで作ってましたが、パフォーマンスが優れていると聞いてunboundを入れて置き換えました。これも自己満足ですpdns-recursorがダメとかないです。
unboundは設定できる項目が多く、かつネットで拾える設定例が間違ってるのも多く見かけたので、今の弊宅の設定を貼っておきます。
デフォルトの```/etc/unbound/unbound.conf```は触らず、```/etc/unbound/conf.d```の下に ```unbound.conf```、```performance.conf```を置いてカスタマイズ、さらにローカルゾーンの情報として```local.example.net.conf```を置いています。

```/etc/unbound/conf.d/unbound.conf
server:
    interface: 0.0.0.0
    interface: ::0

    prefer-ip6: yes

    access-control: 0.0.0.0/0 refuse
    access-control: 127.0.0.0/8 allow
    access-control: 192.168.0.0/24 allow
    access-control: ::0/0 refuse
    access-control: ::1/128 allow
    access-control: 2001:db8::/64 allow
    access-control: fe80::/64 allow

    hide-version: yes
    hide-identity: yes

    logfile: "/var/log/unbound/unbound.log"
    use-syslog: no
    log-time-ascii: yes

forward-zone:
    name: "."
    forward-addr: 2001:4860:4860::8888
    forward-addr: 2001:4860:4860::8844
    forward-addr: 202.232.2.2
    forward-addr: 202.232.2.3

remote-control:
    control-interface: 127.0.0.1
    control-interface: ::1
```

フォワーダーは鉄板のGoogle Public DNSをプライマリに、プロバイダDNSをバックアップに指定しています。
Google Public DNSはプロバイダDNSに比べてTTLが、という話があって私もこないだまでそっちの宗派だったのですが、実際にtracertしてみると、DS-Lite環境ではプロバイダDNSよりもGoogle Public DNSの方がhop数が少なく近いところにいました。
また構築後にベンチマーク（namebench）を走らてフォワーダーがプロバイダDNSのみの設定と比較しましたが、これもGoogle Public DNSの方が良好なスコアとなりました。
DS-Liteはtransixから出て行くのでPPPoEとはまた話が違っちゃうんでしょうね。

```/etc/unbound/conf.d/performance.conf
server:
    msg-cache-slabs: 4
    rrset-cache-slabs: 4
    infra-cache-slabs: 4
    key-cache-slabs: 4

    rrset-cache-size: 128m
    msg-cache-size: 64m

    outgoing-range: 8192
    num-queries-per-thread: 4096

    so-rcvbuf: 4m
    so-sndbuf: 4m

    minimal-responses: yes
    qname-minimisation: yes

    infra-cache-numhosts: 1000000
```

この辺もunboundで鉄板のパフォーマンスカスタマイズですが、デフォルトの```unbound.conf```に記載済みの項目は省きました（```num-threads```、```prefetch```等）。
後は```so-rcvbuf```、```so-sndbuf```に絡んでCentOS側で

```/etc/sysctl.conf 
net.core.rmem_default = 4194304
net.core.rmem_max = 4194304
net.core.wmem_default = 4194304
net.core.wmem_max = 4194304
```

とかやってます。

```/etc/unbound/conf.d/local.example.net.conf
server:
    local-zone: "local.example.net." transparent

    local-data: "mail. 600 A 192.168.0.10"
    local-data: "mail.local.example.net. 600 A 192.168.0.10"
    local-data: "www.example.net. 600 A 192.168.0.20"

    local-data-ptr: "192.168.0.10 600 mail.local.example.net."
```

ローカルゾーンはお好みのように。説明は割愛します。

それでは本記事はこの辺で。