Готовится статья о DNS сервере Unbound
Добавлено: 2008-07-05 21:33:07
				
				Установка и настройка DNS сервера Unbound
DNS сервер Unbound
В предыдущей заметке мною был описан процесс установки авторитарного DNS сервера NSD. В этой статье хочу описать установку и настройку кеширующего DNS сервера Unbound. Установка проводилась на FreeBSD 7.0 RELEASE. Мотив написания обоих заметок — попытка отказаться от необходимости использования гламурного BIND, и поиск новых решений на смену устаревающих.
В случае с обслуживанием рекурсивных клиентских запросов, в качестве альтернативы BIND'у можно рассматривать тот же самый djbdns (dnscache) со всеми его традиционными плюсами, и минусами. Но, как ни крути — это есть то самое устаревающее решение. Поэтому захотел расширить свои знания освоив Unbound.
Как я уже упомянул — Unbound это кеширующий DNS который обслуживает исключительно рекурсивные запросы. Во время работы сервера, кеш целиком распологается в памяти, а его размер ограничен указанным объемом. Unbound поддерживает расширения DNSSEC и может работать как "validator", но на рассмотрении этой функциональности я не останавливался — слишком уж объемная тема которая для меня пока не актуальна... Ну и в качестве плюсов по сравнению с BIND надо отметить все те же скромные размеры и скорость работы. Более детальный список фич и возможностей пакета, можно прочесть после установки в файле /usr/local/share/doc/unbound/FEATURES.
Установка
На момент написания статьи, в портах была доступна недавно вышедшая версия 1.0. На всякий случай упомяну процедуру обновления портов. Для версий FreeBSD начиная с 6.2, это удобно делать через portsnap:
После обновления портов, ставим Unbound традиционным методом:
При первой установке, порт предлагал выбрать только одну опцию конфигурации.
Я ее выбрал. Это приводит к установке дополнительного порта libevent-1.3e и линковке с ним Unbound в процессе компиляции. Более детально ознакомиться с тем, что такое libevent можно на официальном сайте проекта http://www.monkey.org/~provos/libevent/ Там же есть красивые графики с результатами «до» и «после». Результат с «после» мне понравился — тем более, что абсолютно за бесплатно...
На машине Pentium 4 2,53GHz сборка порта заняла три-четыре минуты.
Файлы установленные портом:
Управление запуском/перезапуском/остановкой будет вестись через стандартный rc.d скрипт установленный портом. Для проверки правильности unbound.conf удобно применять unbound-checkconf. Все просто.
В процессе установки порта, в систему добавляется новый пользователь из-под которого будет работать демон unbound:
Настройка
Традиционно подразумевается необходимость внимательного прочтения man unbound.conf и осознания прочитанного в свете личных требований. Опций много. Я выбирал и помещал в свой конфиг те, которые считал нужными себе, и оставлял с настройками по-умолчанию несущественные. В комментариях придется описать некоторые наиболее интересные.
Unbound позволяет запускать себя в chroot окружении. Я решил использовать эту возможность чтобы не замарачиваться с настройкой jail.
Для обеспечения полноценной работы в chroot, придется сделать один дополнительный маневр. Дело в том, что unbound необходим доступ к /dev/urandom. Я посчитал, что правильным решением будет ограниченное монтирование devfs в подкаталог ./dev в каталоге unbound.
В директории /usr/local/etc/unbound создаем новую поддиректорию ./dev:
В файле /etc/devfs.rules прописываем новый devfs releset:
В файле /etc/fstab прописываем монтирование devfs:
В файле /etc/rc.conf прописываем применение созданного devfs releset к точке монтирования, а так же сразу заодно разрешаем запуск демона:
В результате всех этих танцев с бубном, после каждой перезагрузки компа будим иметь в ./dev:
Стоит перезапустить FreeBSD и проверить, что devfs красиво подмонтировалась в /usr/local/etc/unbound/dev со всеми ограничениями как положено.
Далее продолжаем настройку unbound
Переходим в /usr/local/etc/unbound и скачиваем туда свежий hint-файл named.cache с информацией о адресах корневых серверов:
На работающем сервере каталог /usr/local/etc/unbound будет выглядеть так:
Конфиг unbound.conf:
В общем-то на этом все. Запускаем unbound-checkconf и, если нет сообщений об ошибках, то можно командовать команду:
И сервер заведется.
После этого стоит проверить, что все запустилось:
А так же поспрашивать с помошью nslookup наш новый ресольвер и убедиться, что все в порядке.
Если в будущем понадобиться менять какие-либо параметры в unbound.conf то, для того чтобы сервер перечитал свой конфиг, достаточно выполнения традиционного:
Комментарии
Опции unbound.conf:
- Эти две опции указывают на то, сколько различных случайных портов может использовать каждый thread при проведении запросов, и на то из какого диапазона можно брать эти порты. Каждый новый запрос к авторитарным DNS серверам отправляется со своего порта — это сделано для секюрности.
Стоит учитывать, что сокет = открытый файл. На максимальное количество файлов которые может открыть процесс, влияют настройки из /etc/login.conf. По-умолчанию для пользователя default уже установлено openfiles=unlimited.
- Эти опции указывают на то, каким будет размер кеша принимаемых запросов и, собственно, кеша DNS записей. cache-max-ttl указывает на максимальный срок жизни записей в кеше даже не смотря на их оригинальный TTL.
- Указывает сколько клиентских запросов может обработать один поток. При превышении, лишние запросы будут дропаться.
- Кому разрешено посылать рекурсивные запросы (пользоваться кешем)
- Полное отключение любого логирования. Мне не нужно. Если надо — можно включить и установить уровень verbosity от 1 до 4. В отличии от NSD, Unbound пишет в свои логи очень много разной статистики. При вербозности 4, вывод в лог по насыщенности практически напоминает tcpdump. 
- Устанавливает режим работы как исключительно DNS кеша. Еще один вариант этой настройки "validator iterator". В таком случае появляется возможность использовать DNSSEC расширения.
- Возможность «засорить» кеш своими данными приоритет которых будет выше чем у данных оригинальной зоны. Параметр устанавливаемый после имени local-zone указывает на режим как надо отвечать на данные которые предварительно не были указаны. Варианты:
- Перенаправление всех запросов к этой зоне на указанный авторитарный сервер. Запросы отсылаются как итерационные.
- Перенаправление всех запросов к этой зоне на указанный кеширующий сервер. Запросы отсылаются как рекурсивные. Это способ форвардинга запросов. Если указать здесь:
То все запросы направляемые на наш сервер, будут перенаправляться на 192.168.2.1 который уже будет проводить всю рекурсию и возвращать ответ.
---
Комментируйте пожалуйста. Писал уставший - мог забыть или накасячить что-нибудь... 
  
