Blue Flower

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-адреса.