手当たり次第に書くんだ

飽きっぽいのは本能

Ubuntu 22.04 PowerDNS 権威 DNS サーバー構築

目次に戻る

Overview

PowerDNS (PDNS) を使用して権威 DNS サーバー (Authoritative DNS Server) を構築します。権威 DNS サーバーとは、特定のゾーン情報の実体を保持する DNS サーバーです。

前提条件

  • こちらを参考に基本設定が完了していること。
  • こちらを参考に MariaDB の構築が完了していること。
  • MariaDB はローカルホストで稼働していることを前提としています。

インストール

PowerDNS をインストールします。

myadmin@ubuntu:~$ sudo apt -y install pdns-server pdns-tools pdns-backend-mysql
  • pdns-server: PowerDNS 本体です。リゾルバ機能は含まれません。リゾルバ機能を使用するには pdns-recursor をインストールする必要があります。
  • pdns-tools: PowerDNS を操作するためのコマンドセットです。
  • pdns-backend-mysql: PowerDNS のバックエンド MariaDB を使用する際に必要です。

/etc/powerdns/pdns.conf

/etc/powerdns/pdns.conf は PowerDNS の設定ファイルです。

デフォルト値

デフォルト値は以下の通りです。

myadmin@ubuntu:~$ sudo grep -v -e '^\s*#' -e '^\s*$' /etc/powerdns/pdns.conf | expand | tr -s [:space:] | sed 's/^ /    /g'
include-dir=/etc/powerdns/pdns.d
launch=
security-poll-suffix=

設定値

設定例は以下の通りです。Ubuntu では デフォルトで systemd-resolved が稼働しており、それが UDP/53 を使用しているため、デフォルトの設定では PowerDNS が起動しません。このため、local-address で Listen する IP アドレスを指定しています。本稿では systemd-resolved を無効化する方法は言及しません。

myadmin@ubuntu:~$ sudo cp /etc/powerdns/pdns.conf /etc/powerdns/pdns.conf.orig
myadmin@ubuntu:~$ sudo tee /etc/powerdns/pdns.conf <<"EOF"
include-dir=/etc/powerdns/pdns.d
launch=gmysql
gmysql-host=127.0.0.1
gmysql-port=3306
gmysql-dbname=pdns
gmysql-user=pdns
gmysql-password=password
gmysql-dnssec=yes
local-address=127.0.0.1, ::1, 10.1.0.53, fd00::a01:35
security-poll-suffix=
EOF

データベース設定

MariaDB に接続します。

myadmin@ubuntu:~$ sudo mariadb

pdns データベースを作成します。次に、pdns データベースに対して、全ての権限を持つ pdns ユーザーを作成します。

MariaDB [(none)]> create database pdns;
MariaDB [(none)]> grant all privileges on pdns.* to pdns@localhost identified by 'password';
MariaDB [(none)]> exit

PDNS のスキーマを読み込ませます。

myadmin@ubuntu:~$ sudo mariadb -D pdns < /usr/share/pdns-backend-mysql/schema/schema.mysql.sql

設定の有効化

設定を有効化します。

myadmin@ubuntu:~$ sudo systemctl restart pdns.service && systemctl status pdns.service

ゾーン作成

正引きゾーンを作成します。WARNING: MYSQL_OPT_RECONNECT is deprecated and will be removed in a future version. は、MYSQL_OPT_RECONNECTが非推奨になり、今後のバージョンで削除されるという警告が発生しているという内容です。これは、現状では pdnsutil を実行する度に出力されます。以降の出力例では省略しています。

myadmin@ubuntu:~$ sudo pdnsutil create-zone si1230.com
WARNING: MYSQL_OPT_RECONNECT is deprecated and will be removed in a future version.
WARNING: MYSQL_OPT_RECONNECT is deprecated and will be removed in a future version.
Feb 23 16:00:35 [bindbackend] Done parsing domains, 0 rejected, 0 new, 0 removed
Creating empty zone 'si1230.com'

IPv4 逆引きゾーンを作成します。

myadmin@ubuntu:~$ sudo pdnsutil create-zone 16.172.in-addr.arpa
Feb 23 16:02:43 [bindbackend] Done parsing domains, 0 rejected, 0 new, 0 removed
Creating empty zone '16.172.in-addr.arpa'

IPv6 逆引きゾーンを作成します。

myadmin@ubuntu:~$ sudo pdnsutil create-zone 0.1.c.a.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.d.f.ip6.arpa
Feb 23 16:03:20 [bindbackend] Done parsing domains, 0 rejected, 0 new, 0 removed
Creating empty zone '0.1.c.a.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.d.f.ip6.arpa'

