Установка PowerDNS и PowerDNS-Admin на Ubuntu 20.04
Введение

PowerDNS — свободный авторитетный DNS‑сервер, написан на C++ и работает на Unix, Linux и macOS. Он может хранить зоны и записи в реляционных СУБД: MySQL, MariaDB, PostgreSQL и Oracle.
PowerDNS-Admin — веб‑интерфейс для управления PowerDNS. Через браузер можно создавать зоны, редактировать записи и управлять DNSSEC. Ключевые возможности:
- Поддержка IPv4 и IPv6
- Страница статуса с полезной информацией
- Автогенерация/обновление обратных PTR-записей
- Пакетное создание доменов
- Шаблоны доменов
- Поддержка DNSSEC
- Аутентификация: локальная БД, SAML, LDAP, Active Directory
Кратко о терминах:
- DNS — система доменных имён.
- Авторитетный nameserver — сервер, который отвечает за записи домена.
TL;DR — что сделать сначала
- Подготовить сервер Ubuntu 20.04 и резолв домена на IP сервера.
- Установить MariaDB и создать базу/пользователя pdns.
- Установить pdns-server и бэкенд mysql.
- Развернуть PowerDNS-Admin в /var/www/html/pdns, настроить виртуenv, Nginx и systemd‑сервисы.
- Включить API в /etc/powerdns/pdns.conf и подключить PowerDNS-Admin.
Требования
- Сервер с Ubuntu 20.04.
- Валидное доменное имя, указывающее на IP сервера.
- Доступ root или sudo.
Установка и настройка MariaDB
По умолчанию в репозиториях Ubuntu может не быть нужной версии MariaDB. Добавим репозиторий и установим сервер.
Установите необходимые пакеты:
apt-get install software-properties-common gnupg2 -yДобавьте ключ подписи MariaDB:
apt-key adv --fetch-keys 'https://mariadb.org/mariadb_release_signing_key.asc'Добавьте репозиторий (пример для MariaDB 10.5):
add-apt-repository 'deb [arch=amd64,arm64,ppc64el] http://mirrors.ukfast.co.uk/sites/mariadb/repo/10.5/ubuntu focal main'Установите MariaDB:
apt-get install mariadb-server -yСоздайте базу и пользователя для PowerDNS:
mysql
MariaDB [(none)]> create database pdns;
MariaDB [(none)]> grant all on pdns.* to pdnsadmin@localhost identified by 'password';
MariaDB [(none)]> flush privileges;
MariaDB [(none)]> exit;Важно: замените ‘password’ на надёжный пароль и храните его в менеджере секретов.
Установка PowerDNS
Отключите systemd-resolved, чтобы избежать конфликтов с /etc/resolv.conf:
systemctl disable --now systemd-resolvedУдалите текущий resolv.conf и задайте публичный резолвер (пример — Google DNS):
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
Импортируйте схему в базу pdns:
mysql -u pdnsadmin -p pdns < /usr/share/pdns-backend-mysql/schema/schema.mysql.sqlОтредактируйте файл подключения к базе: /etc/powerdns/pdns.d/pdns.local.gmysql.conf
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Проверьте запуск в отладочном режиме:
systemctl stop pdns
pdns_server --daemon=no --guardian=no --loglevel=9Ожидаемый успешный вывод будет содержать строки «Connection successful» и «Done launching threads». После проверки запустите сервис:
systemctl start pdnsПроверьте, что PowerDNS слушает порт 53:
ss -alnp4 | grep pdnsВы увидите LISTEN/UNCONN на 0.0.0.0:53 для udp и tcp.
Установка PowerDNS-Admin (Nginx + виртуальное окружение)
Установка зависимостей
Установим Nginx, инструменты сборки, Python‑зависимости и утилиты для Node/Yarn:
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 -yУстановим Node.js 14 и Yarn:
curl -sL https://deb.nodesource.com/setup_14.x | bash -
apt-get install nodejs -y
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
Клонируем репозиторий в корень Nginx:
git clone https://github.com/ngoduykhanh/PowerDNS-Admin.git /var/www/html/pdnsСоздаём виртуальное окружение и устанавливаем Python-зависимости:
cd /var/www/html/pdns/
virtualenv -p python3 flask
source ./flask/bin/activate
pip install -r requirements.txt
deactivateНастройка подключения к базе для PowerDNS-Admin
Отредактируйте /var/www/html/pdns/powerdnsadmin/default_config.py
nano /var/www/html/pdns/powerdnsadmin/default_config.pyИзмените значения на ваши: SALT, SECRET_KEY, адрес и порт, параметры БД:
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
PowerDNS-Admin использует JSON 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(вставьте конфигурацию из исходного примера — она настраивает proxy_pass к unix-сокету приложения и отдачу статических файлов)
Проверьте синтаксис и перезапустите Nginx:
nginx -t
chown -R www-data:www-data /var/www/html/pdns
systemctl restart nginxsystemd‑сервисы для PowerDNS-Admin
Создайте unit-файл /etc/systemd/system/pdnsadmin.service и socket /etc/systemd/system/pdnsadmin.socket. Пример содержимого приведён в исходном руководстве. Затем создайте tmpfiles.d запись и директорию сокета:
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Убедитесь, что сервис активен и сокет слушает /run/pdnsadmin/socket.
Доступ к веб-интерфейсу
Откройте браузер и перейдите по адресу http://pdnsadmin.example.com (замените домен на ваш). При первом запуске создайте аккаунт администратора, затем войдите и настройте PowerDNS API URL и API-ключ.