Разместил готовую статью здесь: http://www.lissyara.su/?id=1705
			DNS сервер Unbound
В предыдущей заметке мною был описан процесс установки авторитарного DNS сервера NSD. В этой статье хочу описать установку и настройку кеширующего DNS сервера Unbound. Установка проводилась на FreeBSD 7.0 RELEASE. Мотив написания обоих заметок — попытка отказаться от необходимости использования гламурного BIND, и поиск новых решений на смену устаревающих.
В случае с обслуживанием рекурсивных клиентских запросов, в качестве альтернативы BIND'у можно рассматривать тот же самый djbdns (dnscache) со всеми его традиционными плюсами, и минусами. Но, как ни крути — это есть то самое устаревающее решение. Поэтому захотел расширить свои знания освоив Unbound.
Как я уже упомянул — Unbound это кеширующий DNS который обслуживает исключительно рекурсивные запросы. Во время работы сервера, кеш целиком распологается в памяти, а его размер ограничен указанным объемом. Unbound поддерживает расширения DNSSEC и может работать как "validator", но на рассмотрении этой функциональности я не останавливался — слишком уж объемная тема которая для меня пока не актуальна... Ну и в качестве плюсов по сравнению с BIND надо отметить все те же скромные размеры и скорость работы. Более детальный список фич и возможностей пакета, можно прочесть после установки в файле /usr/local/share/doc/unbound/FEATURES.
Установка
На момент написания статьи, в портах была доступна недавно вышедшая версия 1.0. На всякий случай упомяну процедуру обновления портов. Для версий FreeBSD начиная с 6.2, это удобно делать через portsnap:
Код: Выделить всё
# portsnap fetch
# portsnap extractПосле обновления портов, ставим Unbound традиционным методом:
Код: Выделить всё
# cd /usr/ports/dns/unbound
# make install cleanПри первой установке, порт предлагал выбрать только одну опцию конфигурации.
Код: Выделить всё
     Options for unbound 1.0.0_1