作成されたゾーンは以下のように確認できます。

myadmin@ubuntu:~$ sudo pdnsutil list-all-zones
Feb 26 17:24:20 [bindbackend] Done parsing domains, 0 rejected, 0 new, 0 removed
si1230.com
16.172.in-addr.arpa
0.1.c.a.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.d.f.ip6.arpa

SOA, NS レコード

各ゾーンのレコードは以下のように確認します。以下は例として si1230.com について出力させていますが、出力例の通り、デフォルトでは SOA レコードのみが存在し、一部の値は適切ではありません。

myadmin@ubuntu:~$ sudo pdnsutil list-zone si1230.com
Feb 26 17:31:32 [bindbackend] Done parsing domains, 0 rejected, 0 new, 0 removed
$ORIGIN .
si1230.com	3600	IN	SOA	a.misconfigured.dns.server.invalid hostmaster.si1230.com 0 10800 3600 604800 3600

SOA レコードの詳細

上記の出力について、BIND を設定した経験のある人ならわかると思いますが、改めて整理してみます。

まず、$ORIGIN . については、ゾーンファイル内の各レコードの出力が、そのゾーンファイル内でのドメイン名の起点となることを示しています。つまり、si1230.com というドメインがルートからの相対パスで指定されることを示します。

デフォルト値設定項目説明備考
si1230.comゾーン名ゾーン作成時に指定したゾーン。
3600TTLSOA レコード自体のTTL (Time-to-Live)。TTL はレコードがキャッシュされる時間を制御する。必要に応じて変更する。
INクラスレコードのクラス。IN は Internet を意味する。ほとんどの場合、IN が使用される。
SOAレコードタイプSOA レコードであることを示す。SOA レコードは、ゾーンのスタートオブオーソリティを定義する。SOA レコードは各ゾーンに対して必ず一つ存在する。
a.misconfigured.dns.server.invalidプライマリメールサーバープライマリネームサーバーのホスト名を示す。このホストがゾーンの管理者であり、最終的な権威を持つ。変更が必須。
hostmaster.si1230.comドメインの管理者のメールアドレスドメインの管理者のメールアドレスを示す。このメールアドレスは、このゾーンに関する問題や情報の連絡先として使用される。@ ではないことに注意する。変更が必須。
0シリアル番号ゾーンファイルのシリアル番号を示す。この番号は、変更が行われるたびに増加させる必要がある。一般的に、YYYYMMDDSS で設定されるため、それに合わせた方が良い。SS は 2 桁のシリアル番号を示す。
10800Refreshプライマリネームサーバーがゾーンの情報をリフレッシュ(再取得)する頻度を秒単位で指定する。必要に応じて変更する。
3600Retryプライマリネームサーバーがセカンダリネームサーバーに対してデータの再送信を試みる間隔を秒単位で指定する。必要に応じて変更する。
604800Expireセカンダリネームサーバーがゾーンデータを保持できる最大期間を秒単位で指定する。必要に応じて変更する。
3600Minimum TTLゾーン内のリソースレコードに設定される最小の TTL を秒単位で指定する。必要に応じて変更する。
SOA レコード

NS レコードの登録

NS レコードを登録します。NS レコードは SOA レコードを修正する際にも必須となるため、最初に設定します。NS レコードは全てのゾーンに設定します。

myadmin@ubuntu:~$ sudo pdnsutil add-record si1230.com '' NS 'dns.si1230.com'
Feb 26 18:38:24 [bindbackend] Done parsing domains, 0 rejected, 0 new, 0 removed
New rrset:
si1230.com. 3600 IN NS dns.si1230.com
myadmin@ubuntu:~$ sudo pdnsutil add-record 16.172.in-addr.arpa '' NS 'dns.si1230.com'
Feb 26 20:02:33 [bindbackend] Done parsing domains, 0 rejected, 0 new, 0 removed
New rrset:
16.172.in-addr.arpa. 3600 IN NS dns.si1230.com
myadmin@ubuntu:~$ sudo pdnsutil add-record 0.1.c.a.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.d.f.ip6.arpa '' NS 'dns.si1230.com'
Feb 26 20:03:33 [bindbackend] Done parsing domains, 0 rejected, 0 new, 0 removed
New rrset:
0.1.c.a.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.d.f.ip6.arpa. 3600 IN NS dns.si1230.com

