Ubuntu 22.04 で権威 DNS を運用する場合、ゾーンファイルを直接編集する BIND だけでなく、DB バックエンドでゾーンを管理する PowerDNS も選択肢になります。API や管理画面と組み合わせたい場合、PowerDNS は扱いやすい構成にできます。
この記事では、PowerDNS Authoritative Server を SQLite バックエンドで動かし、正引きゾーン、IPv6 レコード、逆引きゾーン、外部公開時の確認点を扱います。Ubuntu 22.04 の既存環境を保守するための確認記事です。
- PowerDNS 権威 DNS の位置づけ
- SQLite バックエンドの設定
- 正引きゾーンと IPv6 レコードの作成
- 逆引きゾーンの作成
- 外部公開時の確認点
書籍
Advanced Ubuntu Administration and Management Best Practices
Ubuntu Server の運用項目を体系的に確認したい場合の参考書籍です。価格や在庫はリンク先で確認してください。
Amazon で見るこのリンクは Amazon アソシエイトリンクです。
PowerDNS の位置づけ
PowerDNS Authoritative Server は、権威 DNS サーバーとしてゾーンを応答するためのソフトウェアです。BIND のような zone file ベースの運用とは異なり、SQLite、MariaDB、PostgreSQL などの DB バックエンドを使えます。
- 権威 DNS としてゾーンを応答する
- 再帰 resolver として使うものではない
- DB バックエンドでレコードを管理できる
pdnsutilでゾーンやレコードを操作できる- 外部公開時は glue、NS、SOA、firewall を合わせて確認する
小規模な検証や単一サーバーでは SQLite バックエンドが扱いやすく、複数台構成や管理画面連携では MariaDB / PostgreSQL バックエンドを検討します。
PowerDNS をインストールする
ここでは SQLite バックエンドを使うため、pdns-server、pdns-backend-sqlite3、確認用の dnsutils を導入します。
sudo apt update
sudo DEBIAN_FRONTEND=noninteractive apt-get install -y pdns-server pdns-backend-sqlite3 dnsutils
pdns_server --versionSQLite バックエンドを設定する
PowerDNS の backend 設定を作成します。SQLite database は /var/lib/powerdns/pdns.sqlite3 に置きます。
sudo tee /etc/powerdns/pdns.d/pdns.local.gsqlite3.conf >/dev/null <<'EOF'
launch=gsqlite3
gsqlite3-database=/var/lib/powerdns/pdns.sqlite3
EOF
sudo systemctl restart pdns
sudo systemctl status pdns --no-pager起動に失敗する場合は、backend 設定、database path、PowerDNS のログを確認します。
sudo journalctl -u pdns -n 80 --no-pager
sudo ls -l /var/lib/powerdns/ /etc/powerdns/pdns.d/ゾーンを作成する
例として example.com の正引きゾーンを作成します。ns1.example.com を NS とし、A、MX レコードを追加します。
sudo pdnsutil create-zone example.com ns1.example.com
sudo pdnsutil add-record example.com ns1 A 203.0.113.10
sudo pdnsutil add-record example.com www A 203.0.113.20
sudo pdnsutil add-record example.com mail A 203.0.113.30
sudo pdnsutil add-record example.com @ MX '10 mail.example.com.'
sudo pdnsutil increase-serial example.comIPv6 レコードを追加する
IPv6 を使う場合は AAAA レコードも追加します。公開 DNS では、IPv4 と IPv6 の両方で到達できるかを別途確認します。
sudo pdnsutil add-record example.com ns1 AAAA 2001:db8::10
sudo pdnsutil add-record example.com www AAAA 2001:db8::20
sudo pdnsutil increase-serial example.comゾーン内容を確認する
pdnsutil でゾーン内容を確認し、dig で PowerDNS へ問い合わせます。
sudo pdnsutil list-zone example.com
dig @127.0.0.1 example.com SOA
dig @127.0.0.1 example.com NS
dig @127.0.0.1 www.example.com A
dig @127.0.0.1 www.example.com AAAA
dig @127.0.0.1 example.com MX逆引きゾーンを作成する
IPv4 の逆引きゾーンを作成します。公開 IP の逆引きは、実際には割り当て元や上位事業者の委任設定が必要です。
sudo pdnsutil create-zone 113.0.203.in-addr.arpa ns1.example.com
sudo pdnsutil add-record 113.0.203.in-addr.arpa 20 PTR www.example.com.
sudo pdnsutil add-record 113.0.203.in-addr.arpa 30 PTR mail.example.com.
sudo pdnsutil increase-serial 113.0.203.in-addr.arpa
dig @127.0.0.1 -x 203.0.113.20待ち受けと firewall を確認する
外部へ権威 DNS として公開する場合は、UDP/TCP 53 番の待ち受けと firewall を確認します。
ss -lunp | grep ':53' || true
ss -ltnp | grep ':53' || true
sudo ufw status verbose 2>/dev/null || true権威 DNS は TCP 53 番も必要です。大きな応答、DNSSEC、zone transfer などで TCP が使われるため、UDP だけ開ける運用は避けます。
外部公開時の注意
- 権威 DNS と recursive resolver を混ぜない
- NS レコードと glue レコードを合わせる
- SOA serial を更新する運用を決める
- UDP/TCP 53 番を確認する
- 外部監視で応答と serial を確認する
公開 DNS では、サーバー単体の設定だけでなく、レジストラ側の NS 登録、glue、上位 DNS からの委任、firewall、IPv6 到達性を合わせて確認します。
BIND と PowerDNS の使い分け
zone file を Git などで管理したい場合は BIND が扱いやすいことがあります。一方、管理画面、API、DB と組み合わせてレコード管理したい場合は PowerDNS が向いています。
- 単純な zone file 管理なら BIND が分かりやすい
- DB 管理や API 連携なら PowerDNS が扱いやすい
- 複数人で変更するなら承認フローを用意する
- 外部公開では監視と履歴管理を重視する
バックアップを確認する
SQLite バックエンドでは database ファイルが状態を持ちます。設定ファイルと database ファイルの両方をバックアップ対象にします。
sudo install -d -m 0750 /var/backups/powerdns
sudo cp -a /etc/powerdns /var/backups/powerdns/etc-powerdns
sudo cp -a /var/lib/powerdns/pdns.sqlite3 /var/backups/powerdns/pdns.sqlite3
sudo ls -lh /var/backups/powerdnsまとめ
Ubuntu 22.04 の PowerDNS は、DB バックエンドで権威 DNS ゾーンを管理できます。SQLite バックエンドは小規模な検証や単一サーバーで扱いやすく、MariaDB / PostgreSQL バックエンドは複数台構成や管理画面連携に向いています。
外部公開する場合は、PowerDNS の設定だけでなく、NS、glue、SOA serial、UDP/TCP 53 番、監視、バックアップまで合わせて確認します。

