LoginSignup
5
6

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

Posted at

はじめに

Proxmoxを使っている皆さん、VMの名前解決はどのようにしていますか?
一般的には宅内DNS権威サーバに静的にレコードを追加していることが多いと思います。私の環境ではansibleで自動化していますが、手動でレコードを追加する必要があるのは変わりません。
前回の記事(Proxmox VEでIPAM+cloud-initを用いてIP管理)で、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/53systemd-resolved と競合してしまいます。そのため、systemd-resolved の設定を変更してPowerdnsがポートを使用できるようにします。
設定ファイル/etc/systemd/resolved.conf#DNSStubListener=yesDNSStubListener=noに変更します。

/etc/systemd/resolved.conf
DNSStubListener=no

設定後、systemd-resolved.serviceを再起動します。

sudo systemctl restart systemd-resolved

UDP/53が開放されているのが確認できます。

sudo lsof -i:53

インストール

必要なパッケージをインストールします。

sudo apt install pdns-server pdns-tools pdns-backend-sqlite3 sqlite3 libsqlite3-dev

続いて、Databaseを作成します。

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 です。

/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を入れてください。

/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には自サーバのセグメントを入れてください。

/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 を起動します。

sudo systemctl restart pdns

正常に起動しているか確認します。

sudo systemctl status pdns

Active: active (running)となっていると正常に起動できています。

Zone作成

では、DNSサーバで管理するZoneを作成します。
今回はpve.box2.kmc.gr.jpのZoneを作成するので、以下のコマンドを実行します。

sudo pdnsutil create-zone pve.box2.kmc.gr.jp

データベースを確認するとSOAレコードが追加されているの確認できます。
データベースに接続するにはsudo sqlite3 /var/lib/powerdns/pdns.sqlite3を実行します。

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には任意の名前、URIhttp://yourpowerdnserver.domain.com:8081/api/v1/servers/localhostAPI Keyに先ほど登録したKeyを入力します。
今回はIDdns01、URIにhttp://192.168.240.13:8081/api/v1/servers/localhostAPI Keyarandomgeneratedstringを入力しています(API Keyは実際は強固なものに変更しています)。
dns.png

Simple Zoneの作成

Datacenter > SDN > Zones で、新しいSimple Zoneを作成してください。前回の記事(Proxmox VEでIPAM+cloud-initを用いてIP管理 - Simple Zoneの作成)で作成した方はそのZoneを使用してください。IPAMやDHCPを使用しない場合でも登録できると思います。
DNSサーバを登録するには Advenced にチェックを入れ、DNS Serverに先ほど作成したdns01DNS Zoneにサーバを作成するZoneを入力してください。
このZoneに入力した値に基づいて、<サーバ名>.pve.box2.kmc.gr.jpといったAレコードが登録されます。

zone.png

Apply

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

使用してみる

前回の記事(Proxmox VEでIPAM+cloud-initを用いてIP管理 - テンプレートを用いたVMの作成)と同様に、テンプレートからCloneしてVMを作成します。
Nameeveとしています。
vm.png

VMを作成し起動すると自動的にAレコードが追加されていることが確認できます!

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

当然、名前解決も行うことができます。

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サーバ機能追加されないかな......ボソ)

参考

5
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
6