Contents
Overview
PowerDNS (PDNS) を使用して権威 DNS サーバー (Authoritative DNS Server) を構築します。権威 DNS サーバーとは、特定のゾーン情報の実体を保持する DNS サーバーです。
前提条件
インストール
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 | ゾーン名 | ゾーン作成時に指定したゾーン。 | |
3600 | TTL | SOA レコード自体の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 桁のシリアル番号を示す。 |
10800 | Refresh | プライマリネームサーバーがゾーンの情報をリフレッシュ(再取得)する頻度を秒単位で指定する。 | 必要に応じて変更する。 |
3600 | Retry | プライマリネームサーバーがセカンダリネームサーバーに対してデータの再送信を試みる間隔を秒単位で指定する。 | 必要に応じて変更する。 |
604800 | Expire | セカンダリネームサーバーがゾーンデータを保持できる最大期間を秒単位で指定する。 | 必要に応じて変更する。 |
3600 | Minimum TTL | ゾーン内のリソースレコードに設定される最小の TTL を秒単位で指定する。 | 必要に応じて変更する。 |
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 の逆引きレコード設定が大変なので、正引きレコードから自動生成される仕組みができるといいなと常々思っています。