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

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

Roman Bogachev VMware Specialist | Drone Pilot | Traveler

Установка и настройка авторитаторного сервера 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

1
2
3
4
sudo yum install ntp ntpdate
sudo ntpdate ntp2.stratum2.ru
sudo systemctl enable ntpd.service
sudo systemctl start ntpd.service

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

1
2
3
4
5
6
7
8
9
10
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

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

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

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

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

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

Установка PDNS

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

1
mysql -uroot -p

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

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
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

1
yum install pdns-backend-mysql pdns pdns-tools

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
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

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

1
2
systemctl enable pdns.service
systemctl start pdns.service

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
[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.

1
2
3
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

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

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

Заменим:

1
listen = 127.0.0.1:9000

На:

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

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

1
2
mkdir /var/lib/php/session
chown apache:apache /var/lib/php/session
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
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 и добавляем в автозагрузку.

1
2
systemctl start nginx.service
systemctl enable nginx.service

Установим PowerAdmin:

1
2
3
4
5
6
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*

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

1
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:

1
2
3
4
5
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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
# Разрешить трансфер зон для подсети или 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=