add-record の書式は以下の通りです。NS レコードや MX レコードは name が存在しないため、'' で空欄を指定する必要があります。[ttl] を指定しない場合、3600 が割り当てられます。content はスペースを開けて複数同時に設定することができます。

Syntax: pdnsutil add-record ZONE name type [ttl] "content" ["content"...]

以下のように NS レコードが登録されます。

myadmin@ubuntu:~$ sudo pdnsutil list-zone si1230.com
Feb 26 18:38:36 [bindbackend] Done parsing domains, 0 rejected, 0 new, 0 removed
$ORIGIN .
si1230.com	3600	IN	NS	dns.si1230.com.
si1230.com	3600	IN	SOA	a.misconfigured.dns.server.invalid hostmaster.si1230.com 0 10800 3600 604800 3600

SOA レコードの修正

まず、pdnsutil コマンドについてですが、前述の通り、add-record で新規レコードの登録はできますが、コマンドベースでのレコード修正や削除はできないようです。このため、edit-zone でエディタを使用して編集する必要があります。この辺は今後のアップデートに期待したいと思います。

SOA レコードを修正します。以下の通り、edit-zone を使用すると、エディタが起動します。本稿の環境では nano が起動しました。vi の方が良いのですが、常時使用するわけではないので、まあ良しとします。変更も可能かもしれませんが、さほど重要ではないので割愛します。

myadmin@ubuntu:~$ sudo pdnsutil edit-zone si1230.com

エディタが起動したら、以下の出力になるように編集します。特に制約がなければ全てのゾーンで同じ設定にします。

myadmin@ubuntu:~$ sudo pdnsutil list-zone si1230.com
Feb 26 19:19:16 [bindbackend] Done parsing domains, 0 rejected, 0 new, 0 removed
$ORIGIN .
si1230.com	3600	IN	NS	dns.si1230.com.
si1230.com	8000	IN	SOA	dns.si1230.com myadmin.si1230.com 2024022601 10800 3600 604800 3600

MX レコード

MX レコードを登録します。これは、管理対象ドメインにメールサーバーが存在しない場合は設定不要です。MX レコードは正引きのゾーンに設定します。

myadmin@ubuntu:~$ sudo pdnsutil add-record si1230.com '' MX '10 mail.si1230.com'
Feb 26 19:26:38 [bindbackend] Done parsing domains, 0 rejected, 0 new, 0 removed
New rrset:
si1230.com. 3600 IN MX 10 mail.si1230.com

A レコード

A レコードを登録します。

myadmin@ubuntu:~$ sudo pdnsutil add-record si1230.com dns A '172.16.0.53'
Feb 26 19:47:33 [bindbackend] Done parsing domains, 0 rejected, 0 new, 0 removed
New rrset:
dns.si1230.com. 3600 IN A 172.16.0.53
myadmin@ubuntu:~$ sudo pdnsutil add-record si1230.com mail A '172.16.0.25'
Feb 26 19:30:21 [bindbackend] Done parsing domains, 0 rejected, 0 new, 0 removed
New rrset:
mail.si1230.com. 3600 IN A 172.16.0.25

AAAA レコード

AAAA レコードを登録します。

myadmin@ubuntu:~$ sudo pdnsutil add-record si1230.com dns AAAA 'fd00::ac10:35'
Feb 26 19:33:46 [bindbackend] Done parsing domains, 0 rejected, 0 new, 0 removed
New rrset:
dns.si1230.com. 3600 IN AAAA fd00::ac10:35
myadmin@ubuntu:~$ sudo pdnsutil add-record si1230.com mail AAAA 'fd00::ac10:19'
Feb 26 19:34:02 [bindbackend] Done parsing domains, 0 rejected, 0 new, 0 removed
New rrset:
mail.si1230.com. 3600 IN AAAA fd00::ac10:19

IPv4 PTR レコード

IPv4 PTR レコードを登録します。

myadmin@ubuntu:~$ sudo pdnsutil add-record 16.172.in-addr.arpa 53.0 PTR 'dns.si1230.com'
Feb 26 19:38:04 [bindbackend] Done parsing domains, 0 rejected, 0 new, 0 removed
New rrset:
53.0.16.172.in-addr.arpa. 3600 IN PTR dns.si1230.com
myadmin@ubuntu:~$ sudo pdnsutil add-record 16.172.in-addr.arpa 25.0 PTR 'mail.si1230.com'
Feb 26 19:39:36 [bindbackend] Done parsing domains, 0 rejected, 0 new, 0 removed
New rrset:
25.0.16.172.in-addr.arpa. 3600 IN PTR mail.si1230.com

