Гид по технологиям

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

6 min read DNS Обновлено 24 Nov 2025
Установка PowerDNS и PowerDNS-Admin на Ubuntu 20.04
Установка PowerDNS и PowerDNS-Admin на Ubuntu 20.04

Введение

Схематичное изображение логотипа PowerDNS

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 — что сделать сначала

  1. Подготовить сервер Ubuntu 20.04 и резолв домена на IP сервера.
  2. Установить MariaDB и создать базу/пользователя pdns.
  3. Установить pdns-server и бэкенд mysql.
  4. Развернуть PowerDNS-Admin в /var/www/html/pdns, настроить виртуenv, Nginx и systemd‑сервисы.
  5. Включить 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 nginx

systemd‑сервисы для 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-ключ.

PowerDNS Admin login

Create an account

Log in

PowerDNS Admin Dashboard

PowerDNS API configured

The dashboard of your PowerDNS server

Мини‑методология развёртывания (шаги для продакшн)

  1. Подготовка окружения: выделенный сервер или VM, бэкап конфигов, сеть и мониторинг.
  2. Тестовая инсталляция на staging-копии Ubuntu 20.04.
  3. Автоматизация установки (Ansible/Chef/Terraform для инфраструктуры).
  4. Применение политики доступа и шифрования (TLS, firewall).
  5. Тестирование на отказоустойчивость: мастер/мастер или мастер/слейв (если используется репликация БД).
  6. Плавный перевод зон и наблюдение за метриками.

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)

  1. Остановить pdnsadmin.service и nginx.
  2. Восстановить файл /etc/powerdns/pdns.d/pdns.local.gmysql.conf из резервной копии.
  3. Восстановить базу pdns из дампа: mysql -u root -p pdns < pdns_backup.sql
  4. Запустить pdns и проверить зону.
  5. При необходимости восстановить /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.

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Как импортировать фото в Photos на Mac
Mac

Как импортировать фото в Photos на Mac

Как изменить язык Windows Live Mail
Windows

Как изменить язык Windows Live Mail

Как записывать встречи в Zoom — полное руководство
Видеоконференции

Как записывать встречи в Zoom — полное руководство

Включить или отключить службу отчётов об ошибках Windows 10
Windows

Включить или отключить службу отчётов об ошибках Windows 10

Docker Content Trust: подпись и проверка образов
Безопасность

Docker Content Trust: подпись и проверка образов

Pantone Studio — руководство по созданию палитр
Дизайн

Pantone Studio — руководство по созданию палитр