はじめに
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/53
が systemd-resolved
と競合してしまいます。そのため、systemd-resolved
の設定を変更してPowerdnsがポートを使用できるようにします。
設定ファイル/etc/systemd/resolved.conf
の#DNSStubListener=yes
をDNSStubListener=no
に変更します。
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
です。
#################################
# 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を入れてください。
#################################
# 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
には自サーバのセグメントを入れてください。
#################################
# 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
を実行します。
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
は実際は強固なものに変更しています)。
Simple Zoneの作成
Datacenter > SDN > Zones
で、新しいSimple Zoneを作成してください。前回の記事(Proxmox VEでIPAM+cloud-initを用いてIP管理 - Simple Zoneの作成)で作成した方はそのZoneを使用してください。IPAMやDHCPを使用しない場合でも登録できると思います。
DNSサーバを登録するには Advenced
にチェックを入れ、DNS Server
に先ほど作成したdns01
、DNS Zone
にサーバを作成するZoneを入力してください。
このZoneに入力した値に基づいて、<サーバ名>.pve.box2.kmc.gr.jp
といったAレコードが登録されます。
Apply
以上でDNSサーバの登録は完了です。SDNパネルに移動してApplyをクリックすると、適用できます。ここで。エラーや警告なしに完了すれば、無事に登録されていることになります!
使用してみる
前回の記事(Proxmox VEでIPAM+cloud-initを用いてIP管理 - テンプレートを用いたVMの作成)と同様に、テンプレートからCloneしてVMを作成します。
Name
はeve
としています。
VMを作成し起動すると自動的にAレコードが追加されていることが確認できます!
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 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サーバ機能追加されないかな......ボソ)