Proxmox VEでVM作成時にDNSに自動登録

# はじめに
Proxmoxを使っている皆さん、VMの名前解決はどのようにしていますか？
一般的には宅内DNS権威サーバに静的にレコードを追加していることが多いと思います。私の環境ではansibleで自動化していますが、手動でレコードを追加する必要があるのは変わりません。
前回の記事([Proxmox VEでIPAM+cloud-initを用いてIP管理](https://qiita.com/segre5458/items/38195892d0b1775c2385))で、VMを作成すると同時にDHCPサーバから受け取った重複のないIPアドレスで固定されたマシンを作成することが出来るようになりました。そこで今回の記事では、VMが作成されるとVMのAレコードが自動的にDNSサーバに登録されるようにします。
これでProxmoxでVMを作成するとあらかた初期設定が完了したVMが誕生するようになりました。

# Proxmox VEのDNSサーバ
Promox VE(以降PVE)にはDNSサーバの機能はありません。ただし、SDN機能を使用するとPowerDNSのREST APIを呼び出してレコードの登録をする事ができます。そのため、まずはPowerDNS 権威サーバを構築します。

# PowerDNS権威サーバの構築
今回はOSにUbuntu、バックエンドにSQLite3を使用してPowerDNS権威サーバを構築します。

## ポート競合を防ぐ
権威サーバを構築すると、`UDP/53` が `systemd-resolved` と競合してしまいます。そのため、`systemd-resolved` の設定を変更してPowerdnsがポートを使用できるようにします。
設定ファイル`/etc/systemd/resolved.conf`の`#DNSStubListener=yes`を`DNSStubListener=no`に変更します。
```bash:/etc/systemd/resolved.conf
DNSStubListener=no
```
設定後、`systemd-resolved.service`を再起動します。
```bash
sudo systemctl restart systemd-resolved
```
`UDP/53`が開放されているのが確認できます。
```bash
sudo lsof -i:53
```

## インストール
必要なパッケージをインストールします。
```bash
sudo apt install pdns-server pdns-tools pdns-backend-sqlite3 sqlite3 libsqlite3-dev
```
続いて、Databaseを作成します。
```bash
sudo mkdir /var/lib/powerdns
sudo sqlite3 /var/lib/powerdns/pdns.sqlite3 < /usr/share/doc/pdns-backend-sqlite3/schema.sqlite3.sql
sudo chown -R pdns:pdns /var/lib/powerdns
```

## 設定変更
PowerDNSでSQLiteバックエンドを使用するための設定を行います。
設定ファイルは `/etc/powerdns/pdns.conf` です。
```bash:/etc/powerdns/pdns.conf
#################################
# launch        Which backends to launch and order to query them in
#
launch=gsqlite3
gsqlite3-database=/var/lib/powerdns/pdns.sqlite3
```
また、REST APIを有効化する設定を行います。
`api-key`には任意のkeyを入れてください。
```bash:/etc/powerdns/pdns.conf
#################################
# api   Enable/disable the REST API (including HTTP listener)
#
api=yes

#################################
# api-key       Static pre-shared authentication key for access to the REST API
#
api-key=arandomgeneratedstring
```
`webserver-address`には自マシンのIPアドレス、`webserver-allow-from`には自サーバのセグメントを入れてください。
```bash:/etc/powerdns/pdns.conf
#################################
# webserver     Start a webserver for monitoring (api=yes also enables the HTTP listener)
#
webserver=yes

#################################
# webserver-address     IP Address of webserver/API to listen on
#
webserver-address=192.168.240.13

#################################
# webserver-allow-from  Webserver/API access is only allowed from these subnets
#
webserver-allow-from=127.0.0.1,::1,192.168.0.0/16
```
設定後、`pdns.service` を起動します。
```bash
sudo systemctl restart pdns
```
正常に起動しているか確認します。
```bash
sudo systemctl status pdns
```
`Active: active (running)`となっていると正常に起動できています。

## Zone作成
では、DNSサーバで管理するZoneを作成します。
今回は`pve.box2.kmc.gr.jp`のZoneを作成するので、以下のコマンドを実行します。
```bash
sudo pdnsutil create-zone pve.box2.kmc.gr.jp
```
データベースを確認するとSOAレコードが追加されているの確認できます。
データベースに接続するには`sudo sqlite3 /var/lib/powerdns/pdns.sqlite3`を実行します。
```bash:sudo sqlite3 /var/lib/powerdns/pdns.sqlite3
SQLite version 3.37.2 2022-01-06 13:25:41
Enter ".help" for usage hints.
sqlite> select * from records;
1|2|pve.box2.kmc.gr.jp|SOA|a.misconfigured.dns.server.invalid hostmaster.pve.box2.kmc.gr.jp 0 10800 3600 604800 3600|3600|0|0||1
```
以上で権威サーバの構築は完了です。

# DNSサーバをProxmoxに登録
では、作成した権威サーバをProxmoxに登録して行きます。

## DNSサーバの登録
`Datacenter > SDN > Options > DNS` で、DNSサーバを登録します。
`ID`には任意の名前、`URI`に`http://yourpowerdnserver.domain.com:8081/api/v1/servers/localhost`、`API Key`に先ほど登録したKeyを入力します。
今回は`ID`に`dns01`、URIに`http://192.168.240.13:8081/api/v1/servers/localhost`、`API Key`に`arandomgeneratedstring`を入力しています(`API Key`は実際は強固なものに変更しています)。
![dns.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3245951/b2e1421a-08d7-f12d-02c9-67f13424b115.png)


## Simple Zoneの作成
`Datacenter > SDN > Zones` で、新しいSimple Zoneを作成してください。前回の記事([Proxmox VEでIPAM+cloud-initを用いてIP管理 - Simple Zoneの作成](https://qiita.com/segre5458/items/38195892d0b1775c2385#simple-zone%E3%81%AE%E4%BD%9C%E6%88%90))で作成した方はそのZoneを使用してください。IPAMやDHCPを使用しない場合でも登録できると思います。
DNSサーバを登録するには `Advenced` にチェックを入れ、`DNS Server`に先ほど作成した`dns01`、`DNS Zone`にサーバを作成するZoneを入力してください。
このZoneに入力した値に基づいて、`<サーバ名>.pve.box2.kmc.gr.jp`といったAレコードが登録されます。


![zone.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3245951/f501ba7b-3328-70ec-97fc-a4896279b259.png)

## Apply
以上でDNSサーバの登録は完了です。SDNパネルに移動してApplyをクリックすると、適用できます。ここで。エラーや警告なしに完了すれば、無事に登録されていることになります！

# 使用してみる
前回の記事([Proxmox VEでIPAM+cloud-initを用いてIP管理 - テンプレートを用いたVMの作成](https://qiita.com/segre5458/items/38195892d0b1775c2385#%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88%E3%82%92%E7%94%A8%E3%81%84%E3%81%9Fvm%E3%81%AE%E4%BD%9C%E6%88%90))と同様に、テンプレートからCloneしてVMを作成します。
`Name`は`eve`としています。
![vm.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3245951/cea63da5-1feb-528c-361c-933449b6cebd.png)

VMを作成し起動すると自動的にAレコードが追加されていることが確認できます！
```bash:sudo sqlite3 /var/lib/powerdns/pdns.sqlite3
SQLite version 3.37.2 2022-01-06 13:25:41
Enter ".help" for usage hints.
sqlite> select * from records;
1|2|pve.box2.kmc.gr.jp|SOA|a.misconfigured.dns.server.invalid hostmaster.pve.box2.kmc.gr.jp 0 10800 3600 604800 3600|3600|0|0||1
2|2|eve.pve.box2.kmc.gr.jp|A|192.168.240.15|14400|0|0||1
```

当然、名前解決も行うことができます。
```bash:dig eve.pve.box2.kmc.gr.jp @192.168.240.13
; <<>> DiG 9.18.18-0ubuntu0.22.04.2-Ubuntu <<>> eve.pve.box2.kmc.gr.jp @192.168.240.13
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 56505
;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; WARNING: recursion requested but not available

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
;; QUESTION SECTION:
;eve.pve.box2.kmc.gr.jp.                IN      A

;; ANSWER SECTION:
eve.pve.box2.kmc.gr.jp. 14400   IN      A       192.168.240.15

;; Query time: 0 msec
;; SERVER: 192.168.240.13#53(192.168.240.13) (UDP)
;; WHEN: Fri Apr 19 05:34:09 UTC 2024
;; MSG SIZE  rcvd: 67
```

以上で完成です！

# おわりに
最初はpfsenseやISC-DHCPDを用いることを考えていましたが、PVEで既に同様の機能が提供されていました。前回同様SDN機能の強さを感じました。
(PVEにDNSサーバ機能追加されないかな......ﾎﾞｿ)


# 参考
- [Proxmox Server Solutions GmbH, Software-Defined Network, DNS](https://pve.proxmox.com/pve-docs/chapter-pvesdn.html#pvesdn_config_dns)
- [Power DNSで権威サーバを構築する](https://qiita.com/Shakapon/items/cb99384b82bdc15dd660)
- [PowerDNS - ArchWiki](https://wiki.archlinux.jp/index.php/PowerDNS)