
В одном из прошлых гайдов мы рассматривали, как развернуть BIND9 в Docker, сегодня мы рассмотрим альтернативный вариант DNS сервера Power DNS — это DNS-сервер с открытым исходным кодом. Он работает с различными базами данных, включая MariaDB, MySQL, SQLite3 и другие.
Сравнение BIND9 vs PowerDNS
Перед тем, как приступить к деплою PowerDNS, давайте разберемся в принципиальных отличиях от BIND9.
BIND9: классический подход
BIND9 (Berkeley Internet Name Domain) — это проверенное временем решение с богатой историей, разработанное еще в 1980-х годах. Его ключевые архитектурные особенности включают:
- Монолитная структура: Единый процесс (named) обрабатывает все функции — авторитативный DNS, рекурсивные запросы и кэширование
- Традиционная файловая система: Конфигурация осуществляется через текстовые файлы (named.conf), а зоны хранятся в отдельных файлах зон
- Ограниченная многопоточность: Хотя современные версии поддерживают многопоточность, исторически BIND9 был однопоточным
PowerDNS: современная модульность
PowerDNS предлагает принципиально иной, более гибкий подход:
- Модульная архитектура: Разделение функций между разными компонентами (например, pdns-server и pdns-recursor)
- Разнообразие бэкендов: Поддержка SQL-баз (MySQL, PostgreSQL), LDAP, файловых систем и даже REST API
- Встроенная многопоточность: Оптимизированная работа на многоядерных системах
Сравнительные характеристики
Параметр | BIND9 | PowerDNS |
---|---|---|
Обработка запросов | До 50k запросов/сек (с настройкой) | До 100k+ запросов/сек |
Потребление памяти | Высокое при больших зонах | Оптимизированное |
Масштабируемость | Вертикальное | Горизонтальное и вертикальное |
Поддержка кластеров | Ограниченная | Широкая |
Запуск PowerDNS и PowerDNS Admin в Docker контейнерах
Создайте постоянный том для PowerDNS с правами доступа, как показано ниже.
sudo mkdir /pda-mysql
sudo chmod 777 /pda-mysql
Вышеуказанный том будет использоваться для сохранения базы данных и конфигураций. В системах на базе Rhel вам необходимо установить SELinux в разрешительный режим, чтобы путь был доступен.
sudo setenforce 0
sudo sed -i 's/^SELINUX=.*/SELINUX=permissive/g' /etc/selinux/config
С помощью этого метода все переменные определяются в файле docker-compose. Создайте файл docker-conpose.yml.
vim docker-compose.yml
В файл вам необходимо добавить следующие строки.
version: '3'
services:
db:
image: mariadb:latest
environment:
- MYSQL_ALLOW_EMPTY_PASSWORD=yes
- MYSQL_DATABASE=powerdnsadmin
- MYSQL_USER=pdns
- MYSQL_PASSWORD=mypdns
ports:
- 3306:3306
restart: always
volumes:
- /pda-mysql:/var/lib/mysql
pdns:
#build: pdns
image: pschiffe/pdns-mysql
hostname: pdns
domainname: computingforgeeks.com
restart: always
depends_on:
- db
links:
- "db:mysql"
ports:
- "53:53"
- "53:53/udp"
- "8081:8081"
environment:
- PDNS_gmysql_host=db
- PDNS_gmysql_port=3306
- PDNS_gmysql_user=pdns
- PDNS_gmysql_dbname=powerdnsadmin
- PDNS_gmysql_password=mypdns
- PDNS_master=yes
- PDNS_api=yes
- PDNS_api_key=secret
- PDNSCONF_API_KEY=secret
- PDNS_webserver=yes
- PDNS_webserver-allow-from=127.0.0.1,10.0.0.0/8,172.0.0.0/8,192.0.0.0/24
- PDNS_webserver_address=0.0.0.0
- PDNS_webserver_password=secret2
- PDNS_version_string=anonymous
- PDNS_default_ttl=1500
- PDNS_allow_notify_from=0.0.0.0
- PDNS_allow_axfr_ips=127.0.0.1
web_app:
image: powerdnsadmin/pda-legacy:latest
container_name: powerdns_admin
ports:
- "8080:80"
depends_on:
- db
restart: always
links:
- db:mysql
- pdns:pdns
logging:
driver: json-file
options:
max-size: 50m
environment:
- SQLALCHEMY_DATABASE_URI=mysql://pdns:mypdns@db/powerdnsadmin
- GUNICORN_TIMEOUT=60
- GUNICORN_WORKERS=2
- GUNICORN_LOGLEVEL=DEBUG
В приведенном выше файле у нас есть следующие разделы:
- pdns для DNS-сервера. Не забудьте установить PDNS_api_key , который будет использоваться для подключения к панели управления PDNS.
- База данных db для powerDns. Он будет включать таблицы для доменов, зон и т. д.
- pdns-mysql DNS-сервер, настраиваемый с базой данных MySQL.
- Веб-интерфейс администратора web_app для взаимодействия с powerdns
Запустите контейнер командой:
docker-compose up -d
Проверьте, запущены ли контейнеры:
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7c5761e3d2a2 powerdnsadmin/pda-legacy:latest "entrypoint.sh gunic…" 10 seconds ago Up 7 seconds (health: starting) 0.0.0.0:8080->80/tcp, :::8080->80/tcp powerdns_admin
ebf3ff118c72 pschiffe/pdns-mysql "/docker-entrypoint.…" 10 seconds ago Up 8 seconds 0.0.0.0:53->53/tcp, :::53->53/tcp, 0.0.0.0:8081->8081/tcp, 0.0.0.0:53->53/udp, :::8081->8081/tcp, :::53->53/udp thor-pdns-1
9ede175d6ae0 mariadb:latest "docker-entrypoint.s…" 11 seconds ago Up 9 seconds 0.0.0.0:3306->3306/tcp, :::3306->3306/tcp thor-db-1
Здесь сервис PowerDNS доступен на порту 8080
Веб-интерфейс администратора PowerDNS
Теперь вы должны иметь доступ к веб-интерфейсу через установленный порт, например http://IP_адрес:8080

