Subscribe on YouTube

Собираем и настраиваем авторитарный сервер на базе PowerDNS

Установка и настройка авторитарного сервера DNS

Собираем высокопроизводительный DNS-сервер на базе PowerDNS.

Для тестов берем 3 сервера:

ns1.domain.ru - 111.111.111.111
ns2.domain.ru - 222.222.222.222
ns3.domain.ru - 333.333.333.333

Подготовка системы

Настройка NTP

Выполняем настройку NTP сервера на каждом сервере.
Это очень важный шаг, поскольку большинство проблем может возникнуть именно из-за некорректной настройки времени.

Установим NTP

sudo yum install ntp ntpdate
sudo ntpdate ntp2.stratum2.ru
sudo systemctl enable ntpd.service
sudo systemctl start ntpd.service

Вносим изменения в конфигурационный файл /etc/ntp.conf.

server ntp2.stratum2.ru
server ntp3.stratum2.ru
server ntp4.stratum2.ru
server ntp5.stratum2.ru
disable monitor
restrict default kod nomodify notrap nopeer noquery
restrict -6 default kod nomodify notrap nopeer noquery
restrict 127.0.0.1
restrict -6 ::1

Выполним настройку временной зоны, если это не было сделано при установке системы.

Установка необходимых пакетов

yum install epel-release remi-release bind-utils net-tools traceroute wget -y
yum groupinstall "Development tools" -y

Установка MariaDB Galera Cluster

Подробную процедуру установки и настройки MariaDB Galera можно найти в моей статье

Установка PDNS

Создаем базу данных, а также необходимые таблицы:

mysql -uroot -p

Создаем базу данных и пользователя:

create database powerdns;
GRANT ALL PRIVILEGES ON `powerdns `.* TO 'powerdns'@'localhost' IDENTIFIED BY 'Y0urP@$$w0rd' WITH GRANT OPTION;
FLUSH PRIVILEGES;
use powerdns;

Создаем таблицы:

CREATE TABLE domains (
id INT AUTO_INCREMENT,
name VARCHAR(255) NOT NULL,
master VARCHAR(128) DEFAULT NULL,
last_check INT DEFAULT NULL,
type VARCHAR(6) NOT NULL,
notified_serial INT DEFAULT NULL,
account VARCHAR(40) DEFAULT NULL,
PRIMARY KEY (id)
) Engine=InnoDB;
CREATE UNIQUE INDEX name_index ON domains(name);
CREATE TABLE records (
id INT AUTO_INCREMENT,
domain_id INT DEFAULT NULL,
name VARCHAR(255) DEFAULT NULL,
type VARCHAR(10) DEFAULT NULL,
content VARCHAR(64000) DEFAULT NULL,
ttl INT DEFAULT NULL,
prio INT DEFAULT NULL,
change_date INT DEFAULT NULL,
disabled TINYINT(1) DEFAULT 0,
ordername VARCHAR(255) BINARY DEFAULT NULL,
auth TINYINT(1) DEFAULT 1,
PRIMARY KEY (id)
) Engine=InnoDB;
CREATE INDEX nametype_index ON records(name,type);
CREATE INDEX domain_id ON records(domain_id);
CREATE INDEX recordorder ON records (domain_id, ordername);
CREATE TABLE supermasters (
ip VARCHAR(64) NOT NULL,
nameserver VARCHAR(255) NOT NULL,
account VARCHAR(40) NOT NULL,
PRIMARY KEY (ip, nameserver)
) Engine=InnoDB;
CREATE TABLE comments (
id INT AUTO_INCREMENT,
domain_id INT NOT NULL,
name VARCHAR(255) NOT NULL,
type VARCHAR(10) NOT NULL,
modified_at INT NOT NULL,
account VARCHAR(40) NOT NULL,
comment VARCHAR(64000) NOT NULL,
PRIMARY KEY (id)
) Engine=InnoDB;
CREATE INDEX comments_domain_id_idx ON comments (domain_id);
CREATE INDEX comments_name_type_idx ON comments (name, type);
CREATE INDEX comments_order_idx ON comments (domain_id, modified_at);
CREATE TABLE domainmetadata (
id INT AUTO_INCREMENT,
domain_id INT NOT NULL,
kind VARCHAR(32),
content TEXT,
PRIMARY KEY (id)
) Engine=InnoDB;
CREATE INDEX domainmetadata_idx ON domainmetadata (domain_id, kind);
CREATE TABLE cryptokeys (
id INT AUTO_INCREMENT,
domain_id INT NOT NULL,
flags INT NOT NULL,
active BOOL,
content TEXT,
PRIMARY KEY(id)
) Engine=InnoDB;
CREATE INDEX domainidindex ON cryptokeys(domain_id);
CREATE TABLE tsigkeys (
id INT AUTO_INCREMENT,
name VARCHAR(255),
algorithm VARCHAR(50),
secret VARCHAR(255),
PRIMARY KEY (id)
) Engine=InnoDB;
CREATE UNIQUE INDEX namealgoindex ON tsigkeys(name, algorithm);

