Перейти к содержимому
Главная страница » PowerDNS в Docker

PowerDNS в Docker

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

Сравнительные характеристики

ПараметрBIND9PowerDNS
Обработка запросовДо 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://доменное_имя

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *