Files
Ubuntu_docs/PowerDNS_install.md
2025-03-17 07:48:47 +05:00

21 KiB
Raw Blame History

Документация по PowerDNS: https://doc.powerdns.com/authoritative/installation.html


2. Подключаемся к нужному серверу

ssh igor@192.168.200.85 -p 22

DynDNS на PowerDNS авторитативный сервер тот кто отвечает на те домены которые в его базе (рекурсивный присылает авторитативному запросы)

DNS на Ubuntu 24.04 согласно инстркции https://phoenixnap.com/kb/powerdns-ubuntu: Можно было-бы использовать не 53 порт, но провайдер не даёт указывать порт при настройке DNS серверов (не знаю какие локальные проблемы могут возникнуть если задать не 53 порт) Устанавливаем сам PowerDNS https://doc.powerdns.com/authoritative/installation.html

	sudo apt-get update &&
	sudo apt-get upgrade -y
	sudo apt-get install pdns-server -y &&
	sudo apt-get install pdns-backend-pgsql -y &&
	sudo apt-get install pdns-backend-sqlite

Для использования SQLIte копируем схему из https://doc.powerdns.com/authoritative/backends/generic-sqlite3.html

sudo apt-get install pdns-backend-sqlite3 -y
sudo apt install sqlite3 -y

Create database:

sudo sqlite3 /var/lib/powerdns/pdns.sqlite3 ".databases" &&
sudo chown pdns:pdns /var/lib/powerdns/pdns.sqlite3

Create database structure

sudo sqlite3 /var/lib/powerdns/pdns.sqlite3 <<EOF

PRAGMA foreign_keys = 1;

CREATE TABLE domains (
  id                    INTEGER PRIMARY KEY,
  name                  VARCHAR(255) NOT NULL COLLATE NOCASE,
  master                VARCHAR(128) DEFAULT NULL,
  last_check            INTEGER DEFAULT NULL,
  type                  VARCHAR(8) NOT NULL,
  notified_serial       INTEGER DEFAULT NULL,
  account               VARCHAR(40) DEFAULT NULL,
  options               VARCHAR(65535) DEFAULT NULL,
  catalog               VARCHAR(255) DEFAULT NULL
);

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


CREATE TABLE records (
  id                    INTEGER PRIMARY KEY,
  domain_id             INTEGER DEFAULT NULL,
  name                  VARCHAR(255) DEFAULT NULL,
  type                  VARCHAR(10) DEFAULT NULL,
  content               VARCHAR(65535) DEFAULT NULL,
  ttl                   INTEGER DEFAULT NULL,
  prio                  INTEGER DEFAULT NULL,
  disabled              BOOLEAN DEFAULT 0,
  ordername             VARCHAR(255),
  auth                  BOOL DEFAULT 1,
  FOREIGN KEY(domain_id) REFERENCES domains(id) ON DELETE CASCADE ON UPDATE CASCADE
);

CREATE INDEX records_lookup_idx ON records(name, type);
CREATE INDEX records_lookup_id_idx ON records(domain_id, name, type);
CREATE INDEX records_order_idx ON records(domain_id, ordername);


CREATE TABLE supermasters (
  ip                    VARCHAR(64) NOT NULL,
  nameserver            VARCHAR(255) NOT NULL COLLATE NOCASE,
  account               VARCHAR(40) NOT NULL
);

CREATE UNIQUE INDEX ip_nameserver_pk ON supermasters(ip, nameserver);


CREATE TABLE comments (
  id                    INTEGER PRIMARY KEY,
  domain_id             INTEGER NOT NULL,
  name                  VARCHAR(255) NOT NULL,
  type                  VARCHAR(10) NOT NULL,
  modified_at           INT NOT NULL,
  account               VARCHAR(40) DEFAULT NULL,
  comment               VARCHAR(65535) NOT NULL,
  FOREIGN KEY(domain_id) REFERENCES domains(id) ON DELETE CASCADE ON UPDATE CASCADE
);

CREATE INDEX comments_idx ON comments(domain_id, name, type);
CREATE INDEX comments_order_idx ON comments (domain_id, modified_at);


