MAATRIX / Блог / PowerDNS на Ubuntu 24.04: пошаговая установка

PowerDNS на Ubuntu 24.04: пошаговая установка

MAATRIX

Если у вас несколько доменов и записи меняются часто — руками редактировать зонные файлы BIND становится больно: любая опечатка в текстовом файле валит зону, а синхронизировать изменения между серверами через rndc неудобно. PowerDNS решает это иначе — зоны и записи хранятся в обычной базе данных, их можно менять через SQL, скрипт или встроенный HTTP API, а сам сервер просто читает актуальное состояние. Ниже — пошаговая установка PowerDNS Authoritative Server на Ubuntu 24.04 с бэкендом PostgreSQL, от нуля до рабочей зоны.

Обсудить статью, задать вопрос или начать новую тему

Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.

Перейти в сообщество →

Что такое PowerDNS и зачем он нужен вместо BIND

PowerDNS Authoritative Server — это авторитетный DNS-сервер, то есть он отвечает на запросы о доменах, за которые сам отвечает (не путать с PowerDNS Recursor — рекурсивным резолвером, это отдельный продукт для кеширующих DNS). Ключевое отличие от BIND — модель хранения данных: вместо зонных файлов на диске PowerDNS умеет читать записи из SQLite, MySQL/MariaDB, PostgreSQL или даже из произвольного бэкенда через pipe-backend.

Практическая выгода такого подхода:

  • Управление через SQL или API — можно писать записи скриптом, из панели хостинга, из своего биллинга — без парсинга текстовых файлов.
  • Встроенный REST API — включается одной строкой в конфиге, дальше зоны создаются curl-запросами или из PowerDNS-Admin.
  • DNSSEC из коробки — подпись зон и ротация ключей делаются командой pdnsutil, без ручной генерации ключей и правки зонных файлов.
  • Репликация через саму СУБД — если у вас уже настроена репликация PostgreSQL или MySQL между узлами, DNS-данные реплицируются вместе с остальной базой.

Смысла ставить PowerDNS ради одного статичного домена немного — для этого хватит named с парой зонных файлов, как описано в статье про настройку домена и DNS с нуля на Ubuntu 24.04. PowerDNS оправдан, когда зон десятки-сотни, записи меняются программно или вам нужен DNSSEC без ручной возни.

Требования и подготовка сервера

Понадобится чистый сервер на Ubuntu 24.04 LTS с публичным IP (для авторитетного DNS это обязательно — резолверы других провайдеров должны достучаться до порта 53) и минимум 1 vCPU / 1 ГБ RAM — PowerDNS сам по себе лёгкий, основную нагрузку на диск и память даёт СУБД-бэкенд.

Обновите систему и поставьте базовые пакеты:

sudo apt update && sudo apt upgrade -y
sudo apt install -y curl gnupg2 ca-certificates

Если PostgreSQL ещё не установлен — разверните его по отдельной статье про установку и настройку PostgreSQL на VPS, там же есть базовые шаги по созданию пользователя и БД, которые пригодятся ниже. Если предпочитаете MySQL/MariaDB — принцип установки идентичен, отличаются только имена пакетов (pdns-backend-mysql вместо pdns-backend-pgsql) и синтаксис схемы.

Нужен сервер под эту задачу?

Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.

Арендовать сервер

Установка PowerDNS Authoritative Server

В репозиториях Ubuntu 24.04 пакет pdns-server уже есть, но версия там обычно отстаёт от актуальной ветки PowerDNS на несколько релизов. Для продакшена разумнее подключить официальный репозиторий проекта — так вы получите последние патчи безопасности и актуальную поддержку DNSSEC. Если для вас не критично гнаться за последней версией — можно ограничиться пакетом из universe-репозитория Ubuntu, это проще и обычно работает стабильно:

# Вариант попроще — из репозитория Ubuntu
sudo apt install -y pdns-server pdns-backend-pgsql

Если хотите официальный репозиторий PowerDNS — следуйте инструкции на repo.powerdns.com для актуальной ветки Authoritative Server под Ubuntu 24.04 (noble), там указывается конкретная версия и команды подключения APT-репозитория, которые меняются от релиза к релизу — проверяйте актуальные на момент установки.

