VMmanager

Модуль "Интеграция с PowerDNS"

Начиная с версии 2023.08.1 установка и настройка модуля не поддерживается. Для интеграции с DNS-сервером в платформе используйте модуль "Интеграция с DNSmanager 6".

Если в платформе была настроена интеграция с PowerDNS, интеграция продолжит работу до момента установки модуля "Интеграция с DNSmanager 6".

Для работы некоторых интернет-сервисов (например, отправки электронной почты) на виртуальных машинах (ВМ) необходимо преобразование IP-адресов в доменные имена. Чтобы это преобразование выполнялось, нужно настроить интеграцию VMmanager c DNS-сервером.

VMmanager поддерживает интеграцию с PowerDNS Authoritative Server. PowerDNS — это высокопроизводительный бесплатный DNS-сервер с открытым исходным кодом. Подробнее о PowerDNS см. в официальной документации.

После интеграции на DNS-сервере будут созданы PTR-записи, преобразующие адреса ВМ в доменные имена.

Интеграция обеспечивает передачу:

  • PTR-записей;
  • NS-записей, если в настройках модуля указаны дополнительные серверы имён.

Передачу записей других типов нужно настраивать вручную.

Соответствие IP-адреса и обратного доменного имени

Для определения доменного имени по IP-адресу на DNS-сервере используется PTR-запись обратной доменной зоны. Для выполнения запроса адрес узла переводится в обратный вид, способ перевода зависит от версии протокола IP.

IPv4

IPv4-адрес записывается в виде четырёх десятичных чисел от 0 до 255, разделённых точками. Например, 192.168.0.1. Для поиска доменных имён по IPv4-адресам используется домен "in-addr.arpa.". IP-адрес записывается в доменном имени в обратном порядке. Например, адресу 195.161.72.28 соответствует доменное имя "28.72.161.195.in-addr.arpa.".

IPv6

IPv6-адрес записывается в виде восьми шестнадцатеричных чисел от 0 до ffff, разделённых двоеточиями. Например, 3107:0c38:0a67:0000:0000:e446:3925:0091. Для поиска доменных имён по IPv6-адресам используется домен "ip6.arpa.". IP-адрес записывается в доменном имени в обратном порядке. Например, адресу 3107:0c38:0a67:0000:0000:e446:3925:0091 соответствует доменное имя "1.9.0.0.5.2.9.3.6.4.4.e.0.0.0.0.0.0.0.0.7.6.a.0.8.3.c.0.7.0.1.3.ip6.arpa.".

Настройка интеграции

Установка и настройка PowerDNS

  1. В примеры указаны команды для ОС AlmaLinux 8. Для других ОС команды могут отличаться.
  2. В базовой конфигурации PowerDNS использует BIND в качестве источника данных (backend). BIND не поддерживает выполнение API-запросов на запись по HTTP, поэтому не подходит для настройки интеграции. В примере описана смена источника на Generic Mysql. Подробнее см. в официальной документации PowerDNS.

