Install PowerDNS on Debian 12.

Ensure your server is up to date.
apt update
apt upgrade

First install PowerDNS (This will throw some error message due to existing systemd resolver already on port 53.
BUT you need to install it first. If you remove systemd resolver before trying to install powerDNS apt will not be able to look up repository IP addresses.
apt install pdns-server
apt install pdns-backend-mysql

Then disable and remove systemd-resolver
systemctl disable systemd-resolved
systemctl stop systemd-resolved
mv /etc/resolv.conf /etc/resolv.conf.disabled

Then restart powerDNS
systemctl restart pdns

That is it installed. Here is an example of my configurations. Single master and 2 slaves x and y.

On the master

disable-axfr=no
allow-axfr-ips=x.x.x.x,y.y.y.y
log-dns-details=on
loglevel=9
master=yes
slave=no
config-dir=/etc/pdns
daemon=yes
guardian=yes
local-address=0.0.0.0
local-port=53
setgid=pdns
setuid=pdns
version-string=powerdns
launch=gmysql
# gmysql parameters
gmysql-host=localhost
#gmysql-port=
gmysql-dbname=
gmysql-user=
gmysql-password= gmysql-dnssec=no

On the Slaves

setuid=pdns
setgid=pdns
launch=bind
launch=gmysql
gmysql-host=localhost
gmysql-user=
gmysql-password=
gmysql-dbname=
gmysql-dnssec=no
autosecondary=yes
log-dns-details=on
loglevel=3
master=no
slave=yes
slave-cycle-interval=10

The Database Schema (4.7)

CREATE TABLE domains (
id                    INT AUTO_INCREMENT,
name                  VARCHAR(255) NOT NULL,
master                VARCHAR(128) DEFAULT NULL,
last_check            INT DEFAULT NULL,
type                  VARCHAR(8) NOT NULL,
notified_serial       INT UNSIGNED DEFAULT NULL,
account               VARCHAR(40) CHARACTER SET 'utf8' DEFAULT NULL,
options               VARCHAR(64000) DEFAULT NULL,
catalog               VARCHAR(255) DEFAULT NULL,
PRIMARY KEY (id)
) Engine=InnoDB CHARACTER SET 'latin1';

CREATE UNIQUE INDEX name_index ON domains(name);
CREATE INDEX catalog_idx ON domains(catalog);

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,
published BOOL DEFAULT 1,
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);

Be the first to comment

Leave a Reply

Your email address will not be published.


*


This site uses Akismet to reduce spam. Learn how your comment data is processed.