Установим PDNS

yum install pdns-backend-mysql pdns pdns-tools

Выполним настройку файла конфигурации /etc/pdns/pdns.conf:

setuid=pdns
setgid=pdns
launch=gmysql
gmysql-host=127.0.0.1
gmysql-user=powerdns
gmysql-dbname= powerdns
gmysql-password=Y0urP@$$w0rd
gmysql-dnssec=yes
allow-axfr-ips=111.111.111.111/32, 222.222.222.222/32, 333.333.333.333/32, (указываем_список_серверов_которым разрешен_трансфер_зон)
allow-recursion=127.0.0.1/8, 111.111.111.0/24, 222.222.222.0/24, 333.333.333.0/32, (сети_которым_разрешена_рекурсия)
recursor=8.8.8.8
recursor=8.8.4.4
recursor=2001:4860:4860::8888
recursor=2001:4860:4860::8844
cache-ttl=30
control-console=no
default-soa-name=dns.mydomain.ru
default-soa-mail=info@domain.ru
default-ttl=3600
disable-axfr=no
local-address=111.111.111.111 (IPv4_адрес)
local-ipv6=(IPv6_адрес)
do-ipv6-additional-processing=yes
log-dns-queries=yes
logging-facility=0
loglevel=9
master=yes
max-queue-length=5000
max-tcp-connections=20
version-string=anonymous

Запускаем сервис и добавляем в автозагрузку:

systemctl enable pdns.service
systemctl start pdns.service

Проверяем статус работы сервиса:

[root@dns1 run]# service pdns status
Redirecting to /bin/systemctl status pdns.service
● pdns.service - PowerDNS Authoritative Server
Loaded: loaded (/usr/lib/systemd/system/pdns.service; enabled; vendor preset: disabled)
Active: active (running) since Пт 2017-03-10 19:30:18 MSK; 2s ago
Process: 15468 ExecStop=/usr/bin/pdns_control quit (code=exited, status=1/FAILURE)
Process: 15474 ExecStart=/usr/sbin/pdns_server --daemon (code=exited, status=0/SUCCESS)
Main PID: 15475 (pdns_server)
CGroup: /system.slice/pdns.service
└─15475 /usr/sbin/pdns_server --daemon
мар 10 19:30:18 ns1.domain.ru pdns[15475]: Master/slave communicator launching
мар 10 19:30:18 ns1.domain.ru pdns[15475]: gmysql Connection successful. Connected to database 'powerdns' on '127.0.0.1'.
мар 10 19:30:18 ns1.domain.ru pdns[15475]: About to create 3 backend threads for UDP
мар 10 19:30:18 ns1.domain.ru pdns[15475]: gmysql Connection successful. Connected to database 'powerdns' on '127.0.0.1'.
мар 10 19:30:18 ns1.domain.ru pdns[15475]: No new unfresh slave domains, 0 queued for AXFR already
мар 10 19:30:18 ns1.domain.ru pdns[15475]: No master domains need notifications
мар 10 19:30:18 ns1.domain.ru pdns[15475]: gmysql Connection successful. Connected to database 'powerdns' on '127.0.0.1'.
мар 10 19:30:18 ns1.domain.ru pdns[15475]: gmysql Connection successful. Connected to database 'powerdns' on '127.0.0.1'.
мар 10 19:30:18 ns1.domain.ru pdns[15475]: gmysql Connection successful. Connected to database 'powerdns' on '127.0.0.1'.
мар 10 19:30:18 ns1.domain.ru pdns[15475]: Done launching threads, ready to distribute questions

Не забываем добавить правила на firewall.
Я использую Firewalld.

firewall-cmd --permanent --zone=public --add-port=53/udp
firewall-cmd --permanent --zone=public --add-port=53/tcp
firewall-cmd --reload