IPv6 PTR レコード

IPv6 PTR レコードを登録します。

myadmin@ubuntu:~$ sudo pdnsutil add-record 0.1.c.a.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.d.f.ip6.arpa 5.3.0.0 PTR 'dns.si1230.com'
Feb 26 19:44:17 [bindbackend] Done parsing domains, 0 rejected, 0 new, 0 removed
New rrset:
5.3.0.0.0.1.c.a.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.d.f.ip6.arpa. 3600 IN PTR dns.si1230.com
myadmin@ubuntu:~$ sudo pdnsutil add-record 0.1.c.a.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.d.f.ip6.arpa 9.1.0.0 PTR 'mail.si1230.com'
Feb 26 19:45:05 [bindbackend] Done parsing domains, 0 rejected, 0 new, 0 removed
New rrset:
9.1.0.0.0.1.c.a.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.d.f.ip6.arpa. 3600 IN PTR mail.si1230.com

最終的なレコードの確認

ここまでに問題なければ、以下のようにレコードが登録されていると思います。

myadmin@ubuntu:~$ sudo pdnsutil list-zone si1230.com
Feb 26 20:05:04 [bindbackend] Done parsing domains, 0 rejected, 0 new, 0 removed
$ORIGIN .
dns.si1230.com	3600	IN	A	172.16.0.53
dns.si1230.com	3600	IN	AAAA	fd00::ac10:35
mail.si1230.com	3600	IN	A	172.16.0.25
mail.si1230.com	3600	IN	AAAA	fd00::ac10:19
si1230.com	3600	IN	MX	10 mail.si1230.com.
si1230.com	3600	IN	NS	dns.si1230.com.
si1230.com	8000	IN	SOA	dns.si1230.com myadmin.si1230.com 2024022601 10800 3600 604800 3600
myadmin@ubuntu:~$ sudo pdnsutil list-zone 16.172.in-addr.arpa
Feb 26 20:05:14 [bindbackend] Done parsing domains, 0 rejected, 0 new, 0 removed
$ORIGIN .
16.172.in-addr.arpa	3600	IN	NS	dns.si1230.com.
16.172.in-addr.arpa	3600	IN	SOA	dns.si1230.com myadmin.si1230.com 2024022601 10800 3600 604800 3600
25.0.16.172.in-addr.arpa	3600	IN	PTR	mail.si1230.com
53.0.16.172.in-addr.arpa	3600	IN	PTR	dns.si1230.com
myadmin@ubuntu:~$ sudo pdnsutil list-zone 0.1.c.a.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.d.f.ip6.arpa
Feb 26 20:05:35 [bindbackend] Done parsing domains, 0 rejected, 0 new, 0 removed
$ORIGIN .
0.1.c.a.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.d.f.ip6.arpa	3600	IN	NS	dns.si1230.com.
0.1.c.a.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.d.f.ip6.arpa	3600	IN	SOA	dns.si1230.com myadmin.si1230.com 2024022601 10800 3600 604800 3600
5.3.0.0.0.1.c.a.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.d.f.ip6.arpa	3600	IN	PTR	dns.si1230.com
9.1.0.0.0.1.c.a.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.d.f.ip6.arpa	3600	IN	PTR	mail.si1230.com

正常性確認

こちらを参考に dig コマンドを使用して確認してください。

PowerDNS の感想

PowerDNS は BIND に変わる次世代の DNS になると思います。バックエンドにデータベースを使用することで、他のシステムとの連携が非常に柔軟になっていますし、このデータベースは SQLite, MySQL (MariaDB), LDAP など、複数の選択肢があります。また、権威 DNS と DNS リゾルバを完全に分離して提供していることもセキュリティ観点で良いと思いますし、マイクロサービスアーキテクチャ的なアプローチだと思います。一方で、現時点では BIND を完全に否定するものではなく、あまり事例はないようですが、BIND でもバックエンドにデータベースを使用することができます。BIND は長い歴史の信頼性がありますが、PowerDNS はまだまだ歴史が浅く、ツール類などが成熟しきっていない印象もあります。どちらも DNS という仕組み上、提供する情報の構造が同じなので、BIND から PowerDNS への移行も違和感なくできるのではないかと思います。個人的な 要望としては、IPv6 の逆引きレコード設定が大変なので、正引きレコードから自動生成される仕組みができるといいなと常々思っています。

目次に戻る

Ubuntu 22.04 PowerDNS 権威 DNS サーバー構築

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

トップへ戻る