Кеширующий DNS сервер UnboundПодписка на Комментарии к "Кеширующий DNS сервер Unbound"

Аватар zenon

Unbound - это кеширующий DNS сервер который обслуживает исключительно рекурсивные запросы. Во время работы сервера кеш целиком распологается в памяти, а его размер ограничен указанным объемом. Unbound поддерживает расширения DNSSEC и может работать как "validator". В качестве плюсов Unbound по сравнению с BIND надо отметить все те же скромные размеры и скорость.

Официальный сайт.
Полная документация unbound.conf тут.

Описание (отсюда)
При проведении разрешения имен которых еще нет в кеше сервера, а значит при необходимости обращаться к внешним авторитарным DNS серверам, Unbound отсылает исходящие запросы используя множество UDP портов из разрешенного диапазона. Это сделано для обеспечения дополнительной безопасности чтобы было труднее угадать с какого порта был отправлен запрос и затруднить возможность атак с целью отравления записей в кеше. Позже, в примере файла конфигурации это будет отражено - опция outgoing-range: 512 указывает, сколько UDP портов для этой цели разрешено использовать одному потоку (thread) сервера.

Каждый открытый сервером UDP или TCP порт, потребляет один файловый дескриптор. Серверу Unbound необходимо иметь возможность работать со всеми открытыми дескрипторами. Сам Unbound содержит в себе некий builtinmini-event обработчик, который и используется для этого. Встроенный обработчик способен обслуживать максимум 1024 открытых файловый дескрипторов на один процесс сервера.

Предлагаемая по умолчанию опция конфигурации THREADS указывает, что необходимо скомпилировать Unbound с поддержкой потоков. При этой конфигурации запускается один материнский процесс у которого рождаются подпроцессы-потомки. Плюс данной конфигурации в том, что все дочерние потоки имеют возможность использовать общий кеш материнского процесса - снижаются требования к памяти выделяемой серверу Unbound.

Если же отказаться от опции THREADS, то сервер будет собран без потоков (фактически с одним потоком на процесс) и будет происходить форканье процессов, что есть практически параллельный запуск нового сервера со своим собственным кешем. Минус такого подхода - это увеличение требований к памяти. Плюс этого метода работы - увеличение скорости на 10-20 %.

Таким образом, если наш сервер будет собран с поддержкой потоков THREADS, и мы захотим использовать восемь потоков (опция конфигурации num-threads: 8), то при установленных outgoing-range: 512, в сумме это даст 512*8=4096 одновременно открытых файловых дескрипторов, что превышает возможности встроенного обработчика. Unbound не захочет стартовать и выведет сообщение об ошибке. Проблема. (Кривое решение проблемы - это снизить значение outgoing-range, но делать этого не стоит так как это уменьшает секюрность). Для правильного решения этой проблемы, разработчики Unbound предлагают использовать специальные сторонние обработчики, такие как например libevent или libev. Выбор опции LIBEVENT приведет к установке дополнительного порта libevent 1.4.8 и линковке с ним Unbound.

Если же мы откажемся от использования потоков и соберем Unbound без THREADS, и без ненужного теперь LIBEVENT, то при использовании той же опции конфигурации num-threads: 8, мы получим восемь процессов Unbound каждый из которых будет иметь свой кеш и использовать только 512 файловых дескрипторов управляемых встроенным обработчиком.

Установка:
Gentoo, смотрим что есть на данный момент

$ eix unbound
*   net-dns/unbound
     Available versions:  1.4.10 1.4.13_p2 (~)1.4.14 {debug gost python static-libs test threads}
     Installed versions:  1.4.14(00:51:10 26.01.2012)(python -debug -gost -static-libs -test -threads)
     Homepage:            http://unbound.net/
     Description:         A validating, recursive and caching DNS resolver

Ставим:
$ emerge -av unbound

Debian.
$ aptitude search unbound
p   libunbound-dev    - static library, header files, and docs for libunbound                                    
p   libunbound2       - library implementing DNS resolution and validation                                      
p   python-unbound    - library implementing DNS resolution and validation (Python bindings)
p   unbound           - validating, recursive, caching DNS resolver                                              
p   unbound-anchor    - utility to securely fetch the root DNS trust anchor                                      
p   unbound-host      - reimplementation of the 'host' command        

Установка:
$ aptitude install unbound

* Надеюсь не надо напоминать чтобы других DNS серверов запущено не было, иначе будут конфликты (касаетс dnsmasq, bind etc...).

Теперь основное - конфигурация сервера.
В Gentoo, как и в Debian конфиг находится - /etc/unbound/unbound.conf
Редактируем:

$ nano /etc/unbound/unbound.conf

Итак минимальная конфигурация:

server:
# Степень вывода логов (1-4, при уровне 4 в логи будет попадать вся отладочная информация,
# при уровне 1 - только сообщения об ошибках)
verbosity: 0
# Количество потоков. Рекомендуется ставить равным числу ядер процессора
num-threads: 4
port: 53
interface: 127.0.0.1                 # Интерфейс на котором будем слушать 53-й порт
interface: 192.168.0.1               #
interface-automatic: no              # Определять интерфейсы автоматически мне не нужно
outgoing-interface: xxx.xxx.xxx.xxx  # ip адрес интерфейса, который подключен к интернет
do-ip4: yes
do-ip6: no
do-udp: yes
do-tcp: yes
username: unbound
logfile: "/var/log/unbound.log"
hide-version: yes
outgoing-range: 950
num-queries-per-thread: 512

