Документация по ОС FreeBSD Среда, 04.12.2024, 21:14
Приветствую Вас Гость | RSS
Меню сайта

Категории каталога
Apache [58]
DNS [25]
FTP [27]
Mail [74]
Samba [24]
Squid [46]
SSH [23]
VPN [35]
РРР [20]
Net [173]

Главная » Статьи » Сеть » DNS

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, если ipa.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.
Категория: DNS | Добавил: oleg (19.10.2007)
Просмотров: 1933 | Рейтинг: 0.0/0 |
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Форма входа

Beastie

Друзья сайта

Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0
links

Copyright MyCorp © 2024