Начиная с версии 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
    BASH
  2. Установите обновления ПО:

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

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

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

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

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

    CREATE DATABASE powerdns;
    SQL
    CREATE USER 'powerdns' IDENTIFIED BY '<powernds_mysql_pass>';
    SQL

    <powernds_mysql_pass> — пароль к учётной записи powerdns в MySQL

    GRANT ALL PRIVILEGES ON powerdns.* TO 'powerdns';
    SQL
    FLUSH PRIVILEGES;
    SQL
  8. Выйдите из консоли:

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

      Каждой версии PowerDNS соответствует своя схема.

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

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

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

    dnf -y install pdns pdns-backend-mysql bind-utils
    BASH
    systemctl enable pdns.service
    BASH
    systemctl start pdns.service
    BASH
  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>
    CODE

    Конфигурация для вторичного 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
    CODE

    <pdns_api_key> — ключ доступа к API PowerDNS. Минимальная длина — 6 символов

    <pdns_port> — порт доступа к встроенному веб-серверу PowerDNS

    <powernds_mysql_pass> — пароль к учётной записи powerdns в MySQL

    <transfer_zone_allow> — IP-адреса DNS-серверов, которым разрешено запрашивать трансфер доменных зон

  13. Откройте порты DNS и веб-сервера PowerDNS в файрволе:

    firewall-cmd --permanent --zone=public --add-port=<pdns_port>/tcp
    BASH

    <pdns_port> — порт доступа к встроенному веб-серверу PowerDNS

    firewall-cmd --permanent --zone=public --add-service=dns
    BASH
    firewall-cmd --reload
    BASH
  14. Если PowerDNS используется в качестве вторичного DNS:

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

      pdnsutil create-secondary-zone <zone> <primary_dns>
      BASH

      <zone> — доменная зона

      <primary_dns> — IP-адрес основного DNS-сервера

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

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

      INSERT INTO supermasters VALUES ('<primary_IP>', '<primary_domain>', 'powerdns') ;
      SQL

      <primary_IP> — IP-адрес основного DNS-сервера

      <primary_domain> — доменное имя основного DNS-сервера

    4. Выйдите из консоли: 

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

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

    systemctl restart pdns.service
    BASH

Настройка 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
    CODE

    <pdns_ip>:<pdns_port> — IP-адрес и порт PowerDNS

    <pdns_api_key> — ключ доступа к API PowerDNS

    <token> — токен авторизации. Подробнее см. Как работать с API VMmanager

    <vmmgr_ip> — IP-адрес или доменное имя сервера с VMmanager

    <ns1>, <ns2> — IP-адреса или доменные имена NS

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

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

    curl -X POST -H "x-xsrf-token: <token>" https://<vmmgr_ip>/ip/v3/plugin/dnsproxy/enable
    CODE

    <token> — токен авторизации

    <vmmgr_ip> — IP-адрес или доменное имя сервера с VMmanager

  3. Запустите синхронизацию данных с dnsproxy. После этого сервис dnsproxy передаст PTR-записи в PowerDNS:

    curl -X POST -H "x-xsrf-token: <token>" https://<vmmgr_ip>/ip/v3/ip/dnsproxy/sync
    CODE

    <token> — токен авторизации

    <vmmgr_ip> — IP-адрес или доменное имя сервера с VMmanager

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

  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
    CODE

    <pdns_api_key> — ключ доступа к API PowerDNS

    <pdns_ip>:<pdns_port> — IP-адрес и порт PowerDNS

    [{
    "account": "",
    "dnssec": false,
    "id": "ip6.arpa.",
    "kind": "Master",
    "last_check": 0,
    "masters": [],
    "name": "ip6.arpa.",
    "notified_serial": 0,
    "serial": 2020032801,
    "url": "/api/v1/servers/localhost/zones/ip6.arpa."
    },
    {
    "account": "",
    "dnssec": false,
    "id": "in-addr.arpa.",
    "kind": "Master",
    "last_check": 0,
    "masters": [],
    "name": "in-addr.arpa.",
    "notified_serial": 0,
    "serial": 2020032812,
    "url": "/api/v1/servers/localhost/zones/in-addr.arpa."
    }]
    CODE
  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.
    CODE
    curl -v -H 'X-API-Key: <pdns_api_key>' http://<pdns_ip>:<pdns_port>/api/v1/servers/localhost/zones/ip6.arpa.
    CODE

    <pdns_api_key> — ключ доступа к API PowerDNS

    <pdns_ip>:<pdns_port> — IP-адрес и порт PowerDNS

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

    {
    "account": "",
    "api_rectify": false,
    "dnssec": false,
    "id": "in-addr.arpa.",
    "kind": "Master",
    "last_check": 0,
    "masters": [],
    "name": "in-addr.arpa.",
    "notified_serial": 0,
    "nsec3narrow": false,
    "nsec3param": "",
    "rrsets": [
    {
    "comments": [],
    "name": "14.250.31.172.in-addr.arpa.",
    "records": [
    {
    "content": "sunshine-ametrine.example.com.",
    "disabled": false
    }
    ],
    "ttl": 3600,
    "type": "PTR"
    },
    {
    "comments": [],
    "name": "0.250.31.172.in-addr.arpa.",
    "records": [
    {
    "content": "subnet.reserved.example.com.",
    "disabled": false
    }
    ],
    "ttl": 3600,
    "type": "PTR"
    },
    ...
    ],
    "serial": 2020032717,
    "soa_edit": "",
    "soa_edit_api": "DEFAULT",
    "url": "/api/v1/servers/localhost/zones/in-addr.arpa."
    }
    CODE
  3. Проверьте работу PowerDNS:

    dig -x <IP> @<pdns_ip> +short
    CODE

    <IP> — IP-адрес ВМ

    <pdns_ip> — IP-адрес PowerDNS

    Ответ должен содержать информацию о 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
BASH

Пример ответа

CONTAINER ID   IMAGE         COMMAND                  CREATED      STATUS      PORTS      NAMES
3213c5dc94d0   postgres:12   "docker-entrypoint.s…"   5 days ago   Up 4 days   5432/tcp   pgsql
CODE

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

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

MySQL

docker exec -it mysql bash -c "mysql isp -p\$MYSQL_ROOT_PASSWORD -e 'select * from dns_proxy_zone;' "
BASH

PostgreSQL

docker exec -it pgsql bash -c "psql -d isp -c 'select * from dns_proxy_zone;' "
BASH

Пример ответа

*************************** 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)
CODE

status_info — информация о статусе DNS-зоны. Сообщение null означает, что зона добавлена успешно.


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

MySQL

docker exec -it mysql bash -c "mysql isp -p\$MYSQL_ROOT_PASSWORD -e 'select * from dns_proxy_record;' "
BASH

PostgreSQL

docker exec -it pgsql bash -c "psql -d isp -c 'select * from dns_proxy_record;' "
BASH


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

Пример ответа

*************************** 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
CODE

status_info — информация о статусе DNS-записи. Сообщение null означает, что запись добавлена успешно.

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

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

    curl -X POST -H "x-xsrf-token: <token>" https://<vmmgr_ip>/ip/v3/plugin/dnsproxy/disable
    CODE

    <token> — токен авторизации

    <vmmgr_ip> — IP-адрес или доменное имя сервера с VMmanager

  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;' "
    BASH

    PostgreSQL

    docker exec -it pgsql bash -c "psql -d isp -c 'delete from dns_proxy_record; delete from dns_proxy_zone;' "
    BASH
  3. Настройте интеграцию повторно.