К основному содержимому

PowerDNS: зоны в базе данных и управление через API

Домены · 29.09.2026

Чем PowerDNS отличается от файловых DNS-серверов

BIND 9 хранит каждую зону в отдельном текстовом файле — подробности в статье про авторитативный сервер на BIND 9. PowerDNS Authoritative Server устроен иначе: зоны и записи живут в реляционной базе — MySQL, PostgreSQL или SQLite. Это удобно, когда зон тысячи и ими управляет не администратор руками, а панель хостинга или биллинг через SQL-запросы или REST API.

Второе отличие — встроенный HTTP API, который позволяет создавать зоны и записи программно, без редактирования файлов и без rndc reload.

Установка PowerDNS с бэкендом MySQL

На Debian или Ubuntu пакеты ставятся так:

sudo apt update
sudo apt install pdns-server pdns-backend-mysql -y

Подключение к базе описывается в /etc/powerdns/pdns.conf:

launch=gmysql
gmysql-host=localhost
gmysql-dbname=pdns
gmysql-user=pdns
gmysql-password=CHANGE_ME

Схему таблиц создаёт готовый SQL-скрипт из пакета pdns-backend-mysql, после чего служба запускается командой systemctl restart pdns.

Создание зоны через pdnsutil

Управлять зонами из командной строки удобнее всего утилитой pdnsutil:

pdnsutil create-zone example.com ns1.example.com
pdnsutil add-record example.com www A 3600 203.0.113.10
pdnsutil add-record example.com @ MX 3600 "10 mail.example.com."

Каждая команда сразу пишет запись в базу — отдельной перезагрузки зоны не требуется, PowerDNS читает актуальные данные при следующем запросе.

Управление записями через REST API

Для автоматизации включите веб-сервер API в pdns.conf:

api=yes
api-key=CHANGE_ME
webserver=yes
webserver-address=127.0.0.1
webserver-port=8081

После перезапуска зону можно создать одним запросом:

curl -X POST http://127.0.0.1:8081/api/v1/servers/localhost/zones \
  -H "X-API-Key: CHANGE_ME" \
  -H "Content-Type: application/json" \
  -d '{"name":"example.com.","kind":"Native"}'

Такой подход применяют панели управления хостингом, которые создают зону автоматически в момент заказа домена, без ручного вмешательства администратора.

GeoIP-бэкенд для гео-балансировки

Модуль geoip позволяет PowerDNS отдавать разные IP-адреса в зависимости от страны или континента резолвера — это ровно та задача, которая разобрана в статье про Anycast и GeoDNS. Бэкенд подключается второй строкой launch и указанием на базу GeoIP:

launch+=geoip
geoip-database-files=/usr/share/GeoIP/GeoLite2-City.mmdb

Дальше правила «регион → ответ» описываются в отдельном YAML-файле зоны geoip-бэкенда, который PowerDNS читает при старте службы.

Проверка и мониторинг сервиса

Статус самой службы проверяется через управляющий сокет:

pdns_control ping
dig @127.0.0.1 example.com A +short

Если ответа нет, стоит свериться с логом службы и проверить права доступа к базе данных. Для внешней проверки опубликованной зоны и её серийного номера подходят методы из статьи про dig, dnsviz и типовые ошибки. Отдельно стоит включить DNSSEC-подпись зоны командой pdnsutil secure-zone, если это требуется политикой безопасности — общие принципы описаны в статье про настройку DNSSEC.

Итог: чек-лист запуска PowerDNS

  • Схема базы данных создана, служба pdns подключена к MySQL и стартует без ошибок в логе.
  • Зоны создаются через pdnsutil или API, а не правкой SQL-таблиц вручную.
  • Доступ к API ограничен локальным адресом или VPN, ключ api-key не хранится в открытом репозитории.
  • GeoIP-база данных регулярно обновляется, иначе гео-политики начнут отдавать устаревшие регионы.
← Назад в базу знаний Задать вопрос поддержке