Модуль "Интеграция с PowerDNS"
Для работы некоторых интернет-сервисов (например, отправки электронной почты) на виртуальных машинах (ВМ) необходимо преобразование IP-адресов в доменные имена. Чтобы это преобразование выполнялось, нужно настроить интеграцию VMmanager c DNS-сервером.
VMmanager поддерживает интеграцию с PowerDNS Authoritative Server. PowerDNS — это высокопроизводительный бесплатный DNS-сервер с открытым исходным кодом. Подробнее о PowerDNS см. в официальной документации.
После интеграции на DNS-сервере будут созданы PTR-записи, преобразующие адреса ВМ в доменные имена.
Соответствие 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
Обратите внимание!
- В примеры указаны команды для ОС AlmaLinux 8. Для других ОС команды могут отличаться.
- В базовой конфигурации PowerDNS использует BIND в качестве источника данных (backend). BIND не поддерживает выполнение API-запросов на запись по HTTP, поэтому не подходит для настройки интеграции. В примере описана смена источника на Generic Mysql. Подробнее см. в официальной документации PowerDNS.
На сервере для PowerDNS:
Добавьте репозиторий epel-release:
dnf -y install epel-release
BASHУстановите обновления ПО:
dnf -y update
BASHОтключите службу SELinux:
setenforce 0
CODEsed -i 's/^SELINUX=.*/SELINUX=disabled/g' /etc/selinux/config
CODEУстановите MySQL:
dnf -y install mysql-server mysql
BASHsystemctl enable mysqld.service
BASHsystemctl start mysqld.service
BASHВыполните начальную настройку безопасности MySQL:
mysql_secure_installation
BASHОткройте консоль MySQL:
mysql -u root -p
BASHСоздайте в консоли базу данных (БД) и учётную запись powernds:
CREATE DATABASE powerdns;
SQLCREATE USER 'powerdns' IDENTIFIED BY '<powernds_mysql_pass>';
SQLПояснения к команде<powernds_mysql_pass> — пароль к учётной записи powerdns в MySQL
GRANT ALL PRIVILEGES ON powerdns.* TO 'powerdns';
SQLFLUSH PRIVILEGES;
SQLВыйдите из консоли:
exit
SQL- Импортируйте схему для источника данных:
Сохраните схему из документации PowerDNS в файл /root/powerdns.sql.
Обратите внимание!
Каждой версии PowerDNS соответствует своя схема.
Импортируйте сохранённый файл в базу данных:
mysql -u powerdns -p powerdns < /root/powerdns.sql
BASH
Если служба systemd-resolved включена, остановите и отключите её:
systemctl disable systemd-resolved.service
BASHsystemctl stop systemd-resolved.service
BASHsystemctl mask systemd-resolved.service
BASHУстановите PowerDNS:
dnf -y install pdns pdns-backend-mysql bind-utils
BASHsystemctl enable pdns.service
BASHsystemctl start pdns.service
BASHСоздайте конфигурационный файл /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-серверов, которым разрешено запрашивать трансфер доменных зон
Откройте порты DNS и веб-сервера PowerDNS в файрволе:
firewall-cmd --permanent --zone=public --add-port=<pdns_port>/tcp
BASHПояснения к команде<pdns_port> — порт доступа к встроенному веб-серверу PowerDNS
firewall-cmd --permanent --zone=public --add-service=dns
BASHfirewall-cmd --reload
BASHЕсли PowerDNS используется в качестве вторичного DNS:
Добавьте доменные зоны:
pdnsutil create-secondary-zone <zone> <primary_dns>
BASHПояснения к команде<zone> — доменная зона
<primary_dns> — IP-адрес основного DNS-сервера
Откройте консоль MySQL:
mysql -u root -p
BASHДобавьте в БД запись с настройками основного сервера:
INSERT INTO supermasters VALUES ('<primary_IP>', '<primary_domain>', 'powerdns') ;
SQLПояснения к команде<primary_IP> — IP-адрес основного DNS-сервера
<primary_domain> — доменное имя основного DNS-сервера
Выйдите из консоли:
exit
SQLВ файле /etc/pdns/pdns.conf укажите для параметра autosecondary значение yes:
autosecondary=yes
CODE
Перезапустите PowerDNS:
systemctl restart pdns.service
BASH
Настройка VMmanager через интерфейс
На сервере с VMmanager:
- Установите модуль "Интеграция с PowerDNS":
→ Модули → Интеграция с PowerDNS → Установить.
- Нажмите Настроить и укажите настройки подключения к PowerDNS:
Доменное имя или IP-адрес.
Порт подключения.
Ключ API.
- Серверы имен.
Нажмите Применить.
Обратите внимание!
Если у вас настроена интеграция с другими платформами через модуль "Интеграция с IPmanager 6", установите в этих платформах модуль "Интеграция с PowerDNS" с аналогичными настройками.
Настройка VMmanager через API
- Передайте в VMmanager данные для подключения к API PowerDNS:
curl -d '{"type":"powerdns", "params":{"address":"<pdns_ip>:<pdns_port>", "password":"<pdns_api_key>"}}' -H "x-xsrf-token: <token>" -H "Host: instance-1" https://<vmmgr_ip>/dnsproxy/v3/settings/dns
<pdns_ip>:<pdns_port> — IP-адрес и порт PowerDNS
<pdns_api_key> — ключ доступа к API PowerDNS
<token> — токен авторизации. Подробнее см. Как работать с API VMmanager
<vmmgr_ip> — IP-адрес или доменное имя сервера с VMmanager
Если в ответ вы получили сообщение "Instance is starting now", повторите команду.
2. Включите сервис dnsproxy на сервере с VMmanager. Этот сервис выполняет интеграцию с внешними DNS-серверами
curl -X POST -H "x-xsrf-token: <token>" https://<vmmgr_ip>/ip/v3/plugin/dnsproxy/enable
<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
<token> — токен авторизации
<vmmgr_ip> — IP-адрес или доменное имя сервера с VMmanager
Проверка настроек
- Проверьте, что 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
<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."
}]
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.
<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."
}
3. Проверьте работу PowerDNS:
dig -x <IP> @<pdns_ip> +short
<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.
Чтобы проверить настройки DNS-зон в VMmanager, выполните на сервере с VMmanager команду:
docker exec -it mysql bash -c "mysql isp -p\$MYSQL_ROOT_PASSWORD -e '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)
status_info — информация о статусе DNS-зоны. Сообщение null означает, что зона добавлена успешно.
Чтобы проверить настройки DNS-записей в VMmanager, выполните на сервере с VMmanager команду:
docker exec -it mysql bash -c "mysql isp -p\$MYSQL_ROOT_PASSWORD -e '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
status_info — информация о статусе DNS-записи. Сообщение null означает, что запись добавлена успешно.
При возникновении проблем с настройкой интеграции:
Отключите сервис dnsproxy:
curl -X POST -H "x-xsrf-token: <token>" https://<vmmgr_ip>/ip/v3/plugin/dnsproxy/disable
CODEПояснения к команде<token> — токен авторизации
<vmmgr_ip> — IP-адрес или доменное имя сервера с VMmanager
Удалите содержимое таблиц dns_proxy_record и dns_proxy_zone:
docker exec -it mysql bash -c "mysql isp -p\$MYSQL_ROOT_PASSWORD -e 'delete from dns_proxy_record; delete from dns_proxy_zone;' "
CODE- Настройте интеграцию повторно.