
В одном из прошлых гайдов мы рассматривали, как развернуть 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://доменное_имя
