Power DNSでフルリゾルバを構築する

# 概要
NAT64/DNS64の検証をしたい。そのために好きに使えるDNSサーバを立てたい。DNSといえばBIND。 でも、設計が古く複雑とのことで、脆弱性がよく報告されている。「オープンソースソフトウェアで」「比較的メンテナンスされており」「GUIもあるもの」として[Power DNS](https://www.powerdns.com/) を選んだ。

Power DNS は、Version 4.0系から
1. 権威サーバ（Authoritative Server）
2. 名前解決サーバ（Recursive Server）
の二つに分離された。
この記事では名前解決サーバを構築する。一つ目の記事は以下で用意。

https://qiita.com/Shakapon/items/cb99384b82bdc15dd660

# 検証環境
Power DNS のrecursiveサーバ。

| 種別 | ソフトウェア | バージョン | 備考 |
|:-:|:-:|:-:|:-:|
| OS  | Ubuntu Server  | 20.04.2  |  |
| フルリゾルバ| Power DNS Recursor | 4.2.1-1build2  | APTでいれる |

# PowerDNSの構築
## PowerDNS Recursorのインストール
```sh
sudo apt install pdns-recursor
```

Ubuntuの場合、```systemd-resolved```がUDP/53を使用しているため、PowerDNSを入れた段階では起動に失敗する。サービスを止めておけば動きそうだが、今度は名前解決できず、aptでパッケージを入れられない。ここは気にしない方向で進む。

## 初期設定の変更（recursor.conf）

| 設定項目 | デフォルト値| 変更後| 備考 |
|:-:|:-:|:-:|:-:|
| local-address  | Loopbackアドレス  | 適切なアドレス（検証では192.168.1.53,127.0.0.1）  | 外部から問い合わせを受ける際のアドレス |
| allow-from  | コメントアウト| 適切なアドレス（検証では192.168.0.0/16）  | 名前解決要求を受け入れるアドレス群 |
| forward-zones-recurse|コメントアウト| .=8.8.8.8| 再帰問い合わせ先。ここでは Google DNSを指定|
| forward-zone|コメントアウト| example.com=127.0.0.1:5353| [こちらの記事で同じサーバに権威サーバを立てた場合](https://qiita.com/Shakapon/items/cb99384b82bdc15dd660)|

```sh
$ sudo vi /etc/powerdns/recursor.conf
# Autogenerated configuration file template
#################################
# allow-from    If set, only allow these comma separated netmasks to recurse
#
allow-from=192.168.0.0/16
(snip)
#################################
# forward-zones Zones for which we forward queries, comma separated domain=ip pairs
#
forward-zones= example.com=127.0.0.1:5353
(snip)
#################################
# forward-zones-recurse Zones for which we forward queries with recursion bit, comma separated domain=ip pairs
#
forward-zones-recurse=.=8.8.8.8
(snip)
#################################
# local-address IP addresses to listen on, separated by spaces or commas. Also accepts ports.
#
local-address=192.168.1.53,127.0.0.1
```
 
## 権威サーバの設定変更
[こちらの記事で同じサーバに権威サーバを立てた場合](https://qiita.com/Shakapon/items/cb99384b82bdc15dd660)、権威サーバとフルリゾルバでどちらもUDP/53を使用するため重複する。どちらかを調停する必要がある。今回は権威サーバ側のPort番号を修正した。スタブリゾルバが直接権威DNSへ聞きに来ることは考えにくいし。

```sh
$ sudo vi /etc/powerdns/pdns.conf
#################################
# local-port    The port on which we listen
#
# local-port=53
local-port=5353
```

## DNSSEC 
Power DNSはDNSSEC のデフォルト動作が4.5.0から変更されている。

| 設定項目 | デフォルト値|
|:-:|:-:|
|4.5.0まで| process-no-validate|
|4.5.0以降| process|

このため、DNSSEC設定のされていない権威サーバが管理するドメイン名の名前解決できるかは DNS Client 側の設定に依存する。ラボ環境などで回避するためには、`recursor.conf`の`dnssec`を`process-no-validate`とする（4.5.0よりも前のバージョンに合わせる）か、`recursor.lua`に例外として登録する。設定後は要・再起動。

Ubuntu 22.04では PowerDNS Recursorのバージョンが 4.6.0となり、この問題にヒットした。

```sh
$ sudo vi /etc/powerdns/recursor.lua
#################################
addNTA("example.com","This Domain NAME is used in LAB ONLY")
```

https://doc.powerdns.com/recursor/dnssec.html



## サービス再起動

```sh
$ sudo systemctl stop pdns.service
$ sudo systemctl stop pdns-recursor.service
$ sudo systemctl start pdns.service
$ sudo systemctl start pdns-recursor.service
```

## 正常性確認
digコマンドで試す。

```sh
$ dig www.google.com @192.168.1.53 +short
172.217.175.100  # Internet側のホスト名が返ってくる。
$ dig www.example.com @192.168.1.53 +short
192.0.2.1 # ローカル側で建てた権威サーバがホスト名を返してくる。
```

# この後
Power DNSフルリゾルバはDNS64機能も具備している、らしい。この機能はVersion 4.4からサポート。今回構築した Ubuntu 20.04 ではVersion 4.2.1であってちょっと古くサポート外。幸い、Ubuntu 21.04では4.4系をサポートしていたため、試すのならそっちのほうになりそう。本格的な採用は来年4月の22.04待ち。

https://doc.powerdns.com/recursor/settings.html#dns64-prefix