После установки сразу отключите штатный файловый бэкенд, чтобы не путался с SQL:

sudo systemctl stop pdns

Настройка бэкенда PostgreSQL

Создайте отдельную базу и пользователя под PowerDNS — не используйте общий сервисный аккаунт:

sudo -u postgres psql -c "CREATE USER pdns WITH PASSWORD 'сложный_пароль';"
sudo -u postgres psql -c "CREATE DATABASE pdns OWNER pdns;"

Пакет pdns-backend-pgsql ставит готовую SQL-схему с таблицами domains, records, supermasters, cryptokeys и другими служебными таблицами под DNSSEC и метаданные. Найдите файл схемы в составе пакета и накатите его в созданную базу:

dpkg -L pdns-backend-pgsql | grep -i schema
sudo -u postgres psql pdns -f /путь/к/найденному/schema.pgsql.sql

Дальше пропишите бэкенд в основном конфиге /etc/powerdns/pdns.conf:

launch=gpgsql
gpgsql-host=127.0.0.1
gpgsql-port=5432
gpgsql-dbname=pdns
gpgsql-user=pdns
gpgsql-password=сложный_пароль
gpgsql-dnssec=yes

# Слушаем и на внешнем интерфейсе, и на localhost
local-address=0.0.0.0
local-port=53

# Включаем встроенный HTTP API — пригодится для автоматизации
api=yes
api-key=длинный_случайный_ключ
webserver=yes
webserver-address=127.0.0.1
webserver-port=8081

webserver-address=127.0.0.1 — намеренно: веб-API слушает только локально, наружу его выставлять без дополнительной защиты (обратный прокси с TLS и авторизацией) не стоит. Проверьте конфиг на синтаксис и запустите сервис:

sudo pdns_server --config-check
sudo systemctl enable --now pdns
sudo systemctl status pdns

Если сервис не стартует — почти всегда причина в правах доступа к БД или опечатке в пароле, смотрите подробности в journalctl -u pdns -n 50.

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

Утилита pdnsutil — основной инструмент для повседневной работы с зонами без прямых SQL-запросов. Создайте первую зону:

sudo pdnsutil create-zone example.com ns1.example.com

Добавьте базовые записи:

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

Проверьте, что зона отдаёт корректный ответ прямо с сервера:

dig @127.0.0.1 www.example.com A

Если нужен DNSSEC — включается одной командой, PowerDNS сам сгенерирует и будет ротировать ключи:

sudo pdnsutil secure-zone example.com
sudo pdnsutil show-zone example.com

После этого DS-запись, которую нужно передать регистратору домена, покажет команда pdnsutil show-zone example.com в блоке DS. Не забудьте прописать её в панели регистратора — без этого шага DNSSEC для внешнего мира не заработает, хотя локально всё будет выглядеть корректно.

Веб-интерфейс PowerDNS-Admin

Работать через pdnsutil и SQL удобно, когда зон немного и меняете их вы сами. Если зонами управляет команда или клиенты через панель — есть смысл поставить PowerDNS-Admin, open-source веб-интерфейс поверх того же API, который вы включили в pdns.conf.

PowerDNS-Admin — отдельное Python/Flask-приложение, ставится не через apt, а через Docker или виртуальное окружение с собственной БД для пользователей и прав доступа (может быть та же PostgreSQL, но отдельная схема). В общих чертах процесс такой:

git clone https://github.com/powerdns-admin/powerdns-admin.git
cd powerdns-admin
# конфигурация через docker-compose.yml — указываете там URL API PowerDNS и его api-key

