Введение в DNS сервер djbdns. (dns djbdns)
Ключевые слова: dns, djbdns, (найти похожие документы)
From: Ситкарев Григорий <admin at net.nordcomp.ru>
Newsgroups: http://www.unix.nordcomp.ru/
Date: Mon, 20 Sep 2004 18:21:07 +0000 (UTC)
Subject: Введение в DNS сервер djbdns.
Оригинал: http://www.unix.nordcomp.ru/articles.html?page=1&id=10
DJBDNS или как убить BIND
НАЧАЛО
------
Началось все с того, что в один прекрасный день мне снова пришлось
патчить ISC BIND. Честно скажу, надоело. Будучи распространенным и
очень важным сервисом, DNS от ISC крайне дыряв. Беда еще и в том (ее
пока не удастся избежать), что многие проблемы BIND кроются в
библиотеке более известной как libresolv и libbind. Эти библиотеки
поставляются в составе UNIX дистрибутивов в виде -lresolv или же
включены непосредственно в -lc. Эти библиотеки содержат как
низкоуровневые функции типа res_query() и res_search() так и
высокоуровневые функции типа getxxxbynnn(). Переполнение буфера и
прочие гадости - результат ошибок этих библиотек. Постольку поскольку
приходится использовать их во множестве утилит, начиная от
WEB-броузеров заканчивая ftp-клиентами, все они подвержены так или
иначе проблемам. Следует заметить, что Джеймсом Бернштейном
поставляется своя библиотека с открытым кодом для замены libresolv,
более известная как djbdns client library, широко она не используется.
А жаль.
На повестке дня стояла задача заменить корявый ISC BIND на некорявый
DJB DNS. Сразу отмечу, что многим не нравится стиль программ Джеймса
Бернштейна (qmail, daemontools и пр.). Не спорю, стиль особенный и
довольно яркий, но в то же время логичный и корректный.
Для начала разберемся, что нам потребуется для установки DJB DNS.
Нужен обязательно набор утилит daemontools (начиная с версии 0.70 или
выше), нужен и ucspi-tcp. Установка этих утилит крайне проста.
Последняя опубликованная версия djbdns доступна также на сайте Джеймса
Бернштейна. После того, как djbdns был скопирован в локальный каталог,
распакуем его:
tar -zxvf djbdns-1.05.tar.gz
cd djbdns-1.05
компилируем:
make
и с правами root устанавливаем в /usr/local:
make setup check
КОМПОНЕНТЫ DJBDNS
-----------------
dnscache
--------
Это DNS кеш. Принимает рекурсивные запросы от различных клиентов,
собирает ответы от других DNS серверов и кеширует результат.
Конфигурирование
Обычно dnscache конфигурируется специальной утилитой dnscache-conf.
dnscache запускается в chroot окружении в директории, которая указана
в переменной окружения $ROOT с uid и gid, указанными в соответственно
переменных окружения $UID и $GID.
dnscache слушает сокет на 53/udp и 53/tcp c IP адресом, указанным в
$IP. Это может быть как адрес локальной петли 127.0.0.1 (DNS кеш
используется только локальным компьютером) или внешний IP адрес (DNS
кеш используется различными компьютерами в сети). В последнем случае
нужно ограничить доступ к кешу только доверенным клиентам в сети. Для
этого достаточно поместить файл например с таким именем ip/192.168.0.
Таким образом dnscache будет принимать запросы от клиентов из IP сети
192.168.0.
Ответ от dnscache посылается с IP адреса $IPSEND. Чаще всего $IPSEND
равен 0.0.0.0, т.е. с первичного IP адреса.
Список IP адресов корневых серверов для dnscache доступен из файла
servers/@. Если в директории servers находится например файл
servers/nordcomp.ru, то dnscache при попытке разрешения имени
xxx.nordcomp.ru будет обращаться непосредственно к серверу/серверам,
IP адрес/адресы которого указаны в этом файле, без запросов к корневым
серверам.
Для версий v.1.03 и выше : если установлена переменная $FORWARDONLY,
то dnscache будет считать, что список IP адресов в файле servers/@ это
адреса форвардеров, которым следует перенаправлять запросы клиентов.
Использование памяти
В целях безопасности, dnscache использует фиксированную по размеру
таблицу размером 256K, для одновременной работы с 200-ми UDP запросами
и 20-ю TCP соединениями. Также память динамически аллокируется для
каждого активного запроса. В случае, если dnscache нехватает памяти,
запрос не обслуживается. ОС также резервирует буфер размером в 128К
для входящих UDP запросов. В версиях выше 1.03, если получен новый UDP
запрос, а dnscache уже обслуживает больше 200, отбрасывается самый
"старый" запрос. dnscache поступит также и в случае превышения
количества обслуживаемых TCP соединений более 20.
dnscache использует фиксированный по размеру кеш, устанавливаемый
переменной окружения $CACHESIZE. Примерно 5% кеша используется для
хэш-таблицы, остальная же часть используется непосредственно для
записей (включая 8-ми байтовое Y2038-совместимое значение времени
старения):
∙- A типа. 22 байта плюс 4 байта на адрес плюс длина имени владельца
∙- NS типа или PTR или CNAME. 22 байта плюс длина имени владельца и
всех данных.
∙- MX типа. 22 байта плюс 2 байта на MX плюс длина всех имен
∙- Другие типы. 22 байта плюс 2 байта на запись плюс длина всех данных
плюс длина имени владельца
∙ Несуществующие домены или ошибки серверов. 22 байта плюс длина имени
владельца
Значения больше 8192 байтов не кешируются. dnscache не завершает
работу, если не осталось свободного места в кеше, а просто удаляет
самые старые записи из кеша.
Политика разрешения имен и кеширования
dnscache полагается на конфигурированный список корневых серверов, в
отличие от BIND, где используется "hint-file" со списком
name-серверов, от которых будет получен список корневых серверов.
dnscache отбрасывает и не кеширует подозрительные записи, например
записи для foo.dom могут быть приняты или от корневых серверов, или от
.dom серверов или от foo.dom. Записи кешируются как минимум на неделю,
TTL же больше 2147483647 интерпретируется как 0. Записи SOA не
кешируются, но используется TTL для установки времени кеширования для
несуществующих доменов и т.д.
Взаимодействие с DNS клиентом
Ответы dnscache в общем обычно меньше, чем у ISC BIND, т.к. не
включают authority-записи (NS записи для исходного сервера имен и SOA
запись для негативного ответа) или дополнительные записи.
dnscache предотвращает различные запросы, такие например как
нерекурсивные запросы, инверсные запросы, и запросы на передачу зоны.
Если установлен $HIDETTL, то dnscache всегда будет устанавливать TTL
равный 0 на все ответы клиенту. В версиях до 1.03 TTL всегда был равен 0.
Специальные имена
dnscache обладает внутренней поддержкой имени localhost, и создает
запись типа А на адрес 127.0.0.1. Аналогично с именем
1.0.0.127.in-addr.arpa, создается запись PTR.
dnscache-conf
Программа dnscache-conf конфигурирует типичный dnscache. Семантика
вызова:
dnscache-conf acct logacct D ip
dnscache-conf создает каталог D где будет запущен dnscache. Имя D
должно начинаться с "/" и не содержать никаких специальных символов.
Обычно D - /etc/dnscache. Сервис dnscache запускается с помощью
svcscan. Для этого достаточно создать символическую ссылку в каталог
svcscan.
ln -s /etc/dnscache /service
Сервис будет запущен через пять секунд после помещения в каталог
символической ссылки, и будет перезапущен при перезагрузке. Можно
воспользоваться утилитой svc для контроля за сервисом.
Программа dnscache-conf создает необходимые конфигурационные файлы в
каталоге D, например каталог root, в котором будет находится в chroot
откружении dnscache с uid и gid acct. Имя acct также не должно
содержать никаких специальных символов.
dnscache будет слушать 53 UDP/TCP порт на ip. Этот параметр не
обязательный. По умолчанию dnscache-conf устанавливает его равным
127.0.0.1 и помещает в файл D/env/IP а также разрешает запросы с
адреса 127.0.0.1, создавая файл D/root/ip/127.0.0.1.
Лог-файлы создаются также автоматически в каталоге D/log/main, где
периодически происходит их ротация. Владельцем лог-файлов является
logacct. Соответствующий процесс multilog запускается с uid и gid
logacct.
Запуск dnscache
Пример запуска внешнего DNS кеша.
Предполагается, что djbdns, daemontools установлены, и запущен svcscan.
1. Создать UNIX аккаунты Gdnslog и Gdnscache.
2. Выбрать IP адрес для DNS кеша, который будет использоваться
клиентами для посылки запросов. Адрес естественно должен быть доступен
клиентам. В данном примере предполагается, что используется адреса из
private сети вида 10.*.*.*.
3. С правами root создать сервисный каталог /etc/dnscache.
dnscache-conf Gdnscache Gdnslog /etc/dnscache 10.53.0.1
В директории содержатся несколько конфигурационных файлов, которые
потом можно изменить, и лог-файлы.
4. С правами root объясним svcscan, что хотим запустить dnscache,
создадим символическую ссылку в каталог /service. Высяним статус
запускаемого сервиса с помощью утилиты svstat.
ln -s /etc/dnscache /service
svstat /service/dnscache
5. С правами root создадим конфигурационный файл, для задания классов
IP адресов, имеющих доступ к DNS кешу. В данном случае, клиенты с
адресами вида 10.* будут иметь доступ к DNS кешу.
touch /etc/dnscache/root/ip/10
Можно удалить и добавить другие файлы для закрытия/открытия доступа к
DNS кешу.
tinydns
-------
tinydns - это DNS сервер, принимающий итеративные DNS запросы со всех
хостов в Internet и отвечающий на запросы конфигурируемыми данными.
Конфигурирование
Обычно tinydns конфигурируется с помощью утилиты tinydns-conf. tinydns
запускается в chroot окружении в каталоге, указанном переменной
окружения $ROOT с uid и gid, указанными соответственно переменными
окружения $UID и $GID. tinydns слушает только сокет 53/UDP и отвечает
на запросы, исходя из данных в специальном двоичном файле data.cdb,
создаваемого с помощью tinydns-data. TCP запросы tinydns не
обслуживает.
tinydns отвергает пакеты с запросами на передачу зоны, с инверсными
запросами, запросами не internet класса, поврежденными запросами и
пакеты, содержащие более одного запроса.
tinydns-data
tinydns-data считывает данные локального DNS из файла с именем data в
текущем каталоге, и создает data.cdb в двоичном формате для
обеспечения быстрого доступа tinydns. Эта программа может также
создавать некоторые другие файлы с именами, начинающихся с data.
tinydns-data обновляет data.cdb атомарно, таким образом существует
возможность вносить изменения в данные DNS во время работы tinydns.
Если в момент обновления data.cdb произойдет ошибка, tinydns-data
остановится, и оставит данные в data.cdb в прежнем виде.
Формат данных
Данные DNS в файле data представляют собой обычные строки текстового
файла. Каждая новая строка начинается со специального символа и
продолжается несколькими текстовыми полями, разделенных двоеточиями. В
некоторых случаях некоторые поля могут быть пропущены. Пробелы и знаки
табуляции в конце строки игнорируются.
Каждая строка содержит ttl ("time to live"), указывающая количество
секунд, на которые запись может быть кеширована DNS кешем. Следует
учесть, что время кеширования меньше 300 секунд некоторыми клиентами
DNS воспринимается как 300, и время TTL для записей типа NS меньше 2-х
секунд может вызывать ошибки при разрешении. Значение ttl можно не
указывать, в таком случае tinydns-data создаст ttl со значением по
умолчанию (подходит в большинстве случаев), выбранным исходя из
нормальной работы DNS в обычных ситуациях.
Для каждой записи можно указать временной штамм. Если ttl не ноль,
(или пропущен), временной штамм указывает на начало времени действия
записи. Если же ttl равен нулю, тогда временной штамм указывает на
время "смерти" записи. tinydns динамически регулирует ttl таким
образом, что DNS запись не кешируется более, чем на несколько секунд
от времени "смерти". Временной штамм имеет вид внешнего TAI64
timestamp, в форме 16-ти шестнадцатеричных знаков в нижнем регистре.
Например:
+www.heaven.af.mil:1.2.3.4:0:4000000038af1379
+www.heaven.af.mil:1.2.3.7::4000000038af1379
указывает, что www.heaven.af.mil будет иметь адрес 1.2.3.4 до времени
4000000038af1379 (2000-02-19 22:04:31 UTC), а по истечении этого
времени будет иметь адрес 1.2.3.7.
Для версий 1.04 и выше: Возможно указать также расположение клиента.
Строка игнорируется, если нет совпадения с адресом. Расположения
указываются с префиксом %:
%lo:ipprefix
означает, что IP адреса, начинающиеся с ipprefix соответствуют
расположению lo. lo это один или два символа ASCII. Клиент может
находится только в одном расположении, иначе говоря, более длинные
префиксы IP перекрывают короткие.
Пример:
%in:192.168
%ex
+jupiter.heaven.af.mil:192.168.1.2:::in
+jupiter.heaven.af.mil:1.2.3.4:::ex
указывает, что jupiter.heaven.af.mil имеет адрес 192.168.1.2 для
клиентов, имеющих адрес вида 192.168.x.x, для всех остальных же хост
имеет IP адрес 1.2.3.4.
Основные типы данных
.fqdn:ip:x:ttl:timestamp:lo
Сервер имен для домена .fqdn. При этом tinydns-data создает:
∙- NS запись, указывающую на x.ns.fqdn как на сервер имен для fqdn.
∙- A запись, указывающую, что x.ns.fqdn имеет адрес ip.
∙- SOA запись, для fqdn, имеющую x.ns.fqdn как первичный сервер DNS и
hostmaster@fqdn как адрес администратора DNS.
Можно указать несколько серверов имен для одного домена с различными x
для каждого сервера. tinydns возвращает только одну SOA запись на
домен.
Если x содержит точку, в таком случае tinydns будет использовать x в
качестве сервера имен, а не x.ns.fqdn. В случае, если для x где-то в
данных уже указан IP адрес, не следует указывать ip.
Примеры:
.panic.mil:1.8.7.55:a
Создает NS запись, указывающую на a.x.panic.mil как на сервер имен для
домена panic.mil, A запись указывающую на 1.8.7.55 как на IP адрес для
a.ns.panic.mil.
.panic.mil:1.8.7.56:dns2.panic.mil
Создает NS запись, указывающую на dns2.panic.mil как на сервер имен
для домена panic.mil, A запись указывающую на 1.8.7.56 как на IP адрес
для dns2.panic.mil, и SOA запись для panic.mil.
.panic.mil::a.ns.heaven.af.mil
Создает NS запись указывающую на a.ns.heaven.af.mil как на сервер имен
для домена panic.mil и SOA запись для panic.mil.
&fqdn:ip:x:ttl:timestamp:lo
Сервер имен для домена fqdn. При этом tinydns-data создает:
∙- NS запись указывающую на x.ns.fqdn как на сервер имен для fqdn
∙- A запись указывающую на ip как на IP адрес x.ns.fqdn
Если x содержит точку, в таком случае его значение интерпретируется
несколько иначе (см. выше). Можно указать несколько серверов имен для
одного fqdn, используя разные значения x. Обычно & используется для
делегируемых доменов, в то время как . используется для делегированных
доменов.
Примеры:
&serious.panic.mil:1.8.248.6:a
Создает NS запись, указывающую на a.ns.serious.panic.mil как на сервер
имен для serious.panic.mil и A запись указывающую на 1.8.248.6 как на
IP адрес для a.ns.serious.panic.mil.
&serious.panic.mil:1.8.248.7:ns7.panic.mil
Создает NS запись, указывающую на ns7.panic.mil как на сервер имен для
serious.panic.mil и А запись указывающую на 1.8.248.7 как на IP адрес
ns7.panic.mil.
=fqdn:ip:ttl:timestamp:lo
Хост fqdn с IP адресом ip. При этом tinydns-data создает:
∙- А запись, указывающую на ip как на IP адрес хоста с именем fqdn
∙- PTR (pointer} запись указывающую на fqdn как на
d.c.b.d.in-addr.arpa, если ip - a.b.c.d.
Обязательно потребуется указать NS для fqdn иначе tinydns откажется
отвечать на запросы к fqdn. Анлогично потреубется указать NS для
d.c.b.a.in-addr.arpa в том случае, если этот домен был делегирован.
Пример:
=button.panic.mil:1.8.7.108
Создает А запись указывающую на 1.6.7.108 как на IP адрес
button.panic.mil и PTR запись, указывающую на button.panic.mil как на
имя для 108.7.8.1.in-addr.arpa.
+fqdn:ip:ttl:timestamp:lo
Создает псевдоним (alias) для fqdn с IP адресом ip. Аналогично
=fqdn:ip:ttl, однако при этом tinydns-data не создает PTR запись.
Пример:
+button.panic.mil:1.8.7.109
Создает A запись указывающую на 1.8.7.109 как на еще один IP адрес
button.panic.mil.
@fqdn:ip:x:dist:ttl:timestamp:lo
Сервер почтового обмена (Mail Echanger) для домена fqdn. При этом
tinydns-data создает:
∙- MX запись указывающую на x.mx.fqdn как на сервер почтового обмена с
приоритетом dist.
∙- А запись указывающую на ip как на IP адрес x.mx.fqdn.
В случае, если значение dist не было указано, присваивается значение
по умолчанию "0". В случае, если x содержит точку, значение
интерпертируется иначе (см. выше). Можно указать несколько MX записей
для одного fqdn. Необходимо также провести соответствующие настройки
на SMTP серверах, IP которых указаны в MX записях, для того, чтобы они
принимали почту для fqdn.
Пример:
@panic.mil:1.8.7.88:mail.panic.mil
Создает MX запись указывающую на mail.panic.mil как на почтовый сервер
для домена panic.mil с приоритетом 0, и А запись, указывающую на
1.8.7.88 как на IP адрес mail.panic.mil.
Дополнительные типы данных
-fqdn:ip:ttl:timestamp:lo
Для версий 1.04 и выше: эта запись используется программами, которые
автоматически редактируют строки в data , начинающиеся с +, для
временного исключения адресов "мертвых" или перегруженых машин. Эта
строка игнорируется.
`fqdn:s:ttl:timestamp:lo
TXT запись для fqdn. При этом tinydns-data создает TXT запись,
содержащую строку s.
Время создания: 2002-12-27 14:43:52
© Сыктывкарское сообщество UNIX, 2002 - 2003 г.