Cache dns

Материал из pNp Wiki
Перейти к: навигация, поиск

Развертывание кэширующего сервера DNS

В RHEL7.X стала возможным установка и использование двух рекурсивных кэширующих серверов на выбор - либо bind, либо unbound.

Предварительные требования

  • Виртуальная машина с двумя сетевыми интерфейсами
  • Установленные пакеты: bash-completion, bind, bind-utils

Bind

Установка

На виртуальной машине vm-01 установим пакет:

[root@vm-01 ~]# yum install -y bind

Далее, следует включить сервис в автозагрузку:

[root@vm-01 ~]# systemctl enable named.service 
Created symlink from /etc/systemd/system/multi-user.target.wants/named.service to /usr/lib/systemd/system/named.service.
[root@vm-01 ~]#

Настройка

Конфигурационный файл по-умолчанию, практически готов к использованию. Сервер будет работать, как рекурсивный, однако следует запретить запросы из всех сетей, кроме нужной 192.168.1.0/24, плюс указать серверы, которые будут являтся вышестоящими источниками для нашего рекурсивного сервера.

[root@vm-01 ~]# cat /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).
//
// See /usr/share/doc/bind*/sample/ for example named configuration files.
//
// See the BIND Administrator's Reference Manual (ARM) for details about the
// configuration located in /usr/share/doc/bind-{version}/Bv9ARM.html

acl net { 192.168.1.0/24; };

