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

> PowerDNS хранит зоны в MySQL вместо файлов и открывает REST API для автоматизации: установка, pdnsutil, GeoIP-бэкенд и проверка сервиса.

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

BIND 9 хранит каждую зону в отдельном текстовом файле — подробности в статье [про авторитативный сервер на BIND 9](https://www.zevshost.net/ru/kb/bind9-avtoritativnyy-server/). 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](https://www.zevshost.net/ru/kb/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 и типовые ошибки](https://www.zevshost.net/ru/kb/proverka-dns-zony-dig/). Отдельно стоит включить DNSSEC-подпись зоны командой `pdnsutil secure-zone`, если это требуется политикой безопасности — общие принципы описаны в статье [про настройку DNSSEC](https://www.zevshost.net/ru/kb/dnssec-nastroika/).

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

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

---

Источник: https://www.zevshost.net/ru/kb/powerdns-nastroika/
