ろーてくxyz blog

ローテクを駆使してIT関係でサヴァイヴしようとする人による備忘録

PowerDNS Authoritative Install Memo Part1

久々に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

プロセスを見ての通りguardiandaemonの設定は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をインストールします