CREATE TABLE domainmetadata (
 id                     INTEGER PRIMARY KEY,
 domain_id              INT NOT NULL,
 kind                   VARCHAR(32) COLLATE NOCASE,
 content                TEXT,
 FOREIGN KEY(domain_id) REFERENCES domains(id) ON DELETE CASCADE ON UPDATE CASCADE
);

CREATE INDEX domainmetaidindex ON domainmetadata(domain_id);


CREATE TABLE cryptokeys (
 id                     INTEGER PRIMARY KEY,
 domain_id              INT NOT NULL,
 flags                  INT NOT NULL,
 active                 BOOL,
 published              BOOL DEFAULT 1,
 content                TEXT,
 FOREIGN KEY(domain_id) REFERENCES domains(id) ON DELETE CASCADE ON UPDATE CASCADE
);

CREATE INDEX domainidindex ON cryptokeys(domain_id);


CREATE TABLE tsigkeys (
 id                     INTEGER PRIMARY KEY,
 name                   VARCHAR(255) COLLATE NOCASE,
 algorithm              VARCHAR(50) COLLATE NOCASE,
 secret                 VARCHAR(255)
);

CREATE UNIQUE INDEX namealgoindex ON tsigkeys(name, algorithm);

EOF

Configure database connection from PowerDNS to SQLIte

sudo tee /etc/powerdns/pdns.d/pdns.local.sqlite.conf <<EOF
launch=gsqlite3
gsqlite3-database=/var/lib/powerdns/pdns.sqlite3
EOF

Set access level to file

sudo chown pdns: /etc/powerdns/pdns.d/pdns.local.sqlite.conf &&
sudo chmod 640 /etc/powerdns/pdns.d/pdns.local.sqlite.conf 

In PowerDNS configured to auto read config from dir /etc/powerdns/pdns.d/


Подключаюсь к базе и создаю схему базу со схемой из: https://doc.powerdns.com/authoritative/backends/generic-postgresql.html Настраиваю соединение с базой данных в:

sudo tee /etc/powerdns/pdns.d/pdns.local.gpgsql.conf <<EOF
launch+=gpgsql
# gmysql parameters
gpgsql-host=127.0.0.1
gpgsql-port=5432
gpgsql-dbname=powerdns
gpgsql-user=powerdns
gpgsql-password=y7HMHi0ATxx1VC3UU5WG
gpgsql-dnssec=no
EOF

Set access level to file:

sudo chown pdns: /etc/powerdns/pdns.d/pdns.local.gpgsql.conf &&
sudo chmod 640 /etc/powerdns/pdns.d/pdns.local.gpgsql.conf 

На всякий случай делаю резервные копии исходных файлов настрое:

cd /etc/powerdns &&
sudo cp named.conf named.conf.bak &&
sudo cp pdns.conf pdns.conf.bak

Наспройку файла pdns.conf авторитетный сервер, есть такой пример который следует изучить: https://raw.githubusercontent.com/trinv/PowerDNS/a56b9122f4a2de9c1f789009f09b9831f74d8bf1/pdns.template.master.conf (естественно без 1й табуляции):

  sudo mcedit /etc/powerdns/pdns.conf

Write new settings rr

cd /etc/powerdns/ &&
sudo tee pdns.conf > /dev/null <<EOF

allow-axfr-ips=127.0.0.1 #slave server ip
also-notify=127.0.0.1 #slave server ip

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

local-address=192.168.200.85,127.0.0.1
local-port=5300

log-dns-details=on
log-dns-queries=yes
log-timestamp=yes
loglevel=4

webserver=yes
webserver-address=192.168.200.85
webserver-allow-from=::/0, 0.0.0.0/0
webserver-port=8081

master=yes
slave=no

# Также активирую API
api=yes
api-key=40c89f2a-e2f3-4ff8-a245-3547111f6677
EOF

Проверяю соединение к базе перезапустив PowerDNS:

	sudo systemctl stop pdns &&
	sudo pdns_server --daemon=no --guardian=no --loglevel=9

Пытаемся открыть WEB интерфейс

start http://192.168.200.85:8081

Если всё норм выполняем:

	sudo systemctl restart pdns &&
	sudo systemctl enable pdns &&
	sudo systemctl status pdns