[ ] LIBEVENT  is useful when using many (10000) outgoing portsНа машине Pentium 4 2,53GHz сборка порта заняла три-четыре минуты.
Файлы установленные портом:
Код: Выделить всё
/usr/local/man/man1/unbound-host.1.gz
/usr/local/man/man3/libunbound.3.gz
/usr/local/man/man5/unbound.conf.5.gz
/usr/local/man/man8/unbound.8.gz
/usr/local/man/man8/unbound-checkconf.8.gz
/usr/local/etc/unbound/unbound.conf.sample
/usr/local/include/unbound.h
/usr/local/lib/libunbound.so.0
/usr/local/lib/libunbound.so
/usr/local/lib/libunbound.la
/usr/local/lib/libunbound.a
/usr/local/sbin/unbound
/usr/local/sbin/unbound-checkconf
/usr/local/sbin/unbound-host
/usr/local/share/doc/unbound/CREDITS
/usr/local/share/doc/unbound/Changelog
/usr/local/share/doc/unbound/FEATURES
/usr/local/share/doc/unbound/LICENSE
/usr/local/share/doc/unbound/README
/usr/local/share/doc/unbound/README.svn
/usr/local/share/doc/unbound/README.tests
/usr/local/share/doc/unbound/TODO
/usr/local/share/doc/unbound/plan
/usr/local/share/doc/unbound/requirements.txt
/usr/local/etc/rc.d/unboundУправление запуском/перезапуском/остановкой будет вестись через стандартный rc.d скрипт установленный портом. Для проверки правильности unbound.conf удобно применять unbound-checkconf. Все просто.
В процессе установки порта, в систему добавляется новый пользователь из-под которого будет работать демон unbound:
Код: Выделить всё
unbound:*:59:1:unbound dns resolver:/nonexistent:/usr/sbin/nologinНастройка
Традиционно подразумевается необходимость внимательного прочтения man unbound.conf и осознания прочитанного в свете личных требований. Опций много. Я выбирал и помещал в свой конфиг те, которые считал нужными себе, и оставлял с настройками по-умолчанию несущественные. В комментариях придется описать некоторые наиболее интересные.
Unbound позволяет запускать себя в chroot окружении. Я решил использовать эту возможность чтобы не замарачиваться с настройкой jail.
Для обеспечения полноценной работы в chroot, придется сделать один дополнительный маневр. Дело в том, что unbound необходим доступ к /dev/urandom. Я посчитал, что правильным решением будет ограниченное монтирование devfs в подкаталог ./dev в каталоге unbound.
В директории /usr/local/etc/unbound создаем новую поддиректорию ./dev:
Код: Выделить всё
drwxr-xr-x	3	unbound	wheel	512	5 июл 17:54 .
drwxr-xr-x	37	root	wheel	1536	3 июл 20:53 ..
dr-xr-xr-x	4	root	wheel	512	5 июл 20:00 devКод: Выделить всё
[unbound_ruleset=20]
add hide
add path null unhide
add path zero unhide
add path crypto unhide
add path random unhide
add path urandom unhide
Код: Выделить всё
devfs	/usr/local/etc/unbound/dev	devfs	rw	0	0Код: Выделить всё
devfs_set_rulesets="/usr/local/etc/unbound/dev=unbound_ruleset"
unbound_enable="YES"Код: Выделить всё
[root@dns /usr/local/etc/unbound/dev]# ls -la
total 0
crw-rw-rw-	1 root	wheel	0,  13	5 июл 20:22 null
crw-rw-rw-	1 root	wheel	0,  19	5 июл 20:00 random
lrwxr-xr-x	1 root	wheel	6	5 июл 17:00 urandom -> random
crw-rw-rw-	1 root	wheel	0,  14	5 июл 17:00 zeroДалее продолжаем настройку unbound
Переходим в /usr/local/etc/unbound и скачиваем туда свежий hint-файл named.cache с информацией о адресах корневых серверов:
Код: Выделить всё
# cd /usr/local/etc/unbound
# fetch ftp://FTP.INTERNIC.NET/domain/named.cacheКод: Выделить всё
[root@dns /usr/local/etc/unbound]# ls -la
total 13
drwxr-xr-x	3	unbound	wheel	512	5 июл 17:54 .
drwxr-xr-x	37	root	wheel	1536	3 июл 20:53 ..
dr-xr-xr-x	4	root	wheel	512	5 июл 20:00 dev
-rw-r--r--	1	root	wheel	2879	4 фев 10:00 named.cache
-rw-r--r--	1	root	wheel	1419	5 июл 17:54 unbound.conf
-rw-r--r--	1	unbound	wheel	5	5 июл 17:54 unbound.pidКонфиг unbound.conf:
Код: Выделить всё
server:
        verbosity: 0
        num-threads: 8
        interface: 0.0.0.0
        port: 53
        outgoing-range: 256
        outgoing-port-permit: 32768-65000
        msg-cache-size: 16m
        msg-cache-slabs: 4
        num-queries-per-thread: 1024
        rrset-cache-size: 32m
        rrset-cache-slabs: 4
        cache-max-ttl: 86400
        infra-host-ttl: 900
        infra-lame-ttl: 900
        infra-cache-slabs: 4
        infra-cache-numhosts: 10000
        infra-cache-lame-size: 10k
        do-ip4: yes
        do-ip6: no
        do-udp: yes
        do-tcp: yes
        do-daemonize: yes
        access-control: 0.0.0.0/0 refuse
        access-control: 192.168.1.0/24 allow
        access-control: 127.0.0.0/8 allow
        access-control: ::0/0 refuse
        access-control: ::1 allow
        access-control: ::ffff:127.0.0.1 allow
        chroot: "/usr/local/etc/unbound"
        username: "unbound"
        directory: "/usr/local/etc/unbound"
        #logfile: "/usr/local/etc/unbound/unbound.log"
        logfile: ""
        use-syslog: no
        pidfile: "/usr/local/etc/unbound/unbound.pid"
        root-hints: "/usr/local/etc/unbound/named.cache"
        identity: "DNS"
        version: "1.0"
        hide-identity: yes
        hide-version: yes
        harden-glue: yes
        do-not-query-address: 127.0.0.1/8
        do-not-query-address: ::1
        do-not-query-localhost: yes
        module-config: "iterator"
