DNS (англ. Domain Name System — система доменных имён) — компьютерная распределённая система для получения информации о доменах. Чаще всего используется для получения IP-адреса по имени хоста (компьютера или устройства), получения информации о маршрутизации почты, обслуживающих узлах для протоколов в домене (SRV-запись).
Распределённая база данных DNS поддерживается с помощью иерархии DNS-серверов, взаимодействующих по определённому протоколу.
В рамках нашей лаборатории воспроизведем стандартную ситуацию небольшого офиса, когда возникает необходимость настроить внутреннюю локальную сеть и предоставить доступ к узлам сети Internet.
Начнем установку сервера имен с актуализации операционной системы, а проще говоря, с процедуры ее обновления.
[root@dns-01 ~]# yum update -y
Для проведения всех действий у меня используется минимальная версия CentOS 7, поэтому доустановим необходимые пакеты со всеми зависимостями.
[root@dns-01 ~]# yum install bind-chroot bind-utils -y
Выполним скрипт первоначальной настройки сервера. Отключим стандартный сервис BIND, а вместо него включим BIND в изолированном окружении.
[root@dns-01 ~]#/usr/libexec/setup-named-chroot.sh /var/named/chroot on
[root@dns-01 ~]#systemctl stop named; systemctl disable named
[root@dns-01 ~]#systemctl start named-chroot; systemctl enable named-chroot
Created symlink from /etc/systemd/system/multi-user.target.wants/named-chroot.service to /usr/lib/systemd/system/named-chroot.service.
Посмотрим настройки сервера. По возможности приведены русскоязычные комментарии. Блоки выделенные жирным шрифтом добавлены в конфигурационный файл созданный по умолчанию.
[root@dns-01 log]# vi /var/named/chroot/etc/named.conf
//
// named.conf
//
// Provided by Red Hat bind package to configure the ISC BIND named(8) DNS
// server as a caching only nameserver (as a localhost DNS resolver only).
//
// Примеры конфигурационных файлов расположены /usr/share/doc/bind*/sample/.
//
// Более подробно смотрите BIND Administrator's Reference Manual (ARM)
// в /usr/share/doc/bind-{version}/Bv9ARM.html
// Перечни узлов, сетей, используемые для разрешения/запрещения доступа к серверу/с сервера к внешним узлам
acl myclients {
127.0.0.0/8;
172.16.0.0/16;
localnets;
localhost;
};
options {
// Заблокировать отображение информации о версии сервера
version none;
//Прослушивать IPv4 dns-запросы на всех интерфейсах
listen-on port 53 { any; };
//Запретить прослушивание IPv6 dns-запросов на всех интерфейсах
listen-on-v6 port 53 { none; };
//Расположение файлов сервера относительно изолированного окружения
directory "/var/named";
dump-file "/var/named/data/cache_dump.db";
statistics-file "/var/named/data/named_stats.txt";
memstatistics-file "/var/named/data/named_mem_stats.txt";
//Разрешить запросы с указанных узлов
allow-query { myclients; };
//Разрешить сохранять в кеше результаты запросов с указанных узлов
allow-query-cache { myclients; };
//Разрешить пересылку запросов на вышестоящие сервера имен и итерацию для указанных узлов
allow-recursion { myclients; };
/*
- При настройке авторитарного сервера имен не настраивайте рекурсию.
- При настройке рекурсивного (кеширующего ) сервера имен необходимо разрешить рекурсию
- Если Ваш рекурсивный сервер имен имеет внешний IP-адрес, Вам в обязательном порядке
нужно настроить ограничения на подключение к Вашему серверу. В противном случае Ваш сервер
может стать участником ботнета.
*/
//Разрешить пересылку запросов на внешние вышестоящие сервера
recursion yes;
//Сервера пересылки
forwarders { 8.8.8.8; 8.8.4.4; };
// Возвращать DNSSEC-записи по запросу или всегда. no - только по запросу.
dnssec-enable yes;
//Использовать для проверки подписи корневой зона ключа по умолчанию.
dnssec-validation auto;
/* Path to ISC DLV key */
bindkeys-file "/etc/named.iscdlv.key";
managed-keys-directory "/var/named/dynamic";
pid-file "/run/named/named.pid";
session-keyfile "/run/named/session.key";
//Сохранять запросы клиентов в журнале
querylog yes;
};
zone "." IN {
type hint;
file "named.ca";
};
include "/etc/named.rfc1912.zones";
include "/etc/named.root.key";
Секция журналирования из стандартного файла конфигурации нам не нужна и поэтому удалим ее. Вместо нее создадим свою конфигурацию журналирования в помощью скрипта. Сначала создадим каталог для хранения журналов, а затем для каждого типа событий создадим отдельный журнал внутри.
[root@dns-01 ~]# mkdir -p /var/named/chroot/var/log/named
[root@dns-01 ~]# cat <<<'#!/bin/bash
ROOTDIR=/var/named/chroot
CONF=$ROOTDIR/etc/named.conf
cp $CONF $CONF.bak.original
CH=(client config database default delegation-only dispatch dnssec edns-disabled general lame-servers network notify queries query-errors rate-limit resolver rpz security unmatched update update-security xfer-in xfer-out)
echo "logging {" >> $CONF
echo "" >> $CONF
linesno=${#CH[@]} >> $CONF
for ((i=0; i < $linesno; i++)); do
echo " channel ${CH[$i]} {" >> $CONF
echo " file \"$ROOTDIR/var/log/named/${CH[$i]}.log\" versions 5 size 1m;" >> $CONF
echo " severity dynamic;" >> $CONF
echo " print-time yes;" >> $CONF
echo " print-severity yes;" >> $CONF
echo " print-category yes;" >> $CONF
echo " };" >> $CONF
echo "" >> $CONF
touch $ROOTDIR/var/log/named/${CH[$i]}.log
done
echo "" >> $CONF
echo "" >> $CONF
linesno=${#CH[@]}
for ((i=0; i < $linesno; i++)); do
echo " category ${CH[$i]} { ${CH[$i]}; };" >> $CONF
done
echo "};" >> $CONF
cp $CONF $CONF.bak.`date +%Y%m%d%H%M%S`
' > ./logsect.sh
[root@dns-01 ~]# chmod o+x ./logsect.sh
[root@dns-01 ~]# ./logsect.sh
Далее настроим владельцев файлов и каталогов, уровни доступа и зададим контексты для политики SELinux.
[root@dns-01 ~]# mkdir -p /var/named/chroot/var/named/master
[root@dns-01 ~]# chown -R root:named /var/named/chroot
[root@dns-01 ~]# chown -R named:named /var/named/chroot/run
[root@dns-01 ~]# find /var/named/chroot -type d -exec chmod 0770 {} \;
[root@dns-01 ~]# find /var/named/chroot -type f -exec chmod 0660 {} \;
[root@dns-01 ~]# chmod 0640 /var/named/chroot/var/named/named.*
[root@dns-01 ~]# find /var/named/chroot/etc/ -type f -exec chmod 0640 {} \;
[root@dns-01 ~]# restorecon -R /var/named/chroot
Проверим конфигурационный файл на наличие ошибок и остановим на время сервис named-chroot.
[root@dns-01 ~]# named-checkconf -t /var/named/chroot/ /etc/named.conf
[root@dns-01 ~]# systemctl stop named-chroot; systemctl status -l named-chroot
Настроим инструменты управления сервером. Для этого нам нужно пересоздать ключ аутентификации и добавить информацию об этом ключе в конфигурацию. Убедимся в отсутствии ошибок при внесении изменений в конфигурацию. После чего можно запустить сервис и проверить на наличие ошибок при запуске. Для выхода из журнала нажмите "q".
[root@dns-01 ~]# rndc-confgen -a -b 512 -r /dev/urandom -t /var/named/chroot
[root@dns-01 ~]# lineid=$(grep -nE "^include" /etc/named.conf | tail -n 1 | awk 'BEGIN {FS=":"}{print $1}')
[root@dns-01 ~]# sed -i "$lineid a\include \"/etc/rndc.key\";" /etc/named.conf
[root@dns-01 ~]# named-checkconf -t /var/named/chroot/ /etc/named.conf
[root@dns-01 ~]# chmod 0640 /var/named/chroot/etc/rndc.key
[root@dns-01 ~]# chown root:named /var/named/chroot/etc/rndc.key
[root@dns-01 ~]# restorecon -vR /var/named/chroot/etc/
[root@dns-01 ~]# systemctl start named-chroot; systemctl status -l named-chroot; journalctl -xe
Проверим работу нашего сервера, убедившись что работает именно он, а не ранее использовавшийся dns-сервер. Укажем установленный сервер имен в качестве основного для системы.
[root@dns-01 ~]# if [ $(grep -E "^DNS1" /etc/sysconfig/network-scripts/ifcfg-eth0 | wc -l) -gt 0 ]; then sed -i -r "s/^(DNS1=).*/\1127.0.0.1/" /etc/sysconfig/network-scripts/ifcfg-eth0; else echo DNS1=127.0.0.1 >> /etc/sysconfig/network-scripts/ifcfg-eth0; fi;
[root@dns-01 ~]# systemctl restart network
[root@dns-01 ~]# cat /etc/hosts
# Generated by NetworkManager search lab.akonchenkov.com nameserver 127.0.0.1
[root@dns-01 ~]# dig A ya.ru @127.0.0.1 ; <<>> DiG 9.9.4-RedHat-9.9.4-38.el7_3.1 <<>> A ya.ru @127.0.0.1 ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 741 ;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 5, ADDITIONAL: 11
;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 4096 ;; QUESTION SECTION: ;ya.ru. IN A ;; ANSWER SECTION: ya.ru. 3586 IN A 93.158.134.3 ya.ru. 3586 IN A 213.180.193.3 ya.ru. 3586 IN A 213.180.204.3 ;; AUTHORITY SECTION: ru. 118506 IN NS b.dns.ripn.net. ru. 118506 IN NS f.dns.ripn.net. ru. 118506 IN NS d.dns.ripn.net. ru. 118506 IN NS e.dns.ripn.net. ru. 118506 IN NS a.dns.ripn.net. ;; ADDITIONAL SECTION: d.dns.ripn.net. 28326 IN A 194.190.124.17 d.dns.ripn.net. 45120 IN AAAA 2001:678:18:0:194:190:124:17 a.dns.ripn.net. 13750 IN A 193.232.128.6 a.dns.ripn.net. 32706 IN AAAA 2001:678:17:0:193:232:128:6 b.dns.ripn.net. 65996 IN A 194.85.252.62 b.dns.ripn.net. 4445 IN AAAA 2001:678:16:0:194:85:252:62 e.dns.ripn.net. 54415 IN A 193.232.142.17 e.dns.ripn.net. 19444 IN AAAA 2001:678:15:0:193:232:142:17 f.dns.ripn.net. 17781 IN A 193.232.156.17 f.dns.ripn.net. 23279 IN AAAA 2001:678:14:0:193:232:156:17 ;; Query time: 3 msec ;; SERVER: 127.0.0.1#53(127.0.0.1) ;; WHEN: Thu Jan 19 12:49:08 +10 2017 ;; MSG SIZE rcvd: 394
Создадим правило межсетевого экрана разрешающее доступ к нашему серверу имен с других узлов.
[root@dns-01 ~]# firewall-cmd --zone=public --add-service=dns --permanent
[root@dns-01 ~]# firewall-cmd --reload
Преобразование внешних имен пересылкой запросов ко внешним серверам имен и итерацией настроено. Теперь настроим преобразование имен внутренних узлов. Для этого нам потребуется создать файл области пространства имен и добавить информацию о нем в конфигурацию сервера.
[root@dns-01 ~]# vi /var/named/chroot/var/named/master/lab.akonchenkov.com.zone
$TTL 86400 ; 24 можно указать как 24h или 1d.
;$TTL используется для всех ресурсных записей (RRs), у которых явно не задан параметр Time-to-Live (TTL)
@ IN SOA dns-01.lab.akonchenkov.com. root.lab.akonchenkov.com. (
2017011701 ;Serial ВАЖНО !!! серийный номер должен меняться в большую строну при каждом изменении, иначе slave сервера не обновят данные
3600 ;Refresh. Можно указать 1h.
;Время (в секундах) ожидания вторичного DNS перед запросом SOA-записи с первичного. По истечении данного времени,
;вторичный DNS обращается к первичному, для получения копии текущей SOA-записи.
;Вторичный DNS-сервер сравнивает полученный серийный номер зоны с имеющимся.
;Если они отличаются, то осуществляется запрос к первичному DNS-серверу на трансфер зоны.
1800 ;Retry
;Время в секундах, вступает в действие тогда, когда первичный DNS-сервер недоступен. Интервал времени,
;по истечении которого вторичный DNS должен повторить попытку синхронизировать описание зоны с первичным.
604800 ;Expire
;Время в секундах, после которого вторичный сервер (slave) должен прекратить обслуживание запросов к зоне,
;если он не смог в течение этого времени верифицировать описание зоны, используя информацию с первичного сервера (master-а).
86400 ;Minimum TTL
;Время в секундах, время негативного кеширования (negative caching), т.е. время кеширования ответов, которые утверждают,
;что установить соответствие между доменным именем и IP-адресом нельзя.
)
; Указываем сервера пространства имен lab.akonchenkov.com, почтовый релей, сервисные записи.
IN NS dns-01.lab.akonchenkov.com.
IN NS dns-02.lab.akonchenkov.com.
IN MX 10 mail.akonchenkov.com. ; Почтовый релей
_ldap._tcp.lab.akonchenkov.com. SRV 0 0 389 dc-01.lab.akonchenkov.com. ;LDAP-сервис
_imap._tcp.lab.akonchenkov.com. SRV 0 0 143 imap.akonchenkov.com. ;IMAP-сервис
_sip._udp.lab.akonchenkov.com. SRV 0 0 6201 sip.lab.akonchenkov.com. ;SIP-сервис
; Определяем IP адреса name серверов
dns-01 IN A 172.16.0.6
dns-02 IN A 172.16.0.7
; Указываем нужные на A, AAAA, CNAME, SRV, TXT и другие типы записей
dhcp-01 IN A 172.16.0.8
dhcp-02 IN A 172.16.0.9
repo IN A 172.16.0.5
netinstall IN A 172.16.0.4
dc-01 IN A 172.16.0.3
dc-02 IN A 172.16.0.2
router IN A 172.16.0.1
router IN A 192.168.15.130
svr-001 IN A 192.168.15.131
IN A 192.168.15.132
IN A 192.168.15.133
sip IN A 192.168.15.131
ftp IN CNAME svr-001.lab.akonchenkov.com
Установим необходимые разрешения на доступ.
[root@dns-01 ~]# cd /var/named/chroot/var/named; chmod -R 0770 ./master; chown root:named ./master; chmod 0660 ./master/*; restorecon -R ./master; cd ~/
Проверим полученный файл области пространства имен на валидность, и в случае отсутствия ошибок добавим его в конфигурацию нашего сервера имен и перечитаем конфигурацию named-chroot.
[root@dns-01 ~]# named-checkzone -t /var/named/chroot/ lab.akonchenkov.com /var/named/master/lab.akonchenkov.com.zone
[root@dns-01 ~]# cat <<<'
zone "lab.akonchenkov.com" IN { type master; file "master/lab.akonchenkov.com.zone"; allow-update { none; }; };'>> /var/named/chroot/etc/named.conf
[root@dns-01 ~]# rndc reload
server reload successful [root@dns-01 ~]# ping netinstall.lab.akonchenkov.com PING netinstall.lab.akonchenkov.com (172.16.0.4) 56(84) bytes of data. From dns-01.lab.akonchenkov.com (172.16.0.6) icmp_seq=1 Destination Host Unreachable From dns-01.lab.akonchenkov.com (172.16.0.6) icmp_seq=2 Destination Host Unreachable From dns-01.lab.akonchenkov.com (172.16.0.6) icmp_seq=3 Destination Host Unreachable From dns-01.lab.akonchenkov.com (172.16.0.6) icmp_seq=4 Destination Host Unreachable ^C --- netinstall.lab.akonchenkov.com ping statistics --- 7 packets transmitted, 0 received, +4 errors, 100% packet loss, time 6001ms pipe 4
Вот мы и настроили службы доменных имен на базе BIND 9.9 на CentOS 7 работающую в изолированной среде и преобразующую имена внутренних и внешних узлов в IP-адреса.