Мини‑методология развёртывания (шаги для продакшн)
- Подготовка окружения: выделенный сервер или VM, бэкап конфигов, сеть и мониторинг.
- Тестовая инсталляция на staging-копии Ubuntu 20.04.
- Автоматизация установки (Ansible/Chef/Terraform для инфраструктуры).
- Применение политики доступа и шифрования (TLS, firewall).
- Тестирование на отказоустойчивость: мастер/мастер или мастер/слейв (если используется репликация БД).
- Плавный перевод зон и наблюдение за метриками.
Checklists: кто что делает
Администратор системы:
- Обновил Ubuntu и установил зависимости.
- Настроил MariaDB и резервное копирование.
- Настроил firewall (ufw/iptables) и отключил systemd-resolved.
Сетевой инженер:
- Настроил A/NS-записи у регистратора.
- Обеспечил доступность UDP/TCP портов 53 через firewall.
DevOps / SRE:
- Задеплоил PowerDNS-Admin через systemd и Nginx.
- Настроил SSL (Let’s Encrypt) для pdnsadmin домена.
- Добавил мониторинг (uptime, метрики qps, latency).
Критерии приёмки
- PowerDNS отвечает на запросы на порту 53 по UDP и TCP.
- PowerDNS-Admin веб‑интерфейс доступен по настроенному домену и отвечает.
- Аутентификация в PowerDNS-Admin работает, и можно добавить/редактировать зону.
- Взаимодействие через API (GET /servers/localhost/zones) возвращает список зон.
- Резервное копирование БД настроено и рабочее.
План отката (rollback)
- Остановить pdnsadmin.service и nginx.
- Восстановить файл /etc/powerdns/pdns.d/pdns.local.gmysql.conf из резервной копии.
- Восстановить базу pdns из дампа: mysql -u root -p pdns < pdns_backup.sql
- Запустить pdns и проверить зону.
- При необходимости восстановить /etc/resolv.conf и re-enable systemd-resolved.
Тесты и критерии приёмки (короткий набор)
Функциональные тесты:
- Добавить зону через PowerDNS-Admin и убедиться, что запись появилась в базе.
- Выполнить dig @<ваш_сервер> example.com A — проверка ответа.
Нагрузочные тесты:
- Прогнать лёгкую QPS-генерацию (например, dnsperf) и следить за latency и drop.
Интеграционные:
- Проверить обновление DNSSEC-записей и их публикацию.
Безопасность и hardening
- Используйте сильные секреты для SQLA_DB_PASSWORD и api-key.
- Ограничьте доступ к MariaDB по адресу (127.0.0.1) и настройте права минимально.
- Включите TLS (HTTPS) для pdnsadmin.example.com (Let’s Encrypt certbot + автоматическое продление).
- Отключите ненужные сервисы и минимизируйте пакеты на сервере.
- Настройте firewall: разрешите только порты 22 (по необходимости), 53 (UDP/TCP), 80/443 для веб‑интерфейса.
- Логи: централизуйте логи в ELK/Graylog и настраивайте оповещения по ошибкам/снижениям QPS.
Типичные ошибки и их устранение
- Не запускается pdns: проверьте /var/log/syslog и pdns логи, убедитесь в корректности pdns.local.gmysql.conf и правах на файл.
- 502 Bad Gateway в Nginx: проверьте, что socket /run/pdnsadmin/socket существует, и что сервис pdnsadmin активен.
- Неверный API-ключ: проверьте совпадение api-key в /etc/powerdns/pdns.conf и в PowerDNS-Admin.
- Права доступа к файлам: директории и файлы в /var/www/html/pdns должны принадлежать www-data или pdns в соответствии с конфигурацией.
Альтернативные подходы
- Бэкенд PostgreSQL вместо MariaDB — если вы предпочитаете Postgres, PowerDNS поддерживает его.
- Контейнеризация: упаковать PowerDNS и PowerDNS-Admin в Docker/Kubernetes для упрощения развёртывания и масштабирования.
- Управление конфигом и развертыванием через Ansible или Terraform для повторяемости.
Модель зрелости (Maturity levels)
- Level 1 — Proof of concept: один сервер, локальная БД, без HA.
- Level 2 — Production basic: резервное копирование, мониторинг, SSL для админки.
- Level 3 — High availability: несколько мастеров, репликация БД, балансировщики запросов.
Decision flowchart
flowchart TD
A[Начало] --> B{Есть staging?}
B -- Да --> C[Развернуть на staging и протестировать]
B -- Нет --> D[Сделать бекап и продолжить]
C --> E{Тесты пройдены?}
E -- Да --> F[Деплой в production]
E -- Нет --> G[Исправить и повторить]
D --> F
F --> H[Мониторинг и бэкап]Короткий глоссарий
- DNS: система доменных имён.
- DNSSEC: расширение DNS для проверки целостности данных.
- PDNS: PowerDNS.
- API key: секретный ключ для доступа к JSON API PowerDNS.
Частые команды для админа (cheat sheet)
- Проверить статус pdns: systemctl status pdns
- Проверить слушающие порты: ss -alnp4 | grep pdns
- Перезапустить Nginx: systemctl restart nginx
- Логи systemd: journalctl -u pdns -f
Заключение
Поздравляем — PowerDNS и PowerDNS-Admin установлены и настроены. Вы получили авторитетный DNS‑сервер с удобным веб‑интерфейсом для управления зонами. Дальше рекомендуем настроить резервирование, мониторинг и SSL для админки.
Важно: замените все примеры паролей и ключей на надёжные значения и храните их безопасно.
Если нужно, могу подготовить Ansible playbook для автоматизации всех шагов или показать, как настроить Let’s Encrypt для pdnsadmin.example.com.
Похожие материалы
Как импортировать фото в Photos на Mac
Как изменить язык Windows Live Mail
Как записывать встречи в Zoom — полное руководство
Включить или отключить службу отчётов об ошибках Windows 10
Docker Content Trust: подпись и проверка образов