21 KiB
Документация по 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