Установка GUI Poweradmin

Установим PHP и NGINX

yum install nginx php-fpm php-cli php-mysqlnd php-mcrypt

Изменим настройки php-fpm для работы с сокетом, для этого отредактируем файл /etc/php-fpm.d/www.conf:

Заменим:

listen = 127.0.0.1:9000

На:

listen = /var/run/php-fpm/php-fpm.socket

Создаем папку под сессии и назначаем соответствующие права:

mkdir /var/lib/php/session
chown apache:apache /var/lib/php/session
server {
server_name pdns.domain.ru;
access_log /srv/www/pdns.domain.ru/logs/access.log;
error_log /srv/www/pdns.domain.ru/logs/error.log;
root /srv/www/pdns.domain.ru/public_html;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ /\. {
deny all;
access_log off;
log_not_found off;
}
location ~ \.php$ {
fastcgi_index index.php;
fastcgi_split_path_info ^(.+\.php)(.*)$;
fastcgi_keep_conn on;
include /etc/nginx/fastcgi_params;
fastcgi_pass unix:/var/run/php-fpm/php-fpm.socket;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
}

Перезагружаем NGINX и добавляем в автозагрузку.

systemctl start nginx.service
systemctl enable nginx.service

Установим PowerAdmin:

mkdir -p /srv/www/pdns.domain.ru/public_html
cd /srv/www/pdns.domain.ru/public_html
wget http://downloads.sourceforge.net/project/poweradmin/poweradmin-2.1.7.tgz
tar -xvzf poweradmin-2.1.7.tgz
mv poweradmin-2.1.7/* .
rm -rf poweradmin-2.1.7*

Назначаем соответствующие права на директорию:

chown -R apache:apache /srv/www/pdns.domain.ru/public_html

Переходим по ссылке https://pdns.domain.ru/installer и выполняем настройку.
Не забываем удалить папку rm -rf install/ по окончании установки.

Troubleshooting

Не работает IPv6

Если действия выполняются на виртуальной машине KVM, то на хост машине необходимо добавить строчки в файл /etc/sysctl.conf:

net.ipv6.conf.all.disable_ipv6=0
net.ipv6.conf.all.autoconf=1
net.ipv6.conf.all.accept_ra=1
net.ipv6.conf.all.accept_ra_defrtr=1
net.ipv6.conf.all.forwarding=1

Пояснение на русском конфигурационного файла pdns.conf

# Разрешить трансфер зон для подсети или ip адреса
allow-axfr-ips=0.0.0.0/0
# Разрешить рекурсивные запросы с подсети
allow-recursion=0.0.0.0/0
# Разрешить fake домены, подробности: http://doc.powerdns.com/recursion.html (п. 11.1)
allow-recursion-override=no
# Сколько секунд хранить записи в кеше PacketCache
cache-ttl=20
# После запуска делать chroot в указанную директорию
chroot=
# Директория с конфигурационными файлами
config-dir=/usr/local/etc
# Имя данной конфигурации, подробности: http://doc.powerdns.com/virtual.html
config-name=
# Консоль для отладки, подробности: http://doc.powerdns.com/pdns-on-unix.html (monitor)
control-console=no
# Демонизироваться
daemon=no
# SOA запись по умолчанию. Используется, если иное не указано в параметрах зоны.
default-soa-name=a.misconfigured.powerdns.server
# TTL по умолчанию. Используется, если иное не указано в параметрах зоны.
default-ttl=3600
# Отключить трансфер зон вообще. TCP запросы при этом остаются резрешенными.
disable-axfr=no
# Отключить TCP запросы.
disable-tcp=no
# Кол-во потоков
distributor-threads=3
# Включить поддержку IPv6
do-ipv6-additional-processing=no
# fancy-records, подробности: http://doc.powerdns.com/fancy-records.html
fancy-records=no
# Включить guardian, подробности: http://doc.powerdns.com/guardian.html
guardian=no
# Тип используемой базы данных и параметры для подключения
launch=gmysql
# Включить lazy-recursion (сначала проверять локально, только затем рекурсия), подробности: http://doc.powerdns.com/recursion.html
lazy-recursion=yes
# Загрузить дополнительные модули, подробности: http://doc.powerdns.com/modules.html
load-modules=
# Интерфейс, на котором будет слушать демон.
local-address=0.0.0.0
# IPv6 интерфейс, на котором будет слушать демон.
local-ipv6=
# Порт, на котором будет слушать демон.
local-port=53
# Расширенное логирование.
log-dns-details=
# Логировать неудачные апдейты зон.
log-failed-updates=
# Файл, куда писать лог (только для Windows систем)
logfile=pdns.log
# log-facility для логирования через syslog
logging-facility=
# loglevel Amount of logging. Higher is more. Do not set below 3
# Уровень логирования от 0 до 9 (0 – не логировать ничего, 9 – логировать всё).
loglevel=4
# Работать в качестве master сервера
master=no
# Максимальное количества запросов в очереди.
max-queue-length=5000
# Максимальное количество одновременных TCP соединений
max-tcp-connections=10
# Директория, содержащая модули
module-dir=/usr/local/lib
# Сколько секунд хранить отрицательные ответы в кеше PacketCache,
# подробности: http://doc.powerdns.com/performance-settings.html#QUERYCACHE
negquery-cache-ttl=60
# Отключить шафлинг, он же round robin. Отключать следует только для нужд тестирования.
no-shuffle=off
# Дополнительная обработка запросов. Не включать на публичных серверах,
# подробности: http://www.nabble.com/CNAME-resolution-problem-td19071640.html
out-of-zone-additional-processing=yes
# Версия протокола для обмена данными с pipe backend,
# подробности: http://doc.powerdns.com/backends-detail.html
pipebackend-abi-version=1
# Сколько секунд хранить запросы в кеше PacketCache
query-cache-ttl=20
# ip адрес для исходящих запросов
query-local-address=
# Логировать все приходящие запросы
query-logging=no
# Сколько (максимально) миллисекунд держать запрос в очереди
queue-limit=1500
# Сколько секунд хранить в кеше рекурсивные запросы
recursive-cache-ttl=10
# Если включено – рекурсивные запросы будут передваться на обработку рекурсору.
recursor=no
# Отдавать список корневых серверов (старый стиль) вместо ServFail на запрос неизвестной зоны
send-root-referral=no
# Запускать сервер от определенной группы
setgid=
# Запускать сервер от определенного пользователя
setuid=
# Отключить резолвинг CNAME
skip-cname=no
# Работать в качестве slave сервера
slave=no
# Интервал для проверки обновлений в зонах,
# подробности: http://doc.powerdns.com/generic-mypgsql-backends.html#AEN5779
slave-cycle-interval=60
# SMTP редиректор для fancy записей, подробности: http://doc.powerdns.com/fancy-records.html
smtpredirector=a.misconfigured.powerdns.smtp.server
# SOA expire по умолчанию. Используется, если иное не указано в параметрах зоны.
soa-expire-default=604800
# SOA minimum TTL по умолчанию. Используется, если иное не указано в параметрах зоны.
soa-minimum-ttl=3600
# SOA refresh по умолчанию. Используется, если иное не указано в параметрах зоны.
soa-refresh-default=10800
# SOA retry по умолчанию. Используется, если иное не указано в параметрах зоны.
soa-retry-default=3600
# Установить минимальное значение серийного номера зоны.
soa-serial-offset=0
# Директория с сокетом
socket-dir=/var/run
# Трансферить зоны в строгом соответсвии с RFC. Низкая скорость трансфера, требуется для работы с очень старыми клиентами
strict-rfc-axfrs=no
# Адрес notification proxy сервера, подробности: http://doc.powerdns.com/tools.html#NPROXY
trusted-notification-proxy=
# URL редиректор для fancy записей, подробности: http://doc.powerdns.com/fancy-records.html
urlredirector=127.0.0.1
# Логировать в лог файл, указанный в директиве logfile (только для Windows систем)
use-logfile=no
# Сообщать версию сервера клиентам (full – сообщать полную версию, anonymous – не сообщать, powerdns – сообщать “served by PowerDNS” без указания версии, custom – свой вариант)
version-string=full
# Включить встроенный вебсервер, подробности: http://doc.powerdns.com/monitoring.html
webserver=no
# IP адрес на котором будет слушать встроенный вебсервер
webserver-address=127.0.0.1
# Пароль для доступа к вебсерверу
webserver-password=
# Порт на котором будет слушать встроенный вебсервер
webserver-port=8081
# Показывать дополнительную информацию в мониторинге
webserver-print-arguments=no
# Включить wildcard для URL и MBOXFW записей
wildcard-url=no
# Включить wildcard
wildcards=
Поделиться Комментарии