PowerDNS Authoriative(権威DNS)の構築

  • Ubuntu 18.04.1 LTS
  • PowerDNS 4

MariaDBの導入

https://downloads.mariadb.org/mariadb/repositories/#distro=Ubuntu&distro_release=bionic--ubuntu_bionic&mirror=liteserver&version=10.4

sudo apt-get install software-properties-common
sudo apt-key adv --recv-keys --keyserver hkp://keyserver.ubuntu.com:80 0xF1656F24C74CD1D8
sudo add-apt-repository 'deb [arch=amd64,arm64,ppc64el] http://mariadb.mirror.liteserver.nl/repo/10.4/ubuntu bionic main'

sudo apt update
sudo apt install mariadb-server

PowerDNSの導入

https://repo.powerdns.com

echo "deb [arch=amd64] http://repo.powerdns.com/ubuntu bionic-auth-master main"  | sudo tee /etc/apt/sources.list.d/pdns.list

cat <<EOF | sudo tee /etc/apt/preferences.d/pdns
Package: pdns-*
Pin: origin repo.powerdns.com
Pin-Priority: 600
EOF 

PowerDNSのインストール

鍵を導入、アップデート、インストール

curl https://repo.powerdns.com/CBC8B383-pub.asc | sudo apt-key add - 
sudo apt-get update 
sudo apt install pdns-server pdns-backend-mysql

Systemd Resolvedを停止

dns - How to disable systemd-resolved in Ubuntu? - Ask Ubuntu

systemd resolvedが53/udpを使用しているので停止

sudo systemctl stop systemd-resolved

再起動後の起動も止める

sudo systemctl disable systemd-resolved

自身のホスト名で名前解決ができなくなるので、以下を参考に /etc/hosts を修正する。

127.0.0.1       dns-dhcp.a910.tak-cslab.org  dns-dhcp

自身のホスト名で ping が実行できるか確かめる

ping $(hostname)

PowerDNSを起動

以下で状態を確かめる。

sudo systemctl status pdns

起動していない場合は起動して永続化する。

sudo systemctl start pdns
sudo systemctl enable pdns

PowerDNSのセットアップ

https://doc.powerdns.com/authoritative/guides/basic-database.html

MariaDBでユーザーとテーブル作成

$ sudo mysql -uroot

### MariaDBコンソールで以下を実行

CREATE DATABASE データベース名 CHARACTER SET utf8;
GRANT ALL PRIVILEGES ON データベース名.* TO ユーザ名@localhost IDENTIFIED BY 'パスワード';

続けて以下のテーブルを作成

use データベース名;

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 UNSIGNED 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,
  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);

Ctrl + Dで終了する。

$ cd /etc/powerdns/

PowerDNSの設定を行う

$ sudo cp pdns.conf pdns.conf.org

設定ファイル /etc/powerdns/pdns.conf を編集する

include-dir=/etc/powerdns/pdns.d

local-address=127.0.0.1
local-port=5300

setgid=pdns
setuid=pdns

launch=gmysql
gmysql-host=127.0.0.1
gmysql-user=ユーザー名
gmysql-dbname=データベース名
gmysql-password=パスワード

## DDNS
dnsupdate=yes
allow-dnsupdate-from=127.0.0.0/8,::1
forward-dnsupdate=yes

レコードの投入

## ゾーンの作成
sudo pdnsutil create-zone a910.tak-cslab.org ns1.a910.tak-cslab.org

## レコードの追加
sudo pdnsutil add-record a910.tak-cslab.org ns1 A 192.168.100.6

## ゾーンの確認
sudo pdnsutil list-zone a910.tak-cslab.org

## ゾーンの編集
sudo pdnsutil edit-zone a910.tak-cslab.org

参考

★公式ドキュメント