На сервере для PowerDNS:

  1. Добавьте репозиторий epel-release:

    dnf -y install epel-release
  2. Установите обновления ПО:

    dnf -y update
  3. Отключите службу SELinux: 

    setenforce 0
    sed -i 's/^SELINUX=.*/SELINUX=disabled/g' /etc/selinux/config
  4. Установите MySQL:

    dnf -y install mysql-server mysql
    systemctl enable mysqld.service
    systemctl start mysqld.service
  5. Выполните начальную настройку безопасности MySQL:

    mysql_secure_installation
  6. Откройте консоль MySQL:

    mysql -u root -p
  7. Создайте в консоли базу данных (БД) и учётную запись powernds:

    CREATE DATABASE powerdns;
    CREATE USER 'powerdns' IDENTIFIED BY '<powernds_mysql_pass>';
    Пояснения к команде
    GRANT ALL PRIVILEGES ON powerdns.* TO 'powerdns';
    FLUSH PRIVILEGES;
  8. Выйдите из консоли:

    exit
  9. Импортируйте схему для источника данных:
    1. Сохраните схему из документации PowerDNS в файл /root/powerdns.sql.

      Каждой версии PowerDNS соответствует своя схема.
    2. Импортируйте сохранённый файл в базу данных:

      mysql -u powerdns -p powerdns < /root/powerdns.sql
  10. Если служба systemd-resolved включена, остановите и отключите её:

    systemctl disable systemd-resolved.service
    systemctl stop systemd-resolved.service
    systemctl mask systemd-resolved.service
  11. Установите PowerDNS:

    dnf -y install pdns pdns-backend-mysql bind-utils
    systemctl enable pdns.service
    systemctl start pdns.service
  12. Создайте конфигурационный файл /etc/pdns/pdns.conf:

    Конфигурация для первичного DNS
    api=yes
    api-key=<pdns_api_key>  
    webserver=yes
    webserver-port=<pdns_port>
    webserver-address=0.0.0.0
    webserver-allow-from=0.0.0.0/0
    
    launch=gmysql
    gmysql-host=127.0.0.1
    gmysql-user=powerdns
    gmysql-password=<powernds_mysql_pass>
    gmysql-dbname=powerdns
    
    primary=yes
    allow-axfr-ips=<transfer_zone_allow>
    Конфигурация для вторичного DNS
    api=yes
    api-key=<pdns_api_key>  
    webserver=yes
    webserver-port=<pdns_port>
    webserver-address=0.0.0.0
    webserver-allow-from=0.0.0.0/0
    
    launch=gmysql
    gmysql-host=127.0.0.1
    gmysql-user=powerdns
    gmysql-password=<powernds_mysql_pass>
    gmysql-dbname=powerdns  
    
    secondary=yes
    Пояснения
  13. Откройте порты DNS и веб-сервера PowerDNS в файрволе:

    firewall-cmd --permanent --zone=public --add-port=<pdns_port>/tcp
    Пояснения к команде
    firewall-cmd --permanent --zone=public --add-service=dns
    firewall-cmd --reload
  14. Если PowerDNS используется в качестве вторичного DNS:

    1. Добавьте доменные зоны:

      pdnsutil create-secondary-zone <zone> <primary_dns>
      Пояснения к команде
    2. Откройте консоль MySQL: 

      mysql -u root -p
    3. Добавьте в БД запись с настройками основного сервера: 

      INSERT INTO supermasters VALUES ('<primary_IP>', '<primary_domain>', 'powerdns') ;
      Пояснения к команде
    4. Выйдите из консоли: 

      exit
    5. В файле /etc/pdns/pdns.conf укажите для параметра autosecondary значение yes

      autosecondary=yes
  15. Перезапустите PowerDNS:

    systemctl restart pdns.service

Настройка VMmanager

Начиная с версии 2023.08.1 настройка возможна только через API платформы.
  1. Передайте в VMmanager данные для подключения к API PowerDNS:

    curl -d '{"type":"powerdns", "params":{"address":"<pdns_ip>:<pdns_port>", "password":"<pdns_api_key>"}, "nameservers":["<ns1>","<ns2>"]}' -H "x-xsrf-token: <token>" -H "Host: instance-1" https://<vmmgr_ip>/dnsproxy/v3/settings/dns
    Пояснения к команде

    Если в ответ вы получили сообщение "Instance is starting now", повторите команду.

  2. Включите сервис dnsproxy на сервере с VMmanager. Этот сервис выполняет интеграцию с внешними DNS-серверами.

    curl -X POST -H "x-xsrf-token: <token>" https://<vmmgr_ip>/ip/v3/plugin/dnsproxy/enable
    Пояснения к команде
  3. Запустите синхронизацию данных с dnsproxy. После этого сервис dnsproxy передаст PTR-записи в PowerDNS:

    curl -X POST -H "x-xsrf-token: <token>" https://<vmmgr_ip>/ip/v3/ip/dnsproxy/sync
    Пояснения к команде

