Установка PowerDNS и PowerDNS-Admin на Ubuntu 22.04
К чему приведёт эта инструкция
- Развернёте PowerDNS (авторитативный DNS) с хранением зон в MariaDB.
- Установите PowerDNS‑Admin — удобную веб‑консоль для управления зонами.
- Настроите Nginx как обратный прокси и systemd‑юнит для сервиса.
Важно: примеры команд используют учетные данные вида pdnsadmin / password и домен pdnsadmin.example.com — замените их на безопасные значения в рабочей среде.
Быстрая структура действий
- Подготовка сервера и домена.
- Установка MariaDB и создание БД/пользователя.
- Установка PowerDNS и импорт схемы.
- Установка PowerDNS‑Admin + зависимости (Python, Node.js, Yarn).
- Настройка Nginx и systemd‑служб.
- Тестирование и базовая безопасность.
Предварительные требования
- Сервер с Ubuntu 22.04.
- Домен, указывающий на IP сервера (A/AAAA записи).
- Пароль root или другой пользователь с sudo.
Установка и настройка MariaDB
Установите MariaDB сервер:
apt-get install mariadb-server -yВойдите в MariaDB и создайте базу и пользователя для PowerDNS:
mysqlВ MariaDB:
MariaDB [(none)]> create database pdns;
MariaDB [(none)]> grant all on pdns.* to pdnsadmin@localhost identified by 'password';
MariaDB [(none)]> flush privileges;
MariaDB [(none)]> exit;Совет: используйте длинный случайный пароль и при необходимости создавайте пользователя с доступом только с localhost.
Установка PowerDNS
Отключите systemd‑resolved (если он мешает):
systemctl disable --now systemd-resolvedПересоздайте /etc/resolv.conf (пример с резолвером Google — замените при необходимости):
rm -rf /etc/resolv.conf
echo "nameserver 8.8.8.8" > /etc/resolv.confУстановите пакет PowerDNS и MySQL бэкенд:
apt-get install pdns-server pdns-backend-mysql -yИмпорт схемы базы PowerDNS
mysql -u pdnsadmin -p pdns < /usr/share/pdns-backend-mysql/schema/schema.mysql.sqlКонфигурация подключения к БД
Создайте файл конфигурации для gmysql бекенда:
nano /etc/powerdns/pdns.d/pdns.local.gmysql.confСодержимое:
# MySQL Configuration
#
# Launch gmysql backend
launch+=gmysql
# gmysql parameters
gmysql-host=127.0.0.1
gmysql-port=3306
gmysql-dbname=pdns
gmysql-user=pdnsadmin
gmysql-password=password
gmysql-dnssec=yes
# gmysql-socket=Задайте права:
chmod 640 /etc/powerdns/pdns.d/pdns.local.gmysql.conf
chown pdns:pdns /etc/powerdns/pdns.d/pdns.local.gmysql.confЛокальный запуск для отладки
systemctl stop pdns
pdns_server --daemon=no --guardian=no --loglevel=9Если соединение с БД успешное, в логах будет сообщение о подключении к базе ‘pdns’ на 127.0.0.1.
Запустите сервис:
systemctl start pdns
systemctl status pdnsПроверьте слушающие сокеты (порт 53):
ss -alnp4 | grep pdnsУстановка PowerDNS‑Admin (веб‑интерфейс)
PowerDNS‑Admin — приложение на Python/Flask. Разворачиваем его в /var/www/html/pdns и обслуживаем через Nginx.
Зависимости
apt-get install nginx python3-dev libsasl2-dev libldap2-dev libssl-dev libxml2-dev libxslt1-dev libxmlsec1-dev libffi-dev pkg-config apt-transport-https virtualenv build-essential libmariadb-dev git python3-flask libpq-dev -yДобавьте Node.js репозиторий и установите nodejs (пример для Node 16):
curl -sL https://deb.nodesource.com/setup_16.x | bash -
apt-get install nodejs -yДобавьте Yarn и установите:
curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add -
echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list
apt-get update -y
apt-get install yarn -yСкачивание и подготовка PowerDNS‑Admin
git clone https://github.com/ngoduykhanh/PowerDNS-Admin.git /var/www/html/pdns
cd /var/www/html/pdns/
virtualenv -p python3 flask
source ./flask/bin/activate
pip install -r requirements.txt
deactivateНастройка конфигурации приложения
Отредактируйте файл конфигурации по умолчанию:
nano /var/www/html/pdns/powerdnsadmin/default_config.pyИзмените параметры на свои значения:
SALT = 'yoursecretekey'
SECRET_KEY = 'yoursecretekey'
BIND_ADDRESS = '0.0.0.0'
PORT = 9191
HSTS_ENABLED = False
OFFLINE_MODE = False
SQLA_DB_USER = 'pdnsadmin'
SQLA_DB_PASSWORD = 'password'
SQLA_DB_HOST = '127.0.0.1'
SQLA_DB_NAME = 'pdns'
SQLALCHEMY_TRACK_MODIFICATIONS = TrueАктивируйте виртуальное окружение и выполните миграции + сборку фронтенда:
cd /var/www/html/pdns/
source ./flask/bin/activate
export FLASK_APP=powerdnsadmin/__init__.py
flask db upgrade
yarn install --pure-lockfile
flask assets build
deactivateВключение API PowerDNS
Разрешите API в /etc/powerdns/pdns.conf:
nano /etc/powerdns/pdns.confДобавьте/измените:
api=yes
api-key=yoursecretekeyПерезапустите PowerDNS:
systemctl restart pdnsНастройка Nginx как обратного прокси
Создайте файл /etc/nginx/conf.d/pdns-admin.conf:
nano /etc/nginx/conf.d/pdns-admin.confВставьте конфигурацию (замените server_name и пути при необходимости):
server {
listen *:80;
server_name pdnsadmin.example.com;
index index.html index.htm index.php;
root /var/www/html/pdns;
access_log /var/log/nginx/pdnsadmin_access.log combined;
error_log /var/log/nginx/pdnsadmin_error.log;
client_max_body_size 10m;
client_body_buffer_size 128k;
proxy_redirect off;
proxy_connect_timeout 90;
proxy_send_timeout 90;
proxy_read_timeout 90;
proxy_buffers 32 4k;
proxy_buffer_size 8k;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_headers_hash_bucket_size 64;
location ~ ^/static/ {
include /etc/nginx/mime.types;
root /var/www/html/pdns/powerdnsadmin;
location ~* \.(jpg|jpeg|png|gif)$ {
expires 365d;
}
location ~* ^.+.(css|js)$ {
expires 7d;
}
}
location / {
proxy_pass http://unix:/run/pdnsadmin/socket;
proxy_read_timeout 120;
proxy_connect_timeout 120;
proxy_redirect off;
}
}Проверьте конфигурацию и перезапустите Nginx:
nginx -t
chown -R www-data:www-data /var/www/html/pdns
systemctl restart nginxSystemd‑служба и сокет для PowerDNS‑Admin
Создайте systemd‑юнит /etc/systemd/system/pdnsadmin.service:
nano /etc/systemd/system/pdnsadmin.service[Unit]
Description=PowerDNS-Admin
Requires=pdnsadmin.socket
After=network.target
[Service]
PIDFile=/run/pdnsadmin/pid
User=pdns
Group=pdns
WorkingDirectory=/var/www/html/pdns
ExecStart=/var/www/html/pdns/flask/bin/gunicorn --pid /run/pdnsadmin/pid --bind unix:/run/pdnsadmin/socket 'powerdnsadmin:create_app()'
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s TERM $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.targetСоздайте сокет /etc/systemd/system/pdnsadmin.socket:
nano /etc/systemd/system/pdnsadmin.socket[Unit]
Description=PowerDNS-Admin socket
[Socket]
ListenStream=/run/pdnsadmin/socket
[Install]
WantedBy=sockets.targetСоздайте временные файлы и директории, загрузите демона и включите сервис:
echo "d /run/pdnsadmin 0755 pdns pdns -" >> /etc/tmpfiles.d/pdnsadmin.conf
mkdir /run/pdnsadmin/
chown -R pdns: /run/pdnsadmin/
chown -R pdns: /var/www/html/pdns/powerdnsadmin/
systemctl daemon-reload
systemctl enable --now pdnsadmin.service pdnsadmin.socket
systemctl status pdnsadmin.service pdnsadmin.socketДоступ к веб‑интерфейсу
Откройте в браузере http://pdnsadmin.example.com (замените на ваш домен). На странице регистрации создайте учётную запись администратора, затем в разделе настроек укажите URL API PowerDNS и api‑ключ.