Дальше в веб-интерфейсе указываете адрес API (http://127.0.0.1:8081) и ключ из pdns.conf — PowerDNS-Admin будет управлять зонами через тот же API, никакого прямого доступа к БД ему не нужно. Разворачивать PowerDNS-Admin имеет смысл не на самом DNS-сервере, а за обратным прокси с TLS — веб-панель управления зонами наружу без HTTPS открывать не стоит.

Безопасность и продакшн-чеклист

Авторитетный DNS-сервер смотрит в интернет портом 53 (TCP и UDP), и это уже сам по себе повод настроить фаервол — открыть только нужные порты и закрыть всё остальное. Базовая настройка ufw разобрана в статье про установку фаервола UFW на Ubuntu 24.04, для PowerDNS минимальный набор правил такой:

sudo ufw allow 53/tcp
sudo ufw allow 53/udp
sudo ufw deny 8081/tcp   # веб-API — доступен только с localhost, извне закрыт явно

Дополнительно стоит проверить:

  • AXFR-передачи закрыты по умолчанию. Разрешайте зонные трансферы (allow-axfr-ips) только конкретным IP вторичных серверов, никогда не оставляйте открытый AXFR всем подряд — это прямая утечка списка всех записей домена.
  • Пароль к БД и api-key — не дефолтные. Оба значения хранятся в pdns.conf открытым текстом, поэтому права на файл должны быть 640 и владелец — сервисный пользователь pdns.
  • Регулярные обновления. DNS-серверы — частая цель сканирования на уязвимости; подписывайтесь на security-advisories PowerDNS и накатывайте патчи не откладывая.
  • Мониторинг доступности. Проверяйте резолвинг зон снаружи (не с самого сервера) — например, через dig @ваш_ip домен с другого хоста — периодичность зависит от критичности зон.

Если PostgreSQL под PowerDNS растёт и записей становится много, обратите внимание также на статью про настройку и тюнинг PostgreSQL — стандартные параметры shared_buffers и work_mem из коробки редко подходят под серьёзную нагрузку.

БэкендКогда использоватьОсобенности
SQLite (bind-стиль без файлов)Тест, один сервер, мало зонПроще всего, но нет удобной репликации между узлами
MySQL/MariaDBУже есть MySQL-инфраструктураРодная репликация master-slave, много готовых гайдов
PostgreSQLНужны сложные запросы, DNSSEC, есть опыт с PostgresГибкие права доступа, надёжная репликация, хорошо документирован в PowerDNS
BIND-бэкенд (файлы)Миграция со старого BIND без переделки зонЧитает существующие зонные файлы, но теряется смысл перехода на PowerDNS

Нужен сервер под эту задачу?

Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.

Арендовать сервер

Нужны сами нейросети для контента?

Генерируйте изображения, видео и озвучку нейросетями на falapi.io — десятки моделей в одном окне. Оплата картой РФ и по СБП.

Частые вопросы

Чем PowerDNS Authoritative Server отличается от PowerDNS Recursor?

Authoritative Server отвечает за ваши собственные зоны (это то, что мы ставили выше). Recursor — отдельный продукт, кеширующий резолвер для клиентских DNS-запросов, его ставят на других серверах и с другой ролью — не путайте их в документации, конфиги полностью разные.

Можно ли мигрировать зоны с BIND на PowerDNS без простоя?

Да, через pdnsutil load-zone можно импортировать существующие зонные файлы BIND в SQL-бэкенд. Практический план — поднять PowerDNS параллельно со старым сервером, импортировать зоны, свериться через dig на обоих серверах, и только потом переключать NS-записи у регистратора.

Нужен ли отдельный сервер для PowerDNS или можно ставить рядом с другими сервисами?

Технически можно ставить рядом, но авторитетный DNS — сервис с высокими требованиями к аптайму и предсказуемой задержке, поэтому на серьёзных проектах его обычно выносят на отдельный VPS или хотя бы отдельный процесс с контролем ресурсов.

Как масштабировать PowerDNS на несколько геолокаций?

Для этого есть механизм master-slave репликации зон между несколькими инсталляциями PowerDNS плюс anycast или geo-балансировка на уровне DNS-провайдера. Если вопрос именно про распределение ответов по географии клиентов, а не про сам PowerDNS — почитайте отдельно про Geo-DNS и когда он нужен.

API PowerDNS обязателен к включению?

Нет, api=yes нужен только если вы планируете управлять зонами программно или через PowerDNS-Admin. Если работаете исключительно через pdnsutil с консоли — можно оставить api=no и не открывать лишний порт вообще.

Обсудить статью, задать вопрос или начать новую тему

Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.

Перейти в сообщество →