#local-zone: "mail.ru." transparent
#        local-data: "www.mail.ru. 300 IN A 10.10.10.10"
#        local-data: "ftp.mail.ru. 300 IN A 172.16.1.2"
#stub-zone:
#       name: "times.lv."
#       stub-addr: 193.108.185.34
#       forward-host:
#forward-zone:
#       name: "rus.delfi.lv."
#       stub-addr:
#       forward-host: ns.nic.lv.Код: Выделить всё
# /usr/local/etc/rc.d/unbound startПосле этого стоит проверить, что все запустилось:
Код: Выделить всё
# ps auxw | grep unbound
unbound     4018  0,0  0,8 34152  8488  ??  Is   17:36     0:00,03 /usr/local/sbin/unbound
#netstat -an | grep *.53
tcp4	0      0  *.53                   *.*                    LISTEN
udp4	0      0  *.53                   *.*Если в будущем понадобиться менять какие-либо параметры в unbound.conf то, для того чтобы сервер перечитал свой конфиг, достаточно выполнения традиционного:
Код: Выделить всё
/usr/local/etc/rc.d/unbound reloadОпции unbound.conf:
Код: Выделить всё
outgoing-range: 256 
outgoing-port-permit: 32768-65000Стоит учитывать, что сокет = открытый файл. На максимальное количество файлов которые может открыть процесс, влияют настройки из /etc/login.conf. По-умолчанию для пользователя default уже установлено openfiles=unlimited.
Код: Выделить всё
msg-cache-size: 16m
msg-cache-slabs: 4
rrset-cache-size: 32m
rrset-cache-slabs: 4
cache-max-ttl: 86400Код: Выделить всё
num-queries-per-thread: 1024Код: Выделить всё
access-control: 192.168.1.0/24 allowКод: Выделить всё
logfile: ""
use-syslog: noКод: Выделить всё
module-config: "iterator"Код: Выделить всё
local-zone:Код: Выделить всё
deny - serves local data (if any), else, drops queries.
efuse - serves local data (if any), else, replies with error.
static - serves local data, else, nxdomain or nodata answer.
transparent - serves local data, else, resolves normally .
direct - serves the zone data for any subdomain in the zone.
nodefault - can be used to normally resolve AS112 zones.
Код: Выделить всё
stub-zone:Код: Выделить всё
forward-zone:Код: Выделить всё
forward-zone: 
name: "."
stub-addr: 192.168.2.1---
Комментируйте пожалуйста. Писал уставший - мог забыть или накасячить что-нибудь...
 
  
Разместил готовую статью здесь: http://www.lissyara.su/?id=1705


 
 
 
  