Создайте пользователя для PowerDNS.

Войдите в систему, используя созданного пользователя.

Теперь откройте панель управления, указав URL http://pdns:8081/ и ключ API в YAML secret и update

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

На данный момент доменов нет, нам нужно добавить новые домены. Давайте создадим образец, нажав на вкладку +Новый домен.

Введите доменное имя, которое вы хотите добавить, а также выберите шаблон для настройки из списка шаблонов и нажмите «Отправить».
Перейдите на панель управления, и ваш домен будет добавлен, как показано ниже.

Записи можно добавить в домен, нажав на него. Задайте имя записи, сохраните и примените изменения.

Веб-интерфейс администратора PowerDNS упрощает управление PowerDNS Admin.
Здесь вы можете выполнить множество других настроек, таких как редактирование шаблонов доменов, удаление доменов, управление учётными записями пользователей и т. д. Просмотрите историю действий, выполненных на сервере.

Защита PowerDNS с помощью SSL
Вы также можете создать SSL-сертификаты для доступа к веб-интерфейсу с помощью HTTPS, что более безопасно. В этом руководстве мы создадим самоподписанные сертификаты с помощью OpenSSL. Перед продолжением убедитесь, что openssl
установлен.
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout pdnsadmin_ssl.key -out pdnsadmin_ssl.crt
Укажите необходимые данные для создания сертификатов. После создания переместите их в каталог /etc/ssl/certs.
sudo cp pdnsadmin_ssl.crt /etc/ssl/certs/pdnsadmin_ssl.crt
sudo mkdir -p /etc/ssl/private/
sudo cp pdnsadmin_ssl.key /etc/ssl/private/pdnsadmin_ssl.key
Теперь установите веб-сервер Nginx.
##On RHEL/CentOS/Rocky Linux 8
sudo yum install nginx
##On Debian/Ubuntu
sudo apt install nginx
Создайте файл конфигурации Nginx для администратора PowerDNS. В системе на базе Rhel файл конфигурации будет находиться в /etc/nginx/conf.d/, как показано ниже
sudo vim /etc/nginx/conf.d/pdnsadmin.conf
Теперь добавьте строки ниже, заменив название сервера.
server {
listen 443 ssl http2 default_server;
listen [::]:443 ssl http2 default_server;
server_name pdnsadmin.computingforgeeks.com;
root /usr/share/nginx/html;
ssl_certificate /etc/ssl/certs/pdnsadmin_ssl.crt;
ssl_certificate_key /etc/ssl/private/pdnsadmin_ssl.key;
ssl_protocols TLSv1.2 TLSv1.1 TLSv1;
# Load configuration files for the default server block.
include /etc/nginx/default.d/*.conf;
location / {
proxy_pass http://localhost:8080/;
index index.html index.htm;
}
error_page 404 /404.html;
location = /40x.html {
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}
Сохраните файл и установите соответствующие разрешения.
# CentOS / RHEL / Fedora
sudo chown nginx:nginx /etc/nginx/conf.d/pdnsadmin.conf
sudo chmod 755 /etc/nginx/conf.d/pdnsadmin.conf
# Debian / Ubuntu
sudo chown www-data:www-data /etc/nginx/conf.d/pdnsadmin.conf
sudo chmod 755 /etc/nginx/conf.d/pdnsadmin.conf
Запустите и включите Nginx.
sudo systemctl start nginx
sudo systemctl enable nginx
Возможно, вам потребуется разрешить использование HTTPS через брандмауэр.
sudo firewall-cmd --add-service=http --permanent
sudo firewall-cmd --add-service=https --permanent
sudo firewall-cmd --reload
Теперь войдите в веб-интерфейс администратора PowerDNS по протоколу HTTPS по URL-адресу https://IP-адрес или https://доменное_имя
