PowerDNS - це авторитативний DNS-сервер, який зберігає зони не в текстових файлах, а в базі даних, і вміє керуватися через REST API. Це означає, що додати домен чи запис можна одним HTTP-запитом (або з вебпанелі), а дані переживуть що завгодно - бо лежать у MariaDB, а не в розкиданих db.*-файлах.
Це перша частина серії про відмовостійкий authoritative DNS. Тут ставимо базу: один сервер з MariaDB-бекендом і увімкненим API. Далі додамо реплікацію MariaDB між двома серверами, поставимо dnsdist спереду для балансування й захисту, і навчимося тримати удар, коли резолвери заливають нас запитами.
Що потрібно зробити?#
Підняти PowerDNS на Debian, підключити бекенд MariaDB (а не BIND-файли), увімкнути REST API, створити першу зону - і показати, що записами можна керувати двома способами: класичним pdnsutil і через API одним curl. Усе налаштування записав наживо: кожен конфіг пишемо у vim на очах, щоб було видно не лише фінальний файл, а й що саме в ньому набирається.
З чим працюю?#
| |
Сервер - свіжа Debian 13 (trixie), усе від root. Але пакети беремо не з дистрибутива: там pdns-server версії 4.9, яка скоро отримає EOL. Натомість підключимо офіційне репо PowerDNS і поставимо 5.1 - поточну стабільну гілку. На один крок більше, зате сервер не застаріє за пів року.
У демо сервер має адресу 10.10.60.103 (приватна мережа стенду). На реальному VPS це буде публічний IP, але логіка й команди - ті самі.
Далі те саме, що в записі, тільки вже можна копіювати.
Репозиторій PowerDNS#
Беремо ключ підпису й описуємо репо у форматі deb822. Гілка auth-51 - це PowerDNS Authoritative Server 5.1:
| |
Файл /etc/apt/sources.list.d/pdns-auth.sources:
| |
І закріплюємо пріоритет за цим репо, щоб apt ніколи не підсунув старіший пакет із Debian - /etc/apt/preferences.d/pdns:
| |
Встановлення#
| |
pdns-server- сам демон;pdns-backend-mysql- бекенд для MySQL/MariaDB (пакет так і називається,gmysql);mariadb-server- база, де житимуть зони;dnsutils(дляdig) іjq(щоб гарно дивитись відповіді API).
Перевіримо версію:
| |
MariaDB: база, користувач, схема#
Створюємо базу pdns, окремого користувача й даємо йому права. На свіжій MariaDB root заходить через unix-сокет без пароля, тож mysql можна запускати одразу:
| |
Замість
надійний-парольпоставте свій - наприкладopenssl rand -base64 18.
Бекенд pdns-backend-mysql постачає готову схему - просто вантажимо її в базу:
| |
З’являться таблиці domains, records, cryptokeys, domainmetadata та інші - це вся «файлова система» нашого DNS.
Конфіг pdns: бекенд gmysql#
Debian кладе конфіги в /etc/powerdns/, а головний pdns.conf підтягує все з /etc/powerdns/pdns.d/. За замовчуванням там лежить bind.conf, який вмикає файловий BIND-бекенд - нам він не потрібен, прибираємо:
| |
Натомість створюємо /etc/powerdns/pdns.d/gmysql.conf:
| |
launch=gmysql каже серверу брати зони з MariaDB, а gmysql-dnssec=yes залишає можливість увімкнути DNSSEC пізніше.
API pdns#
Тепер найцікавіше - вмикаємо REST API й вбудований вебсервер. Файл /etc/powerdns/pdns.d/api.conf:
| |
⚠️
webserver-allow-from=0.0.0.0/0відкриває API з будь-якої адреси - так можна лише в ізольованій мережі стенду. На проді звужуйте до конкретних IP (наприклад127.0.0.1 10.0.0.0/8), аapi-keyгенеруйте довгим:openssl rand -base64 24.
Перезапускаємо й перевіряємо, що демон живий, а API відповідає:
| |
| |
Перша зона#
Створимо зону й додамо запис класичним інструментом pdnsutil:
| |
Увага, зміна в 5.x:
pdnsutil add-recordтепер хоче повне ім’я (www.example.com), а не відноснеwww. Для кореня зони вказують саму назву зони (example.com). Старий запис через@більше не приймається.
pdnsutil пише напряму в базу - повз кеш зон, який PowerDNS 5.x тримає в пам’яті. Тому щойно створену зону сервер не віддаватиме, доки не оновити кеш:
| |
Керування записами через API#
А тепер - те саме, але через API, заради якого ми його й вмикали. Спершу подивимось список зон:
| |
Щоб додати запис, шлемо PATCH зі списком rrsets. Зручно покласти тіло в файл rrset.json:
| |
| |
Різниця з pdnsutil важлива: запис через API живий одразу, без rediscover - бо запит іде через сам демон, і той оновлює свій кеш сам. Серіал зони теж підбивається автоматично.
| |
Саме на цьому API тримаються вебпанелі (як PowerDNS-Admin) і автоматизація: видати домен клієнту чи оновити запис можна скриптом, не чіпаючи сервер руками.
Граблі#
pdnsutil add-recordвимагає FQDN. У 5.x відносні імена (www,@) відкидаються зName ... is not part of zone. Пишіть повне ім’я, корінь зони - це сама назва зони.pdnsutilне бачать безrediscover. PowerDNS 5.x кешує перелік зон; зміни черезpdnsutil(він пише прямо в базу) не підхоплюються, доки неpdns_control rediscoverабо рестарт. Зміни через API цього не потребують.pdns_control pingне існує - колишня звичка перевіряти так сервер дастьUnknown command: PING. Жива перевірка -systemctl is-active pdnsабо запит до/api/v1/servers/localhost.- Не відкривайте
webserver-allow-fromу світ. На стенді це зручно, на проді - діра: з API-ключем можна переписати будь-яку зону.
Що далі#
Один сервер - це вже робочий DNS, але не відмовостійкий. У наступних частинах серії:
- реплікація MariaDB master-slave між двома серверами - щоб дані жили на обох (і щоб показати, де в нас «публічна» мережа, а де окрема «приватна» для реплікації);
dnsdistспереду на кожній ноді - балансування, health-check і резервний бекенд;- тюнинг від флуду - обмеження запитів на один IP і динамічні блоки, коли резолвери починають нас заливати.
Підсумок#
PowerDNS дає авторитативний DNS, який не живе в текстових файлах: зони - у MariaDB, керування - через REST API, DNSSEC - однією опцією. Ми поставили свіжу 5.1 з офіційного репо, підключили базу, увімкнули API й завели першу зону двома способами. Це фундамент, на якому далі збудуємо повноцінний відмовостійкий DNS.



