PowerDNS

Материал из ALT Linux Wiki


Stub.png
Данная страница находится в разработке.
Эта страница ещё не закончена. Информация, представленная здесь, может оказаться неполной или неверной.


Что такое PowerDNS

PowerDNS (PDNS) — это высокопроизводительный DNS-сервер, поддерживающий различные типы хранилищ, включая реляционные базы данных (такие как MySQL, PostgreSQL, SQLite), LDAP и простые текстовые файлы.

PowerDNS может работать в двух основных режимах:

  • Authoritative DNS-сервер — отвечает за доменные зоны, предоставляя информацию о DNS-записях (A, MX и др.) для запрашиваемых доменов.
  • Рекурсивный DNS-сервер — разрешает любые DNS-запросы, обращаясь к другим серверам в иерархии DNS, если сам не хранит нужные данные.

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

Примечание: Авторитарный сервер будет разворачиваться с PostgreSQL. Подробнее о настройке и работе — на отдельной странице.


Установка PostgreSQL

Устанавливаем сервер PostgreSQL:

Примечание: В p11 поддерживается несколько версий PostgreSQL, в данной статье речь о 17 версии.
# 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.
Примечание: После выполнения всех необходимых команд по добавлению записей, необходимо перезапустить PowerDNS командой:
# 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, либо в ручную. Более подробно в настройках сети — на отдельной странице.

Примечание: Если на клиентской машине используется dnsmasq, отключите его.


Проверка работы

Для проверки потребуется утилита 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