久々にPowerDNS権威サーバを立ててみたのでメモ
数回に分けて記載します。
- Master/Slaveサーバインストール
- Web GUIのインストール
- レコードの更新
個人的な意見としては、権威サーバはBINDでも良いかなとも思っていますが、
PowerDNSだとレコードの更新にGUIのインターフェースが出回っておりこちらを使えるのも良い点かなと。
(正直レコードの編集とゾーンの作成などたいした作業では無いと思いますが・・・。過去にはBIND向けなどにもWeb操作ツールを作られている方がいらっしゃたようです。)
dnsdistを使った方法は後日試してみたい。
環境
- OS:CentOS7
- PowerDNS Authoritative Version:4.1系
- Backend:Mariadb
導入
インストールする
基本的にはPowerDNSの公式HPに書かれている内容で導入ができると思います
Guides and How Tos — PowerDNS Authoritative Server documentation
リポジトリをyumに追加する
# yum install epel-release yum-plugin-priorities && curl -o /etc/yum.repos.d/powerdns-auth-41.repo https://repo.powerdns.com/repo-files/centos-auth-41.repo
pdns install
今回はMariadbをバックエンドにつかうため、pdns-backend-mysql
もインストールします
# yum install pdns pdns-backend-mysql
Mariadbの設定とPowerDNS用DB作成
maridbが入っていない場合はインストールしてください、またDBのチューニング等も適宜行う
# vim /etc/my.cnf # systemctl start mariadb # mysql_secure_installation
mariadb> CREATE DATABASE powerdns; mariadb> GRANT ALL PRIVILEGES ON powerdns.* TO 'powerdns'@'localhost' IDENTIFIED BY 'dns'; mariadb> FLUSH PRIVILEGES;
全部は入れなくてもいいのですが公式HPを参考にテーブルを作成する
https://doc.powerdns.com/authoritative/backends/generic-mysql.html#default-schema
なお、4.1系の場合は上記リンクページ直後の
This is the 4.2 schema. Please find the 4.1 schema on GitHub.
からSchema情報を取得のこと。
ページに表示されているのは4.2系用で一部内容が異なるので注意(ZONE転送の部分が動かなくなります)
mariadb> use powerdns
CREATE TABLE domains ( id INT AUTO_INCREMENT, name VARCHAR(255) NOT NULL, master VARCHAR(128) DEFAULT NULL, last_check INT DEFAULT NULL, type VARCHAR(6) NOT NULL, notified_serial INT DEFAULT NULL, account VARCHAR(40) CHARACTER SET 'utf8' DEFAULT NULL, PRIMARY KEY (id) ) Engine=InnoDB CHARACTER SET 'latin1'; CREATE UNIQUE INDEX name_index ON domains(name); CREATE TABLE records ( id BIGINT AUTO_INCREMENT, domain_id INT DEFAULT NULL, name VARCHAR(255) DEFAULT NULL, type VARCHAR(10) DEFAULT NULL, content VARCHAR(64000) DEFAULT NULL, ttl INT DEFAULT NULL, prio INT DEFAULT NULL, change_date INT DEFAULT NULL, disabled TINYINT(1) DEFAULT 0, ordername VARCHAR(255) BINARY DEFAULT NULL, auth TINYINT(1) DEFAULT 1, PRIMARY KEY (id) ) Engine=InnoDB CHARACTER SET 'latin1'; CREATE INDEX nametype_index ON records(name,type); CREATE INDEX domain_id ON records(domain_id); CREATE INDEX ordername ON records (ordername); CREATE TABLE supermasters ( ip VARCHAR(64) NOT NULL, nameserver VARCHAR(255) NOT NULL, account VARCHAR(40) CHARACTER SET 'utf8' NOT NULL, PRIMARY KEY (ip, nameserver) ) Engine=InnoDB CHARACTER SET 'latin1'; CREATE TABLE comments ( id INT AUTO_INCREMENT, domain_id INT NOT NULL, name VARCHAR(255) NOT NULL, type VARCHAR(10) NOT NULL, modified_at INT NOT NULL, account VARCHAR(40) CHARACTER SET 'utf8' DEFAULT NULL, comment TEXT CHARACTER SET 'utf8' NOT NULL, PRIMARY KEY (id) ) Engine=InnoDB CHARACTER SET 'latin1'; CREATE INDEX comments_name_type_idx ON comments (name, type); CREATE INDEX comments_order_idx ON comments (domain_id, modified_at); CREATE TABLE domainmetadata ( id INT AUTO_INCREMENT, domain_id INT NOT NULL, kind VARCHAR(32), content TEXT, PRIMARY KEY (id) ) Engine=InnoDB CHARACTER SET 'latin1'; CREATE INDEX domainmetadata_idx ON domainmetadata (domain_id, kind); CREATE TABLE cryptokeys ( id INT AUTO_INCREMENT, domain_id INT NOT NULL, flags INT NOT NULL, active BOOL, content TEXT, PRIMARY KEY(id) ) Engine=InnoDB CHARACTER SET 'latin1'; CREATE INDEX domainidindex ON cryptokeys(domain_id); CREATE TABLE tsigkeys ( id INT AUTO_INCREMENT, name VARCHAR(255), algorithm VARCHAR(50), secret VARCHAR(255), PRIMARY KEY (id) ) Engine=InnoDB CHARACTER SET 'latin1'; CREATE UNIQUE INDEX namealgoindex ON tsigkeys(name, algorithm);
MariaDB [powerdns]> show tables; +--------------------+ | Tables_in_powerdns | +--------------------+ | comments | | cryptokeys | | domainmetadata | | domains | | records | | supermasters | | tsigkeys | +--------------------+ 7 rows in set (0.00 sec) MariaDB [powerdns]>
PowerDNSの設定を行う
まずバックエンドによって設定も変わることとバックエンドによって対応している機能が異なるので予め確認しておくこと
設定項目のgmysql
の部分はbackendにより異なると思うので適宜変更のこと
https://doc.powerdns.com/authoritative/backends/index.html#backends
意訳が間違ってる可能性やセキュリティに関わる部分もあるので必ず公式の設定項目説明に目を通すこと
https://doc.powerdns.com/authoritative/settings.html
# vim /etc/pdns/pdns.conf
設定項目 | パラメータ | ? |
---|---|---|
local-port | IPアドレス | Listenさせるポート(通常53番) |
setgid | pdns | 起動UID |
setuid | pdns | 起動GID |
allow-axfr-ips | IPアドレス | axfrの許可IPレンジ |
disable-axfr | no | axfrの許可 |
local-address | IPアドレス | ListenさせるIPアドレス |
launch | gmysql | backend mysql(Mariadb) |
gmysql-host | IPアドレス | MariadbのListen IP |
gmysql-user | 前手順で作成したDBユーザ名 | DB user |
gmysql-password | 前手順で作成したDBパスワード | DB password |
gmysql-dbname | 前手順で作成したDB名 | DB name |
master | yes | master or slave |
slave | no | master or slave |
slave-cycle-interval | 60 | 更新チェック間隔(Master側も) |
version-string | DNS | version.bind時の値 |
server-id | DNS | id.server時の値 |
api | yes | APIの利用 |
api-key | key | APIのkey指定 |
webserver | yes | 統計等表示のwebserver |
allow-notify-from | IPアドレス | Slave側でMasterのIPを指定 |
also-notify | IPアドレス | notify通知先(Slave) |
log-dns-queries | yes | ログ出力 |
query-logging | yes | queryのログ出力 |
loglevel | 6 | ログ出力レベル |
パフォーマンスチューニング的な設定などは含まれていないので適宜設定。
また構築時はログの出方などで対応がしやすくなるのでひとまずonに。
pdns_controlはbindアドレスを指定する場合はtcp-control-range
やsecretを設定する
Masterの設定例
local-port=53 setgid=pdns setuid=pdns allow-axfr-ips=10.0.0.0/8 disable-axfr=no local-address=10.31.0.172 launch=gmysql gmysql-host=127.0.0.1 gmysql-user=powerdns gmysql-password=dns gmysql-dbname=powerdns master=yes slave=no slave-cycle-interval=60 version-string=DNS server-id=DNS api=yes api-key=apiapiapi webserver=yes also-notify=10.0.0.1 log-dns-queries=yes query-logging=yes loglevel=6
PowerDNSの起動
# systemctl start pdns # ps axuw | grep pdns pdns 31704 0.0 1.3 831000 13280 ? Ssl 20:06 0:00 /usr/sbin/pdns_server --guardian=no --daemon=no --disable-syslog --log-timestamp=no --write-pid=no root 31742 0.0 0.0 112676 976 pts/0 R+ 20:12 0:00 grep --color=auto pdns
プロセスを見ての通りguardian
やdaemon
の設定はsystemdのExecで設定されているのでconfig上での設定は不要です
# pdns_control version 4.1.6
動作確認
version-string
で設定している値が取れている
# dig +noall +ans @localhost version.bind txt chaos version.bind. 5 CH TXT "DNS"
ちなみにカレントの設定内容は以下のコマンドでdumpできます
# pdns_control current-config | head # Autogenerated configuration file based on running instance ################################# # 8bit-dns Allow 8bit dns queries # 8bit-dns=no ################################# # allow-axfr-ips Allow zonetransfers only to these subnets # allow-axfr-ips=10.0.0.0/8 (略)
以上でPowerDNSのインストールと起動までは完了
同様の要領でSlave側も作成しておきます
次回はレコード更新用のWeb GUIをインストールします