В предыдущей заметке мною был описан процесс установки авторитарного DNS сервера NSD. В этой статье хочу описать установку и настройку кеширующего DNS сервера Unbound. Установка проводилась на FreeBSD 7.0. Мотив написания обоих заметок — это попытка отказаться от необходимости использования гламурного 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
Я ее выбрал. Это приводит к установке дополнительного порта libevent-1.3e и линковке с ним Unbound в процессе компиляции. Более детально ознакомиться с тем, что такое libevent можно на официальном сайте проекта http://www.monkey.org/~provos/libevent/ Там же есть красивые графики с результатами «до» и «после». Результат с «после» мне понравился - тем более, что абсолютно за бесплатно...
На машине Pentium 4 2,53GHz сборка порта заняла три-четыре минуты.
Управление запуском/перезапуском/остановкой будет вестись через стандартный 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:
А так же поспрашивать с помошью nslookup наш новый ресольвер и убедиться, что все в порядке.
Если в будущем понадобиться менять какие-либо параметры в unbound.conf то, для того чтобы сервер перечитал свой конфиг, достаточно выполнения традиционного:
- Эти две опции указывают на то, сколько различных случайных портов может использовать каждый thread при проведении запросов, и на то из какого диапазона можно брать эти порты. Каждый новый запрос к авторитарным DNS серверам отправляется со своего порта — это сделано для секюрности. Стоит учитывать, что сокет = открытый файл. На максимальное количество файлов которые может открыть процесс, влияют настройки из /etc/login.conf. По-умолчанию для пользователя default уже установлено openfiles=unlimited.
- Эти опции указывают на то, каким будет размер кеша принимаемых запросов и, собственно, кеша DNS записей. cache-max-ttl указывает на максимальный срок жизни записей в кеше даже не смотря на их оригинальный TTL.
num-queries-per-thread: 1024
- Указывает сколько клиентских запросов может обработать один поток. При превышении, лишние запросы будут дропаться.
- Полное отключение любого логирования. Мне не нужно. Если надо — можно включить и установить уровень verbosity от 1 до 4. В отличии от NSD, Unbound пишет в свои логи очень много разной статистики. При вербозности 4, вывод в лог по насыщенности практически напоминает tcpdump.
module-config: "iterator"
- Устанавливает режим работы как исключительно DNS кеша. Еще один вариант этой настройки "validator iterator". В таком случае появляется возможность использовать DNSSEC расширения.
local-zone:
- Возможность «засорить» кеш своими данными приоритет которых будет выше чем у данных оригинальной зоны. Параметр устанавливаемый после имени 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
То все запросы направляемые на наш сервер, будут перенаправляться на 192.168.2.1 который уже будет проводить всю рекурсию и возвращать ответ.