PowerDNS
Что такое PowerDNS
PowerDNS (PDNS) — это высокопроизводительный DNS-сервер, поддерживающий различные типы хранилищ, включая реляционные базы данных (такие как MySQL, PostgreSQL, SQLite), LDAP и простые текстовые файлы.
PowerDNS может работать в двух основных режимах:
- Authoritative DNS-сервер — отвечает за доменные зоны, предоставляя информацию о DNS-записях (A, MX и др.) для запрашиваемых доменов.
- Рекурсивный DNS-сервер — разрешает любые DNS-запросы, обращаясь к другим серверам в иерархии DNS, если сам не хранит нужные данные.
Установка и настройка
Установка PostgreSQL
Устанавливаем сервер PostgreSQL:
# apt-get install postgresql17-server
Создадим системные базы данных и зададим пароль пользователя postgres командой:
# /etc/init.d/postgresql initdb
Включим по умолчанию и запустим службу PostgreSQL:
# systemctl enable --now postgresql
Установка PowerDNS
Устанавливаем следующие пакеты для работы PowerDNS:
# apt-get install pdns pdns-backend-postgresql pdns-recursor
Создание БД и пользователя в PostgreSQL
Подключаемся к PostgreSQL:
# psql -U postgres
Создаём пользователя и БД:
CREATE USER pdns WITH PASSWORD 'Очень_надёжный_пароль_пользователя_БД';
CREATE DATABASE pdns_db WITH OWNER pdns;
\q
Импорт схемы PowerDNS
Загружаем схему:
# psql -U pdns -d pdns_db < /usr/share/doc/pdns/schema.pgsql.sql
Настройка авторитарного сервера PowerDNS
Основной конфигурационный файл: /etc/pdns/pdns.conf
Пример конфигурационного файла:
launch=gpgsql
gpgsql-host=localhost
gpgsql-user=pdns
gpgsql-password=Очень_надёжный_пароль_пользователя_БД
gpgsql-dbname=pdns_db
local-address=192.168.0.1
allow-axfr-ips=192.168.0.2, 192.168.0.3
local-port=5300
default-soa-content=ns1.example.alt mail.example.alt 0 10800 3600 604800 3600
setgid=pdns
setuid=pdns
api=yes
api-key=Очень_надёжный_пароль_API
webserver=yes
webserver-address=192.168.0.1
webserver-port=8081
webserver-allow-from=192.168.0.1, 192.168.0.2, 192.168.0.3
Описание параметров конфигурационного файла:
- launch — определяет тип бэкенда для хранения DNS-записей;
- gpgsql-host — адрес сервера PostgreSQL;
- gpgsql-user — имя пользователя для подключения к PostgreSQL;
- gpgsql-password — пароль пользователя базы данных;
- gpgsql-dbname — название базы данных с DNS-записями;
- local-address — IP-адрес интерфейса для прослушивания запросов;
- local-port — порт работы DNS-сервера;
- allow-axfr-ips — список IP-адресов для AXFR-трансферов;
- default-soa-content — шаблон SOA-записи;
Формат:
<первичный-сервер>, <email-администратора>, <serial>, <refresh>, <retry>, <expire>, <minimum-ttl>
- setgid — группа для процесса;
- setuid — пользователь для процесса;
- api — включение REST API;
- api-key — ключ доступа к API;
- webserver — включение веб-сервера;
- webserver-address — IP веб-интерфейса;
- webserver-port — порт веб-сервера;
- webserver-allow-from — разрешённые IP для API.
После изменения настроек выполним команды:
# systemctl enable --now pdns
Проверим статус работы PowerDNS командой:
# systemctl status pdns
Настройка pdns-recursor
Основной конфигурационный файл: /etc/pdns-recursor/recursor.conf
Пример конфигурационного файла:
allow-from=192.168.0.0/16
forward-zones=example.alt=192.168.0.1:5300
forward-zones-recurse=.=1.1.1.1;8.8.8.8
local-address=192.168.0.1
local-port=53
setuid=pdns-recursor
Описание параметров конфигурационного файла:
- allow-from — Список разрешённых подсетей, которым разрешено выполнять DNS-запросы;
- forward-zones — Специальные DNS-зоны, которые должны перенаправляться на указанный сервер;
- forward-zones-recurse — Все остальные DNS-запросы (не указанные в forward-zones) будут перенаправляться на эти рекурсивные серверы;
- local-address — IP-адрес, на котором сервер будет принимать DNS-запросы;
- local-port — Порт, на котором работает recursor;
- setuid — Пользователь, от имени которого работает процесс.
После изменения настроек выполним команды:
# systemctl enable --now pdns-recursor
Проверим статус работы pdns-recursor командой:
# systemctl status pdns-recursor
Способы добавления DNS зон
PowerDNS поддерживает несколько способов добавления зон.
Создание и настройка зон с помощью pdnsutil
# pdnsutil create-zone example.alt ns1.example.alt
# pdnsutil add-record example.alt ns1 A 192.168.0.1
Первая команда создаст SOA и NS запись (необходимые данные будут взяты из пункта default-soa-content конфигурационного файла pdns.conf), вторая создаст запись типа А.
Создание и настройка зон с помощью API
Создание зоны
curl -X POST --data '{
"name": "example.alt.",
"kind": "Native",
"nameservers": [],
"rrsets": [{
"name": "example.alt.",
"type": "SOA",
"ttl": 3600,
"changetype": "REPLACE",
"records": [{
"content": "ns1.example.alt. mail.example.alt. 0 3600 1800 604800 60",
"disabled": false
}]
}]
}' -H "X-API-Key: Очень_надёжный_пароль_API" \
http://192.168.0.1:8081/api/v1/servers/localhost/zones
После выполнения данной команды, будет создана DNS зона example.alt и SOA запись.
NS-записи
curl -X PATCH --data '{
"rrsets": [{
"name": "example.alt.",
"type": "NS",
"ttl": 3600,
"changetype": "REPLACE",
"records": [
{"content": "ns1.example.alt.",
"disabled": false
}]
}]
}' -H "X-API-Key: Очень_надёжный_пароль_API" \
http://192.168.0.1:8081/api/v1/servers/localhost/zones/example.alt.
A-запись
curl -X PATCH --data '{
"rrsets": [{
"name": "ns1.example.alt.",
"type": "A",
"ttl": 3600,
"changetype": "REPLACE",
"records": [{
"content": "192.168.0.1"
}]
}]
}' -H "X-API-Key: Очень_надёжный_пароль_API" \
http://192.168.0.1:8081/api/v1/servers/localhost/zones/example.alt.
# systemctl restart pdns
Создание и настройка зон с помощью базы данных
Подключимся к БД pdns_db пользователем pdns командой:
# psql -U pdns -d pdns_db
Создадим зону и внесем необходимые записи следующими командами:
INSERT INTO domains (name, type) VALUES ('example.alt', 'MASTER');
INSERT INTO records (domain_id, name, type, content, ttl, prio)
VALUES (1, 'example.alt', 'SOA', 'ns1.example.alt hostmaster.example.alt 1 10800 3600 604800 3600', 3600, NULL);
INSERT INTO records (domain_id, name, type, content, ttl, prio)
VALUES (1, 'example.alt', 'NS', 'ns1.example.alt', 3600, NULL);
INSERT INTO records (domain_id, name, type, content, ttl, prio)
VALUES (1, 'ns1.example.alt', 'A', '192.168.0.1', 3600, NULL);
\q
Описание:
SOA — содержит служебную информацию о домене:
- первичный DNS-сервер (ns1.example.alt);
- email администратора (mail@example.alt, где @ заменён на точку);
- параметры синхронизации.
NS — указывает авторитарные DNS-сервера для домена, может быть несколько записей NS для отказоустойчивости
A — связывает доменное имя с IPv4-адресом,необходимо для работы любых сервисов (веб, почта и др.)
Подключение клиента к DNS-серверу
На клиенте в качестве DNS-сервера необходимо указать IP-адрес сервера, где развернут PowerDNS. В нашем случае на 192.168.0.1. Сделать это можно через NetworkManager, либо в ручную. Более подробно в настройках сети — на отдельной странице.
Проверка работы
Для проверки потребуется утилита dig — это инструмент для выполнения DNS-запросов. Если утилита отсутствует, необходимо установить пакет bind-utils. Данный пакет содержит различные утилиты, связанные с DNS, включая dig, host, nslookup и nsupdate. Установим пакет следующей командой:
# apt-get install bind-utils
Выполним запрос для проверки авторитарного сервера с клиентской машины (DNS 192.168.0.1):
dig @192.168.0.1 ns1.example.alt -p 5300 +short
В ответ получим IP-адрес зоны: 192.168.0.1
Для проверки рекурсора выполним следующий запрос с клиентской машины (DNS 192.168.0.1):
dig @192.168.0.1 google.com +short
В ответ получим IP-адрес google, например: 74.125.131.106