options {
	listen-on port 53 { 127.0.0.1; net; };
	//listen-on-v6 port 53 { ::1; };
	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     { localhost; net; };
	allow-query-on	{ 192.168.1.1/24; };

	/* 
	 - If you are building an AUTHORITATIVE DNS server, do NOT enable recursion.
	 - If you are building a RECURSIVE (caching) DNS server, you need to enable 
	   recursion. 
	 - If your recursive DNS server has a public IP address, you MUST enable access 
	   control to limit queries to your legitimate users. Failing to do so will
	   cause your server to become part of large scale DNS amplification 
	   attacks. Implementing BCP38 within your network would greatly
	   reduce such attack surface 
	*/
	recursion yes;

	allow-recursion { 127.0.0.1; net; };
	allow-recursion-on { 192.168.1.1/24; };

	forwarders { 8.8.8.8; 8.8.4.4; };
	forward only;

	dnssec-enable yes;
	dnssec-validation yes;

	/* 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";
};

logging {
        channel default_debug {
                file "data/named.run";
                severity dynamic;
        };
};

zone "." IN {
	type hint;
	file "named.ca";
};

include "/etc/named.rfc1912.zones";
include "/etc/named.root.key";

После окончания редактирования файла, следует проверить синтиксис конфигурационного файла, на ошибки утилитой named-checkconf. Ключ -z указывает, что необходимо выполнить тестовую загрузку всех мастер зон, найденных в файле named.conf:

[root@vm-01 ~]# named-checkconf -z /etc/named.conf
zone localhost.localdomain/IN: loaded serial 0
zone localhost/IN: loaded serial 0
zone 1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa/IN: loaded serial 0
zone 1.0.0.127.in-addr.arpa/IN: loaded serial 0
zone 0.in-addr.arpa/IN: loaded serial 0
[root@vm-01 ~]#

Прежде, чем запустить сервис, следует внести опцию -4 в файл /etc/sysconfig/named для того, что бы named работал только по ipv4:

# BIND named process options
# ~~~~~~~~~~~~~~~~~~~~~~~~~~
#
# OPTIONS="whatever"     --  These additional options will be passed to named
#                            at startup. Don't add -t here, enable proper
#                            -chroot.service unit file.
#
# DISABLE_ZONE_CHECKING  --  By default, service file calls named-checkzone
#                            utility for every zone to ensure all zones are
#                            valid before named starts. If you set this option
#                            to 'yes' then service file doesn't perform those
#                            checks.

OPTIONS="-4"

Запуск

Запускаем сервис:

[root@vm-01 ~]# systemctl start named
[root@vm-01 ~]# systemctl status named
● named.service - Berkeley Internet Name Domain (DNS)
   Loaded: loaded (/usr/lib/systemd/system/named.service; enabled; vendor preset: disabled)
   Active: active (running) since Tue 2017-12-12 14:45:52 MSK; 4s ago
  Process: 3200 ExecStart=/usr/sbin/named -u named $OPTIONS (code=exited, status=0/SUCCESS)
  Process: 3197 ExecStartPre=/bin/bash -c if [ ! "$DISABLE_ZONE_CHECKING" == "yes" ]; then /usr/sbin/named-checkconf -z /etc/named.conf; else echo "Checking of zone files is disabled"; fi (code=exited, status=0/SUCCESS)
 Main PID: 3203 (named)
   CGroup: /system.slice/named.service
           └─3203 /usr/sbin/named -u named -4

Dec 12 14:45:52 vm-01 named[3203]: managed-keys-zone: loaded serial 0
Dec 12 14:45:52 vm-01 named[3203]: zone 0.in-addr.arpa/IN: loaded serial 0
Dec 12 14:45:52 vm-01 named[3203]: zone localhost.localdomain/IN: loaded serial 0
Dec 12 14:45:52 vm-01 named[3203]: zone localhost/IN: loaded serial 0
Dec 12 14:45:52 vm-01 named[3203]: zone 1.0.0.127.in-addr.arpa/IN: loaded serial 0
Dec 12 14:45:52 vm-01 named[3203]: zone 1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa/IN: loaded serial 0
Dec 12 14:45:52 vm-01 named[3203]: all zones loaded
Dec 12 14:45:52 vm-01 named[3203]: running
Dec 12 14:45:52 vm-01 systemd[1]: Started Berkeley Internet Name Domain (DNS).
Dec 12 14:45:52 vm-01 named[3203]: managed-keys-zone: Initializing automatic trust anchor management for zone '.'; DNSKEY ID 20326 is now trusted, waiving the normal 30-day waiting period.
[root@vm-01 ~]#

Посмотрим, на каких интерфейсах и каких портах named принимает соединения:

[root@vm-01 ~]# ss -tulpn | grep "53"
udp    UNCONN     0      0      192.168.1.1:53                    *:*                   users:(("named",pid=3342,fd=515),("named",pid=3342,fd=514))
udp    UNCONN     0      0      127.0.0.1:53                    *:*                   users:(("named",pid=3342,fd=513),("named",pid=3342,fd=512))
tcp    LISTEN     0      10     192.168.1.1:53                    *:*                   users:(("named",pid=3342,fd=22))
tcp    LISTEN     0      10     127.0.0.1:53                    *:*                   users:(("named",pid=3342,fd=21))
tcp    LISTEN     0      128    127.0.0.1:953                   *:*                   users:(("named",pid=3342,fd=23))
[root@vm-01 ~]#

Добавляем разрешение в файрволе:

[root@vm-01 ~]# firewall-cmd --add-service=dns --permanent 
success
[root@vm-01 ~]# firewall-cmd --reload 
success
[root@vm-01 ~]# firewall-cmd --list-services 
dhcpv6-client ssh dns
[root@vm-01 ~]#

Проверка

На сервере vm-02 установим пакет bind-utils

[root@vm-02 ~]# yum install -y bind-utils

Изменим настройки интерфейса ens10, указав DNS:

[root@vm-02 ~]# ip -4 addr show dev ens10
3: ens10: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    inet 192.168.1.2/24 brd 192.168.1.255 scope global ens10
       valid_lft forever preferred_lft forever
[root@vm-02 ~]# nmcli connection modify ens10 +ipv4.dns 192.168.1.1
[root@vm-02 ~]# nmcli connection show ens10 | grep dns
ipv4.dns:                               192.168.1.1
ipv4.dns-search:                        
ipv4.ignore-auto-dns:                   no
ipv6.dns:                               
ipv6.dns-search:                        
ipv6.ignore-auto-dns:                   no
[root@vm-02 ~]#

У первого интерефейса убираем DNS из настроек через nmcli:

[root@vm-02 ~]# nmcli connection modify ens3 ipv4.dns ""
[root@vm-02 ~]# nmcli connection show ens3 | grep dns
ipv4.dns:                               
ipv4.dns-search:                        
ipv4.ignore-auto-dns:                   no
ipv6.dns:                               
ipv6.dns-search:                        
ipv6.ignore-auto-dns:                   no
[root@vm-02 ~]#

Выключаем и включаем интерфейс ens10:

[root@vm-02 ~]# nmcli connection down ens10
[root@vm-02 ~]# nmcli connection up ens10

После вышеуказанных манипуляций с интерфейсами, файл /etc/resolv.conf будет иметь следующий вид:

[root@vm-02 ~]# cat /etc/resolv.conf
# Generated by NetworkManager
nameserver 192.168.122.1
nameserver 192.168.1.1
[root@vm-02 ~]#

Убираем строку nameserver 192.168.122.1 и проверяем:

[root@vm-02 ~]# dig @192.168.1.1 A opennet.ru

; <<>> DiG 9.9.4-RedHat-9.9.4-14.el7 <<>> @192.168.1.1 A opennet.ru
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 44748
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;opennet.ru.			IN	A

;; ANSWER SECTION:
opennet.ru.		1757	IN	A	94.142.141.14

;; Query time: 18 msec
;; SERVER: 192.168.1.1#53(192.168.1.1)
;; WHEN: Tue Dec 12 17:24:18 MSK 2017
;; MSG SIZE  rcvd: 55

[root@vm-02 ~]# dig @192.168.1.1 A imdb.com

; <<>> DiG 9.9.4-RedHat-9.9.4-14.el7 <<>> @192.168.1.1 A imdb.com
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 18343
;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;imdb.com.			IN	A

;; ANSWER SECTION:
imdb.com.		377	IN	A	207.171.166.22
imdb.com.		377	IN	A	72.21.210.29
imdb.com.		377	IN	A	72.21.206.80

;; Query time: 42 msec
;; SERVER: 192.168.1.1#53(192.168.1.1)
;; WHEN: Tue Dec 12 17:26:17 MSK 2017
;; MSG SIZE  rcvd: 85

[root@vm-02 ~]#

Unbound

Установка

Unbound может быть только кэширующим сервером. Устанавливаем его:

[root@vm-01 ~]# yum install -y unbound

Далее, включаем его при запуске:

[root@vm-01 ~]# systemctl enable unbound
Created symlink from /etc/systemd/system/multi-user.target.wants/unbound.service to /usr/lib/systemd/system/unbound.service.
[root@vm-01 ~]#

Настройка

Далее, лучше запустить утилиту unbound-control-setup, дабы избежать потенциальных ошибок об отсутствии ключей у сервера:

[root@vm-01 etc]# unbound-control-setup 
setup in directory /etc/unbound
unbound_server.key exists
unbound_control.key exists
create unbound_server.pem (self signed certificate)
create unbound_control.pem (signed client certificate)
Signature ok
subject=/CN=unbound-control
Getting CA Private Key
Setup success. Certificates created. Enable in unbound.conf file to use
[root@vm-01 etc]#

Конфигурационный файл /etc/unbound/unbound.conf довольно обширен, однако, нас интересуют следующие опции:
interface: 192.168.1.1 - на каком адресе будем слушать порт (по-умолчанию 53)
access-control: 192.168.1.0/24 allow_snoop - с какой сети будут разрешены рекурсивные и не рекурсивные запросы. И опция перенаправляющая все запросы к вышестоящему DNS серверу. В нашем случае, к dns серверу google:

forward-zone:
        name: "."
        forward-addr: 8.8.8.8

Далее, следует проверить на ошибки файл /etc/unbound/unbound.conf:

[root@vm-01 ~]# unbound-checkconf /etc/unbound/unbound.conf 
unbound-checkconf: no errors in /etc/unbound/unbound.conf
[root@vm-01 ~]#

Запуск

Запускаем unbound и проверяем, слушает ли он порт 53:

[root@vm-01 ~]# systemctl start unbound
[root@vm-01 ~]# systemctl is-active unbound
active
[root@vm-01 ~]# ss -tulpan | grep unbound
udp    UNCONN     0      0      192.168.1.1:53                    *:*                   users:(("unbound",pid=24541,fd=3))
tcp    LISTEN     0      5      192.168.1.1:53                    *:*                   users:(("unbound",pid=24541,fd=4))
tcp    LISTEN     0      5      127.0.0.1:8953                  *:*                   users:(("unbound",pid=24541,fd=6))
tcp    LISTEN     0      5       ::1:8953                 :::*                   users:(("unbound",pid=24541,fd=5))
[root@vm-01 ~]#

Добавляем разрешающее правило в файрволле:

[root@vm-01 ~]# firewall-cmd --add-service=dns --permanent 
success
[root@vm-01 ~]# firewall-cmd --reload 
success
[root@vm-01 ~]# firewall-cmd --list-services 
dhcpv6-client ssh dns
[root@vm-01 ~]#

Проверка

На сервере vm-02 установим пакет bind-utils

[root@vm-02 ~]# yum install -y bind-utils

Изменим настройки интерфейса ens10, указав DNS:

[root@vm-02 ~]# ip -4 addr show dev ens10
3: ens10: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    inet 192.168.1.2/24 brd 192.168.1.255 scope global ens10
       valid_lft forever preferred_lft forever
[root@vm-02 ~]# nmcli connection modify ens10 +ipv4.dns 192.168.1.1
[root@vm-02 ~]# nmcli connection show ens10 | grep dns
ipv4.dns:                               192.168.1.1
ipv4.dns-search:                        
ipv4.ignore-auto-dns:                   no
ipv6.dns:                               
ipv6.dns-search:                        
ipv6.ignore-auto-dns:                   no
[root@vm-02 ~]#

У первого интерефейса убираем DNS из настроек через nmcli:

[root@vm-02 ~]# nmcli connection modify ens3 ipv4.dns ""
[root@vm-02 ~]# nmcli connection show ens3 | grep dns
ipv4.dns:                               
ipv4.dns-search:                        
ipv4.ignore-auto-dns:                   no
ipv6.dns:                               
ipv6.dns-search:                        
ipv6.ignore-auto-dns:                   no
[root@vm-02 ~]#

Выключаем и включаем интерфейс ens10:

[root@vm-02 ~]# nmcli connection down ens10
[root@vm-02 ~]# nmcli connection up ens10

После вышеуказанных манипуляций с интерфейсами, файл /etc/resolv.conf будет иметь следующий вид:

[root@vm-02 ~]# cat /etc/resolv.conf
# Generated by NetworkManager
nameserver 192.168.122.1
nameserver 192.168.1.1
[root@vm-02 ~]#

Убираем строку nameserver 192.168.122.1 и проверяем:

[root@vm-02 ~]# dig @192.168.1.1 A opennet.ru

; <<>> DiG 9.9.4-RedHat-9.9.4-14.el7 <<>> @192.168.1.1 A opennet.ru
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 44748
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;opennet.ru.			IN	A

;; ANSWER SECTION:
opennet.ru.		1757	IN	A	94.142.141.14

;; Query time: 18 msec
;; SERVER: 192.168.1.1#53(192.168.1.1)
;; WHEN: Tue Dec 12 17:24:18 MSK 2017
;; MSG SIZE  rcvd: 55

[root@vm-02 ~]# dig @192.168.1.1 A imdb.com

; <<>> DiG 9.9.4-RedHat-9.9.4-14.el7 <<>> @192.168.1.1 A imdb.com
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 18343
;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;imdb.com.			IN	A

;; ANSWER SECTION:
imdb.com.		377	IN	A	207.171.166.22
imdb.com.		377	IN	A	72.21.210.29
imdb.com.		377	IN	A	72.21.206.80

;; Query time: 42 msec
;; SERVER: 192.168.1.1#53(192.168.1.1)
;; WHEN: Tue Dec 12 17:26:17 MSK 2017
;; MSG SIZE  rcvd: 85

[root@vm-02 ~]#

Теперь поглядим на состояние кэша DNS:

[root@vm-01 ~]# unbound-control dump_cache | egrep "(opennet|imdb)"
opennet.ru.	2758	IN	A	94.142.141.14
imdb.com.	64	IN	A	207.171.166.22
imdb.com.	64	IN	A	72.21.206.80
imdb.com.	64	IN	A	72.21.210.29
msg opennet.ru. IN A 33152 1 2758 3 1 0 0
opennet.ru. IN A 0
msg imdb.com. IN A 33152 1 64 3 1 0 0
imdb.com. IN A 0
msg imdb.com. IN DS 33152 1 381 0 0 3 0
msg opennet.ru. IN DS 33152 1 758 0 0 3 0
[root@vm-01 ~]#