so-rcvbuf: 4m  # обьем буфера для приема   UDP пакетов (рекомендованное стартовое значение)
so-sndbuf: 4m  # обьем буфера для отправки UDP пакетов (рекомендованное стартовое значение)

Сохраняем файл и можно запускать сервер:
$ /etc/init.d/unbound start

И для Gentoo (в Debian сам добавится при установке) добавить сервис в init:
$ rc-update add unbound default

После этого проверяем, что все успешно запустилось:

$ ps auxw | grep unbound
unbound  29203  0.0  0.0  46604  3944 ?        Ss   20:19   0:00 /usr/sbin/unbound -c /etc/unbound/unbound.conf
unbound  29206  0.0  0.0  46600  3048 ?        S    20:19   0:00 /usr/sbin/unbound -c /etc/unbound/unbound.conf
unbound  29207  0.0  0.0  46600  3044 ?        S    20:19   0:00 /usr/sbin/unbound -c /etc/unbound/unbound.conf
unbound  29208  0.0  0.0  46600  3044 ?        S    20:19   0:00 /usr/sbin/unbound -c /etc/unbound/unbound.conf
root     31572  0.0  0.0  10200   864 pts/1    S+   20:21   0:00 grep --color=auto unbound

Проверяем, слушается ли 53-й порт:
$ netstat -anp | grep nbound
tcp        0      0 192.168.0.1:53          0.0.0.0:*               LISTEN      29203/unbound      
tcp        0      0 127.0.0.1:53            0.0.0.0:*               LISTEN      29203/unbound      
tcp        0      0 127.0.0.1:8953          0.0.0.0:*               LISTEN      29203/unbound      
udp        0      0 192.168.0.1:53          0.0.0.0:*                           29203/unbound      
udp        0      0 127.0.0.1:53            0.0.0.0:*                           29203/unbound      
unix  3      [ ]         STREAM     CONNECTED     83022    29203/unbound        
unix  3      [ ]         STREAM     CONNECTED     83021    29203/unbound        
unix  3      [ ]         STREAM     CONNECTED     82153    29208/unbound        
unix  3      [ ]         STREAM     CONNECTED     82152    29208/unbound        
unix  3      [ ]         STREAM     CONNECTED     81161    29207/unbound        
unix  3      [ ]         STREAM     CONNECTED     81160    29207/unbound        
unix  3      [ ]         STREAM     CONNECTED     83020    29206/unbound        
unix  3      [ ]         STREAM     CONNECTED     83019    29206/unbound        
unix  3      [ ]         STREAM     CONNECTED     82151    29203/unbound        
unix  3      [ ]         STREAM     CONNECTED     82150    29208/unbound        
unix  3      [ ]         STREAM     CONNECTED     82149    29203/unbound        
unix  3      [ ]         STREAM     CONNECTED     82148    29207/unbound        
unix  3      [ ]         STREAM     CONNECTED     82147    29203/unbound        
unix  3      [ ]         STREAM     CONNECTED     82146    29206/unbound        
unix  3      [ ]         STREAM     CONNECTED     82145    29203/unbound        
unix  3      [ ]         STREAM     CONNECTED     82144    29203/unbound

А так же с помошью nslookup проверим наш новый ресольвер и убедиться, что он отвечает:
$ nslookup mail.ru 192.168.0.1
Server:         192.168.0.1
Address:        192.168.0.1#53

Non-authoritative answer:
Name:   mail.ru
Address: 94.100.191.202
Name:   mail.ru
Address: 94.100.191.203
Name:   mail.ru
Address: 94.100.191.204
Name:   mail.ru
Address: 94.100.191.201

Если в будущем понадобиться менять какие-либо параметры в unbound.conf то, для того чтобы сервер перечитал свой конфиг, достаточно выполнения традиционного:

$ /etc/init.d/unbound reload

+++++

Теперь в этом же файле (/etc/unbound/unbound.conf) опишем наш локальный домен, добавив PTR-запись и описав зону.
Стоит заметить, что в отличии от BIND, в Unbound не нужно описывать зону в файле named.conf, а потом создавать сам файл зоны в /var/named (к примеру в CentOS). Здесь все записывается сразу.
local-zone: "192.in-addr.arpa." static
local-data: "192.in-addr.arpa. 10800 IN NS local.lan."
local-data: "192.in-addr.arpa. 10800 IN SOA local.lan. admin.local.lan. 1 3600 1200 604800 10800"
local-data: "1.0.168.192.in-addr.arpa. 10800 IN PTR local.lan."
local-data: "local.lan. 10800 IN A 192.168.0.1"
.....

Похожие материалы:
Аватар Влад

Здравствуйте! Подскажите, в "outgoing-interface:" нельзя ли указать тип интерфейса, например ppp0, а то ip имеет свойство меняться?

Добавить комментарий