Тесты и проверка
Ключевые проверки после установки:
- Проверить, что pdns слушает на 53 порту:
ss -alnp4 | grep pdns- Проверить статус systemd‑служб:
systemctl status pdns pdnsadmin.service pdnsadmin.socket nginx- Проверить доступ к API PowerDNS (пример с curl):
curl -s -H 'X-API-Key: yoursecretekey' http://127.0.0.1:8081/api/v1/servers(замените порт/адрес, если API доступен по другому адресу).
- Создать тестовую зону в PowerDNS‑Admin и запросить запись через dig с другого хоста:
dig @your.pdns.server example.com AКритерии приёмки
- PowerDNS отвечает на DNS‑запросы для добавленных зон.
- PowerDNS‑Admin доступен через указанный домен и позволяет добавлять/редактировать зоны.
- API PowerDNS отвечает при запросе с корректным api‑ключом.
- systemd‑юниты запускаются и автоматически восстанавливаются после перезагрузки.
Рекомендации по безопасности
- Используйте длинные уникальные значения для SALT/SECRET_KEY и api‑ключа.
- Ограничьте доступ к базе данных (привязка к localhost / firewall).
- Включите HTTPS для Nginx (Let’s Encrypt certbot) и перенаправляйте весь трафик на HTTPS.
- Ограничьте доступ к интерфейсу PowerDNS‑Admin по IP (если возможно).
- Включите резервное копирование базы pdns и конфигурационных файлов.
- Следите за обновлениями пакетов pdns и PowerDNS‑Admin.
Возможные проблемы и решения
- Блокировка порта 53: проверьте, что другой DNS‑сервер (systemd‑resolved, bind9) отключён.
- Ошибки подключения к БД: проверьте учётные данные в pdns.local.gmysql.conf и что MariaDB слушает 127.0.0.1.
- 502/504 в Nginx: проверьте, что сокет /run/pdnsadmin/socket существует и gunicorn запущен под тем же пользователем.
- Статические файлы не загружаются: убедитесь, что корень для /static/ указан правильно и права доступа верные.
Альтернативные подходы
- Вместо MariaDB можно использовать PostgreSQL; тогда потребуется установить соответствующий бекенд и импортировать схему для PostgreSQL.
- Развёртывание в контейнерах: PowerDNS и PowerDNS‑Admin удобно запускать в Docker/compose, что упрощает изоляцию и миграции.
- Использовать официальный репозиторий PowerDNS для более новых версий пакетов вместо apt‑репозиториев дистрибутива.
Мини‑методология развёртывания (шаги для автоматизации)
- Подготовка образа/VM, обновление apt.
- Установка MariaDB и создание БД/пользователя.
- Установка PowerDNS и импорт схемы.
- Установка зависимостей для PowerDNS‑Admin и сборка фронтенда.
- Настройка Nginx и systemd, применение прав доступа.
- Тесты: служба, API, веб‑интерфейс, резолвинг зон из внешней сети.
- Настройка HTTPS и резервного копирования.
Чек‑листы по ролям
Администратор (развёртывание):
- Обновить систему.
- Установить MariaDB и настроить БД.
- Установить PowerDNS и задать бэкенд.
- Развернуть PowerDNS‑Admin и Nginx.
- Настроить systemd‑юниты.
- Провести тесты доступности.
Безопасник:
- Проверить ключи и секреты.
- Ограничить доступ к БД и административному интерфейсу.
- Настроить HTTPS и HSTS при необходимости.
- Настроить резервное копирование.
Оператор (эксплуатация):
- Мониторить логи pdns и pdnsadmin.
- Обновлять пакеты безопасности.
- Проводить тестовые запросы (dig) после изменений.
Тестовые сценарии и критерии приёмки
- Добавить зону через PowerDNS‑Admin и успешно получить запись через dig с внешнего хоста.
- Проверить, что API возвращает список серверов и зон при запросе с корректным api‑ключом.
- Перезагрузить сервер и убедиться, что pdns и pdnsadmin автоматически поднялись.
Факты и ключевые файлы
- Порты: DNS — 53 (UDP/TCP), веб‑интерфейс PowerDNS‑Admin (по умолчанию) — 9191, Nginx — 80/443.
- Важные файлы: /etc/powerdns/pdns.d/pdns.local.gmysql.conf, /etc/powerdns/pdns.conf, /var/www/html/pdns/, /etc/systemd/system/pdnsadmin.service.
- Команды: systemctl для управления сервисами, ss или netstat для проверки слушающих портов.
Небольшой глоссарий
- Авторитативный сервер: DNS‑сервер, который хранит официальные записи зон и отвечает с авторитетом.
- Бэкенд PowerDNS: модуль, который обеспечивает хранение записей (MySQL, PostgreSQL и т. д.).
- PowerDNS‑Admin: веб‑интерфейс для управления зонами и пользователями.
Заключение
Вы развернули PowerDNS как авторитативный сервер с хранением зон в MariaDB и подключили удобный веб‑интерфейс PowerDNS‑Admin, обслуживаемый через Nginx и systemd. Далее рекомендуем настроить HTTPS, регулярно обновлять пакеты и настроить резервное копирование базы и конфигураций.
Если нужна помощь с переходом на PostgreSQL, развёртыванием в Docker или автоматизацией через Ansible — напишите, укажу пример плейбука или docker‑compose.