らくがきちょう

なんとなく ~所属組織/団体とは無関係であり、個人の見解です~

CentOS8 に PowerDNS をインストールする

以前に CentOS7 に PowerDNS をインストールする というメモを書きました。 今回は CentOS8 に PowerDNS をインストールする手順をメモしておきます。 前回のメモ同様、バックエンドには MariaDB を利用します。 インストール手順は全く同じで大丈夫ですが、今回はゾーン転送も可能な設定を行います。

systemd-resolved を停止する

後の手順で PowerDNS を起動した際、systemd-resolved が起動していると Unable to bind UDP socket to '0.0.0.0:53': Address already in use エラーが出てしまい、PowerDNS を起動することが出来ません。 この問題を避ける場合は予め systemd-resolved を停止しておきます。

systemctl disable systemd-resolved
systemctl stop systemd-resolved

MariaDB をインストールする

MariaDB をインストールし、起動設定を行います。

dnf -y install epel-release
dnf -y install mariadb mariadb-server
systemctl enable mariadb.service
systemctl start mariadb.service

初期設定を行っておきます。

mysql_secure_installation

PowerDNS のインストール

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

dnf -y install pdns pdns-backend-mysql pdns-tools

次は PowerDNS 用のデータベースを作成します。予め、データベース作成用の .sql ファイルをダウンロードしておきます。

curl -O https://raw.githubusercontent.com/sig9org/powerdns-create-db/master/create-database.sql

データベースを作成する為、まずは MariaDB へログインします。

mysql -u root -p

データベースを作成します。

CREATE DATABASE powerdns;
GRANT ALL ON powerdns.* TO 'powerdns'@'localhost' IDENTIFIED BY 'password';
FLUSH PRIVILEGES;
SOURCE create-database.sql
exit

PowerDNS 設定ファイルの修正

PowerDNS の設定ファイルは /etc/pdns/pdns.conf です。 これを以下のように変更しておきます。 DNSSEC は無効化しておきます。 また、ゾーン転送を許可したい対象 (スレーブサーバ) のアドレスを allow-axfr-ips として定義しておきます。

cat << EOF > /etc/pdns/pdns.conf
setuid=pdns
setgid=pdns
launch=gmysql
gmysql-host=localhost
gmysql-user=powerdns
gmysql-password=password
gmysql-dbname=powerdns
gmysql-dnssec=no
allow-axfr-ips=10.0.0.2
disable-axfr=no
master=yes
log-dns-queries=1
log-dns-details=on
loglevel=6
logging-facility=0
EOF

設定が完了したので PowerDNS を起動します。

systemctl enable pdns.service
systemctl start pdns.service

正引きゾーンの作成

PowerDNS に正引きゾーンを作成し、更にそのゾーン内にエントリーを作成します。

pdnsutil create-zone example.com ns1.example.com
pdnsutil add-record example.com ns1 A 192.2.0.1
pdnsutil add-record example.com www A 192.2.0.2
pdnsutil add-record example.com mail A 192.2.0.3

設定は pdnsutil list-zone で確認出来ます。

# pdnsutil list-zone example.com
$ORIGIN .
example.com     3600    IN      NS      ns1.example.com.
example.com     3600    IN      SOA     ns1.example.com hostmaster.example.com 1 10800 3600 604800 3600
mail.example.com        3600    IN      A       192.2.0.3
ns1.example.com 3600    IN      A       192.2.0.1
www.example.com 3600    IN      A       192.2.0.2

TTL はデフォルトで 3,600 秒のようです。 TTL を指定したい場合は以下のようにタイプの後に秒数を指定します (下記では 60 秒に設定しています)。

pdnsutil create-zone example.com ns1.example.com
pdnsutil add-record example.com ns1 A 60 192.2.0.1
pdnsutil add-record example.com www A 60 192.2.0.2
pdnsutil add-record example.com mail A 60 192.2.0.3

逆引きゾーンを作成する

逆引きゾーンは以下のように作成します。

pdnsutil create-zone 0.2.192.in-addr.arpa ns1.example.com
pdnsutil add-record 0.2.192.in-addr.arpa 1 PTR ns1
pdnsutil add-record 0.2.192.in-addr.arpa 2 PTR www
pdnsutil add-record 0.2.192.in-addr.arpa 3 PTR mail

ゾーン転送をテストする

PowerDNS でゾーン設定が完了したら allow-axfr-ips でアドレスを許可している別コンピュータからゾーン転送を試してみます。 今回は dig でテストを行いました。 以下のようにゾーンの内容が転送されていれば正常です。

# dig @10.0.0.1 -t axfr example.com

; <<>> DiG 9.11.13-RedHat-9.11.13-6.el8_2.1 <<>> @10.0.0.1 -t axfr example.com
; (1 server found)
;; global options: +cmd
example.com.            3600    IN      SOA     ns1.example.com. hostmaster.example.com. 1 10800 3600 604800 3600
example.com.            3600    IN      NS      ns1.example.com.
mail.example.com.       3600    IN      A       192.2.0.3
ns1.example.com.        3600    IN      A       192.2.0.1
www.example.com.        3600    IN      A       192.2.0.2
example.com.            3600    IN      SOA     ns1.example.com. hostmaster.example.com. 1 10800 3600 604800 3600
;; Query time: 4 msec
;; SERVER: 10.0.0.1#53(10.0.0.1)
;; WHEN: Tue Nov 03 19:28:33 JST 2020
;; XFR size: 6 records (messages 3, bytes 297)

もしゾーン転送に失敗するようであれば以下などを確認します。

  • ゾーン転送要求を出すコンピュータのアドレスが allow-axfr-ips に登録されているか?
  • DNSSEC を設定している場合は適切な設定がされているか? (DNSSEC が原因であれば一時的に gmysql-dnssec=no を設定し、DNSSEC を無効化することでトラブルシューティング出来る)
  • firewalld や外部ファイアウォールDNS 通信がブロックされていないか?

ゾーンの内容を修正する

レコードを追加する場合は add-record を使いますが、特定のレコードを削除することは出来ないようです。 その為、検証レベルであれば clear-zone でゾーンの内容を全消去してしまい、修正したエントリーを追加します。 初めてゾーンを作成した場合は SOA レコードも同時に作成されるのですが、clear-zone を実行すると SOA レコードまで削除されてしまいます。 その為、手動で SOA レコードも追加しておきます。

pdnsutil clear-zone example.com
pdnsutil add-record example.com . SOA 'ns1.example.com. hostmaster.example.com. 1 10800 3600 604800 3600'
pdnsutil add-record example.com ns1 A 192.2.0.11
pdnsutil add-record example.com www A 192.2.0.12
pdnsutil add-record example.com mail A 192.2.0.13
pdnsutil list-zone example.com

シリアル番号を増やす

SOA レコードのシリアル番号を増やすには pdnsutil increase-serial を実行します。

pdnsutil increase-serial example.com