Проверяем что порт 5300 открыт для DNS:

	sudo ss -alnp4 | grep pdns

Если что-то не получается то проверяем кто слушает на порту 53

	sudo apt-get install net-tools -y &&
	sudo netstat -tulnp | grep :5300

Создаём зону и добавляем запись

sudo pdnsutil create-zone test ns1.test &&
sudo pdnsutil add-record test ccalm A 192.168.200.184

Проверим список зон

sudo pdnsutil list-all-zones &&
sudo pdnsutil list-zone test

Проверяем отвечалет ли:

dig @127.0.0.1 -p 5300 ccalm.test A

********** Настройка рекурсивного DNS от PowerDNS Recursor 4.9.3 порту 53 будет обрабатывать запросы с локальной машины **********

Документация: https://doc.powerdns.com/recursor/index.html Документация: https://docs.powerdns.com/recursor/indexTOC.html Чтобы работал резольвер от PowerDNS а не тот который от ubuntu на 53 порту нужно:

	sudo apt-get install pdns-recursor -y

Скачиваем список корневых серверов DNS (желательно обновлять раз в несколько месяцев)

  sudo wget -O /usr/share/dns/root.hints https://www.internic.net/domain/named.cache &&
  sudo chown pdns:pdns /usr/share/dns/root.hints
  sudo mkdir -p /var/run/pdns-recursor &&
  sudo chown pdns:pdns /var/run/pdns-recursor &&
  sudo chmod 755 /var/run/pdns-recursor
	sudo mcedit /etc/powerdns/recursor.conf

Чтобы все запросы с . уходили на публичные DNS Google:

#dnssec=off #чтобы не проверял то что записано в forward-zones через корневые серверы
local-address=192.168.200.85,127.0.0.1
#forward-zones=local=127.0.0.1:5300  # Отправлять .local в авторитативный
#forward-zones+=.=8.8.8.8;8.8.4.4  # Все остальное в интернет
forward-zones=test=127.0.0.1:5300
#forward-zones-recurse=+test=127.0.0.1:5300

Либо если оставить настройку "nssec=process" то нужно прописать в /etc/powerdns/recursor.lua добавить комкнду addNTA, если не добавить то forward-zones не будет отрабатывать. Также можно сделать чтобы dirt.kz не выходил с наружи и с резу перенаправлялся на нужный IP с временем жизни минута 30 секунд.

addNTA("test", "Local test zone") 

Пробуем запустить без сервиса чтобы посмотреть что выведит в лог

sudo pdns_recursor --daemon=no --loglevel=9

Чтобы запросы переходили на pdns-recursor Затем перезагружаем:

	sudo systemctl restart pdns-recursor &&
	sudo systemctl status pdns-recursor

Проверяем что порт 53 открыт для DNS:

	sudo ss -alnp4 | grep pdns

Если что-то не получается то проверяем кто слушает на порту 53

	sudo apt-get install net-tools -y &&
	sudo netstat -tulnp | grep :53

Проверяем что преобразование DNS нормально работает:

	dig @192.168.200.85 google.com

если уже настроил PowerDNS сервер то можно попробовать отправить:

	sudo rec_control wipe-cache test &&
	sudo rec_control wipe-cache ccalm.test &&
	dig @192.168.200.85 -p 53 ccalm.test
  dig @127.0.0.1 -p 53 ccalm.test A
  dig +trace @192.168.200.85 -p 53 ccalm.test

Проверяем логи

  sudo journalctl -u pdns-recursor --since "10 min ago"

Или так чтобы найти ошибки:

sudo journalctl -u pdns-recursor --no-pager | grep -i failed
journalctl -u pdns-recursor --no-pager | tail -n 50

********** По идее отключать не нужно так как systemd-resolved использует другой IP: 127.0.0.54:53 (Отключаю systemd-resolved иначе он будет конфликтовать с PowerDNS) **********

Редактирую /etc/netplan/ для того чтобы прописать поднятый DNS сервер на 127.0.0.1 (не знаю сработает ли так как отключу systemd-resolved)

sudo mcedit /etc/netplan/50-cloud-init.yaml

И прописываю в него:

	nameserver 127.0.0.1

