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

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

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

К чему приведёт эта инструкция

  • Развернёте PowerDNS (авторитативный DNS) с хранением зон в MariaDB.
  • Установите PowerDNS‑Admin — удобную веб‑консоль для управления зонами.
  • Настроите Nginx как обратный прокси и systemd‑юнит для сервиса.

Важно: примеры команд используют учетные данные вида pdnsadmin / password и домен pdnsadmin.example.com — замените их на безопасные значения в рабочей среде.

Быстрая структура действий

  1. Подготовка сервера и домена.
  2. Установка MariaDB и создание БД/пользователя.
  3. Установка PowerDNS и импорт схемы.
  4. Установка PowerDNS‑Admin + зависимости (Python, Node.js, Yarn).
  5. Настройка Nginx и systemd‑служб.
  6. Тестирование и базовая безопасность.

Предварительные требования

  • Сервер с 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 nginx

Systemd‑служба и сокет для 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‑ключ.

Интерфейс PowerDNS Admin

PowerDNS Admin

Установка пароля

Панель управления PowerDNS Admin

Параметры PDNS

Дашборд

Тесты и проверка

Ключевые проверки после установки:

  • Проверить, что 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‑репозиториев дистрибутива.

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

  1. Подготовка образа/VM, обновление apt.
  2. Установка MariaDB и создание БД/пользователя.
  3. Установка PowerDNS и импорт схемы.
  4. Установка зависимостей для PowerDNS‑Admin и сборка фронтенда.
  5. Настройка Nginx и systemd, применение прав доступа.
  6. Тесты: служба, API, веб‑интерфейс, резолвинг зон из внешней сети.
  7. Настройка 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.

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

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

GPTZero: детектор AI‑текста для преподавателей
Образование

GPTZero: детектор AI‑текста для преподавателей

Множественные build context в Docker
DevOps

Множественные build context в Docker

Установка Windows 11 в VirtualBox на Linux
Virtualization

Установка Windows 11 в VirtualBox на Linux

Как говорить о деньгах с близкими
Личные финансы

Как говорить о деньгах с близкими

Исправить высокий CPU в Linux
Linux

Исправить высокий CPU в Linux

Восстановить значок Корзины в Windows 10
Windows

Восстановить значок Корзины в Windows 10