Проверка настроек

  1. Проверьте, что DNS-зоны ip6.arpa. и in-addr.arpa. добавлены в PowerDNS:

    curl -v -H 'X-API-Key: <pdns_api_key>' http://<pdns_ip>:<pdns_port>/api/v1/servers/localhost/zones
    Пояснения к команде
    Пример ответа
  2. Проверьте создание DNS-записей в зонах ip6.arpa. и in-addr.arpa.:

    curl -v -H 'X-API-Key: <pdns_api_key>' http://<pdns_ip>:<pdns_port>/api/v1/servers/localhost/zones/in-addr.arpa.
    curl -v -H 'X-API-Key: <pdns_api_key>' http://<pdns_ip>:<pdns_port>/api/v1/servers/localhost/zones/ip6.arpa.
    Пояснения к команде

    Ответ должен содержать PTR-записи для IP-адресов ВМ.

    Пример ответа для зоны in-addr.arpa.
  3. Проверьте работу PowerDNS:

    dig -x <IP> @<pdns_ip> +short
    Пояснения к команде

    Ответ должен содержать информацию о PTR-записи для запрашиваемого IP-адреса.

Диагностика

Интеграцию VMmanager с PowerDNS выполняет сервис dnsproxy. Вы можете проверить работу сервиса dnsproxy по лог-файлу /var/log/dns_proxy_service_1_writer.log в докер-контейнере vm_dns_proxy_1 на сервере с VMmanager.

В связи с поэтапным переходом платформы на использование СУБД PostgreSQL, разные экземпляры VMmanager могут использовать разные СУБД:

  • VMmanager Hosting — MySQL;
  • VMmanager Infrastructure:
    • для новых установок на ОС Astra Linux, начиная с версии VMmanager 2023.06.1 — PostgreSQL;
    • в остальных случаях — MySQL.

Чтобы определить тип СУБД, выполните на сервере с платформой команду: 

docker ps --filter name=pgsql
Пример ответа
CONTAINER ID   IMAGE         COMMAND                  CREATED      STATUS      PORTS      NAMES
3213c5dc94d0   postgres:12   "docker-entrypoint.s…"   5 days ago   Up 4 days   5432/tcp   pgsql

Если вывод команды содержит информацию о контейнере, платформа использует PostgreSQL, если ответ пустой — MySQL.

Чтобы проверить настройки DNS-зон в VMmanager, выполните на сервере с VMmanager команду:

MySQL
docker exec -it mysql bash -c "mysql isp -p\$MYSQL_ROOT_PASSWORD -e 'select * from dns_proxy_zone;' "
PostgreSQL
docker exec -it pgsql bash -c "psql -d isp -c 'select * from dns_proxy_zone;' "
Пример ответа
*************************** 1. row ***************************
         id: 1
     status: ok
status_info: null
       name: in-addr.arpa
*************************** 2. row ***************************
         id: 2
     status: ok
status_info: null
       name: ip6.arpa
2 rows in set (0.00 sec)
Пояснения к ответу


Чтобы проверить настройки DNS-записей в VMmanager, выполните на сервере с VMmanager команду:

MySQL
docker exec -it mysql bash -c "mysql isp -p\$MYSQL_ROOT_PASSWORD -e 'select * from dns_proxy_record;' "
PostgreSQL
docker exec -it pgsql bash -c "psql -d isp -c 'select * from dns_proxy_record;' "


Пример вывода команды:

Пример ответа
*************************** 1. row ***************************
         id: 1
     status: ok
status_info: null
       zone: 1
       name: 172.31.255.254
    content: gateway.reserved.example.com
       type: ptr
*************************** 2. row ***************************
         id: 2
     status: ok
status_info: null
       zone: 1
       name: 172.31.240.0
    content: subnet.reserved.example.com
       type: ptr
Пояснения к ответу

При возникновении проблем с настройкой интеграции:

  1. Отключите сервис dnsproxy:

    curl -X POST -H "x-xsrf-token: <token>" https://<vmmgr_ip>/ip/v3/plugin/dnsproxy/disable
    Пояснения к команде
  2. Удалите содержимое таблиц dns_proxy_record и dns_proxy_zone:

    MySQL
    docker exec -it mysql bash -c "mysql isp -p\$MYSQL_ROOT_PASSWORD -e 'delete from dns_proxy_record; delete from dns_proxy_zone;' "
    PostgreSQL
    docker exec -it pgsql bash -c "psql -d isp -c 'delete from dns_proxy_record; delete from dns_proxy_zone;' "
  3. Настройте интеграцию повторно.