After configuration modification update settings:

	sudo netplan apply

Смотрим что сгенерировалось автоматически в resolv.conf после модификации файла

	cat /etc/resolv.conf

Проверяем что интернет не перестал работать:

	ping changelogs.ubuntu.com

Может быть что команда выше пытается по IP6 работать тогда попробовать по

	ping -4 changelogs.ubuntu.com

Либо так:

	ping6 changelogs.ubuntu.com

Взглянем на текущие DNS сервера, у меня такое выдало: DNS Servers: 195.210.46.195 195.210.46.132 на команду ниже:

	resolvectl status

Отредактировал файл /etc/systemd/resolved.conf заменив nameservers на 8.8.8.8 и 8.8.4.4

sudo mcedit /etc/systemd/resolved.conf

Проверяем структуру файла:

sudo yamllint /etc/netplan/50-cloud-init.yaml

Применяем настройки:

	sudo netplan apply

Проверяем что настройки изменились:

	resolvectl status

Изменил /etc/systemd/resolved.conf настроив так:

	[Resolve]
	DNS=8.8.8.8 8.8.4.4
	FallbackDNS=1.1.1.1 1.0.0.1

Потом перезагрузил:

	sudo systemctl restart systemd-resolved

Проверяем что заняло порт 53 командой:

	sudo lsof -i :53

Выдало:

	COMMAND   PID            USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
	systemd-r 670 systemd-resolve   13u  IPv4  20070      0t0  UDP localhost:domain
	systemd-r 670 systemd-resolve   14u  IPv4  20071      0t0  TCP localhost:domain (LISTEN)

Останавливаем systemd-resolved (поисковик IP по домену по умолчанию от Ubuntu)

	sudo systemctl stop systemd-resolved &&
	sudo systemctl disable systemd-resolved

********** Устанавливаю PowerAdmin (желательно в докере устанавливать) **********

Устанавливаю PowerAdmin согласно: https://phoenixnap.com/kb/powerdns-ubuntu#ftoc-heading-6

	sudo apt install libpq-dev -y &&
	sudo apt install python3-dev -y &&
	sudo apt install python3-flask -y &&
	sudo apt install python3-pip -y
	sudo apt install -y git libmysqlclient-dev libsasl2-dev libldap2-dev libssl-dev libxml2-dev libxslt1-dev libxmlsec1-dev libffi-dev pkg-config apt-transport-https python3-venv build-essential curl &&
	sudo apt install -y nodejs &&
	sudo apt install -y yarn

устанавливаем другие зависимости:

	sudo apt install npm -y &&
	sudo apt remove yarn -y &&
	curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add - &&
	echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list &&
	sudo apt update &&
	sudo apt install yarn -y &&
	yarn --version &&
	sudo yarn install --pure-lockfile

Create user for run PowerDNS Admin

  sudo useradd -m -s /bin/bash powerdns-admin

Clone the PowerDNS Admin Git repository to /opt/web/powerdns-admin

	cd ~
	sudo git clone https://github.com/PowerDNS-Admin/PowerDNS-Admin.git /opt/web/powerdns-admin &&
	sudo chown -R powerdns-admin:powerdns-admin /opt/web/powerdns-admin &&
	cd /opt/web/powerdns-admin

Настраиваем переменные окружения:

	sudo -u powerdns-admin -s &&
	cd /opt/web/powerdns-admin

Устанавливаем перенеммые окружения и необходимые скрипты

	python3 -mvenv ./venv &&
	source ./venv/bin/activate &&
	pip install --upgrade pip &&
	pip install -r requirements.txt

Создаю базу данных

  mkdir /opt/web/powerdns-admin/data &&
  sqlite3 /opt/web/powerdns-admin/data/pdnsa.sqlite3 ".databases"

Cекретный ключ можно сгенерировать при помощи такой команды:

  python3 -c "import secrets; print(secrets.token_hex(16))"

Такой сгенерил для 192.168.200.85: 1c100fb414b8116725a04015fbaf907e

Конфигугрируем PowerDNS Admin. Для начала копирую пример конфигураци, потом открываю его в редакторе:

	cp /opt/web/powerdns-admin/configs/development.py /opt/web/powerdns-admin/configs/production.py
	mcedit /opt/web/powerdns-admin/configs/production.py

И редактируем следующие строки:

	#import urllib.parse
	SECRET_KEY = 'e951e5a1f4b94151b360f47edf596dd0'
	SQLA_DB_PASSWORD = 'changeme'

Также настраиваю подключение к базе данных (сам строку составил):

	SQLALCHEMY_DATABASE_URI = 'postgresql://powerdns:y7HMHi0ATxx1VC3UU5WG@127.0.0.1/powerdnsadmin'

Либо к новой базе данных:

	SQLALCHEMY_DATABASE_URI = 'sqlite:////opt/web/powerdns-admin/data/pdnsa.sqlite3'

Остальное коментирую:

	#SQLA_DB_USER = 'powerdns'
	#SQLA_DB_PASSWORD = 'y7HMHi0ATxx1VC3UU5WG'
	#SQLA_DB_HOST = '127.0.0.1'
	#SQLA_DB_NAME = 'powerdnsadmin'
	#SQLALCHEMY_DATABASE_URI = 'postgres://{}:{}@{}/{}'.format(
	#    urllib.parse.quote_plus(SQLA_DB_USER),
	#    urllib.parse.quote_plus(SQLA_DB_PASSWORD),
	#    SQLA_DB_HOST,
	#    SQLA_DB_NAME
	#)
	#SQLALCHEMY_DATABASE_URI = 'sqlite:///' + os.path.join(basedir, 'pdns.db')

Экспортируем переменную:

	cd /opt/web/powerdns-admin &&
	export FLASK_CONF=../configs/production.py &&
	export FLASK_APP=powerdnsadmin/__init__.py
pip install --upgrade pip setuptools wheel &&
pip install setuptools &&
pip install flask-mail

Upgrade the database schema:

	export PYTHONWARNINGS="ignore" &&
	flask db upgrade

Если выдаёт ошибки то правим исзодный код:

  mcedit /opt/web/powerdns-admin/powerdnsadmin/lib/utils.py

И заменяем экранирование

  # строку
  from distutils.version import StrictVersion
  # На строки
  from packaging.version import Version as StrictVersion
  from setuptools._distutils.util import strtobool
  deactivate
sudo su - powerdns-admin
	cd /opt/web/powerdns-admin &&
	flask assets build

Можно запускать (нужно задать переменные окружения которые выше):

	cd /opt/web/powerdns-admin &&
	source venv/bin/activate &&
	./run.py

Проще запустить с использованием SQLite по инструкции из: https://github.com/PowerDNS-Admin/PowerDNS-Admin/blob/master/docs/wiki/install/Running-PowerDNS-Admin-on-Ubuntu-or-Debian.md

Теперь можно открыть

open http://192.168.200.85:9191/login

Для создания административного пользователя нажимаем "Create an account" пример https://orcacore.com/set-up-powerdns-ubuntu-22-04/ Создал с именем igor и ппаролем !Ii123456

!!! Проверь что PowerDNS API включён в /etc/powerdns/pdns.conf !!!


Настраиваем запус на постоянную работу через Gunicorn и systemd

  cd /opt/web/powerdns-admin &&
  source venv/bin/activate &&
  pip install gunicorn
exit

Создаю файл службы:

sudo tee /etc/systemd/system/powerdns-admin.service > /dev/null <<EOF
[Unit]
Description=PowerDNS-Admin Service
After=network.target

[Service]
User=powerdns-admin
Group=powerdns-admin
WorkingDirectory=/opt/web/powerdns-admin
Environment="FLASK_CONF=../configs/production.py"
Environment="FLASK_APP=powerdnsadmin/__init__.py"
ExecStart=/opt/web/powerdns-admin/venv/bin/gunicorn --workers 2 --bind 192.168.200.85:9191 "powerdnsadmin:create_app()"
Restart=always
RestartSec=5s

[Install]
WantedBy=multi-user.target
EOF
  sudo systemctl enable powerdns-admin.service &&
  sudo systemctl start powerdns-admin.service
sudo systemctl status powerdns-admin.service
sudo journalctl -u powerdns-admin.service
start http://192.168.200.85:9191/login