Зачем:
А затем. Кэширование - раз. Управление запретами - два. Возможность держать свои зоны - три. Модно - четыре.
А если серьезно, то собственный DNS - штука полезная. Даже если рассматривать простейший случай, рекурсивный-кэширующий, так имеем как минимум снижение отклика при запросах и снижение нагрузки на канал, особенно если подвязаться к DNS-серверам провайдера. А если поднимать свой собственный DNS-сервер, то тут все флаги в руки - от собственноручного управления подконтрольными зонами и моментального их изменения, до блокировок нежелательного простыми командами.
А еще дернулся было описывать простейший биллинг с зеркалами всякой вкусности, так и встал на том шаге, что слишком сильно привык к тому, что DNS есть и работает по всей локальной сети… Не получилось перепрыгнуть через этот шаг.
Disclaimer:
Я не самый большой специалист по DNS и претендовать на детально-подробное изложение не могу. Претендую лишь на то, что "все работает". В свое оправдание могу сказать, что есть мнение, что те несколько человек, которые действительно понимают, как работает система DNS - перечислены в писке авторов пакета bind.
Установка:
Я привел свою систему к следующему состоянию:
# emerge -pav bind bind-tools
[ebuild R ] net-dns/bind-tools-9.7.0_p1 USE="ssl xml -doc -idn -ipv6" 0 kB
[ebuild R ] net-dns/bind-9.7.0_p2-r1 USE="berkdb dlz geoip ldap mysql ssl threads xml -doc -idn -ipv6 -odbc -postgres -resolvconf -sdb-ldap (-selinux) -urandom" 0 kB
Описанные далее примеры могут работать и на других версиях, но читать changelog для них и делать правильный откат по настройкам я делать не буду. Не люблю движение вниз по версиям.
Настройка (вариант1):
Для начала построим простейший кэширующий DNS-сервер, который ничего не умеет, только лишь обрабатывать запросы исключительно с локальной сети (192.168.0.0/24), активно пользуясь при этом DNS-серверами провайдера (адреса 1.2.3.4 и 5.6.7.8 ).
Для этой простой задачи вполне хватит вот такого универсального, version-free так сказать, named.conf :
Код:
options {
directory "/var/bind";
allow-query { 192.168.0.0/24; localhost; };
allow-recursion { 192.168.0.0/24; localhost; };
allow-transfer { 192.168.0.0/24; localhost; };
version "handmade";
forward first;
forwarders {
1.2.3.4;
5.6.7.8;
};
query-source address * port 53;
pid-file "/var/run/named/named.pid";
};
zone "." IN {
type hint;
file "named.ca";
};
Обращаю внимание на то, что стилизация конфига под Си обязывает внимательно и тщательно следить за скобками и точками с запятыми - сколько в свое время было пролито крови из-за отсутствующего байта…
Если после всех правок перезапустить демон named - получим искомое. Т.е. скромный и маленький DNS-сервер, который умеет обслуживать локальную сеть. А если впишем в /etc/resolv.conf первую строчку как
nameserver 127.0.0.1
, то и сам себя - тоже.
В небольшое заключение - пара моментов, на которых слегка тормознемся:
1. Кэш трансляций BIND хранит в оперативке. Само собой, что после перезапуска демона кэш теряется.
2. Проверку работоспособности кэширования можно сделать, например, так:
localhost # dig @localhost icq.com
;; Query time: 350 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Tue Jun 8 11:34:57 2010
;; MSG SIZE rcvd: 138
localhost # dig @localhost icq.com
;; Query time: 1 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Tue Jun 8 11:35:25 2010
;; MSG SIZE rcvd: 138
3. Как дела у демона с безопасностью - да фик его знает. Умные люди говорят разное. Правда, те примеры эксплоитов, что встречаются в сети, лично у меня не работали. Что не помешало никоим образом засунуть демон в chroot и регулярно обновлять.
4. Как за-chroot-тить BIND - да просто. Внимательно прочитать сообщения лога portage, там прямые указания.
Но, если бы это - было бы все, мне бы коллеги в лицо плюнули. Ибо подобный конфиг можно запросто найти в первом же запросе гугла… Или во втором, не знаю.
Поэтому, дабы оправдать надежды, зайдем несколько дальше - сделаем на базе простого рекурсивного сервера некий шаблон, который и будем уже с течением времени навешивать и усложнять. Ну и, чтобы совсем в грязь не падать, воспользуемся почти всеми основными плюшками, что придумали разработчики:
localhost bind # cat named.conf
Код:
//список узлов, с которых будет разрешен трансфер зон
acl "wanarray" { 192.168.0.0/24; };
//список доверенных адресов
acl "lanarray" { 127.0.0.0/8; 192.168.0.0/24; };
options {
directory "/var/bind";
pid-file "/var/run/named/named.pid";
listen-on-v6 { none; };
allow-query { lanarray; };
allow-query-cache { lanarray; };
allow-recursion { lanarray; };
allow-transfer { wanarray; };
forward first;
forwarders {
1.2.3.4;
5.6.7.8;
};
query-source address * port 53;
};
//man-овского примера логгирования в штатном режиме вполне хватает для понимания
logging {
channel default_log {
file "/var/log/named/named.log" versions 5 size 50M;
print-time yes;
print-severity yes;
print-category yes;
};
category default { default_log; };
category general { default_log; };
};
//описание прав для внутренней зоны видимости,
//пока тут только служебное
view "internal" in {
match-clients { lanarray; };
recursion yes;
additional-from-auth yes;
additional-from-cache yes;
zone "." in {
type hint;
file "/var/bind/root.cache";
};
zone "localhost" IN {
type master;
file "pri/localhost.zone";
allow-update { none; };
notify no;
allow-query { any; };
allow-transfer { none; };
};
zone "127.in-addr.arpa" IN {
type master;
file "pri/127.zone";
allow-update { none; };
notify no;
allow-query { any; };
allow-transfer { none; };
};
};
//описание прав для внешних респондентов,
//и тут пока пусто
view "public" in {
match-clients { any; };
recursion no;
additional-from-auth no;
additional-from-cache no;
zone "." in {
type hint;
file "/var/bind/root.cache";
};
};
//Один из рекомендованных приемов сокрытия
//аппаратных и программных сведений
view "chaos" chaos {
match-clients { any; };
allow-query { none; };
zone "." {
type hint;
file "/dev/null"; // or any empty file
};
};
Заострю внимание читателя, что правке подлежал только /etc/bind/named.conf. Все остальные, служебные файлы зон и корневых серверов, правке не подлежали. Пока не подлежали.
Собственно, на этом простое рекурсивное и заканчивается. За тем, что имеем полное право добавить в автозагрузку:
rc-update add named default