Постановка задачи: У нас есть сеть, у нас есть сервер, у нас уже настроен интернет на сервере. Но вот беда, - у провайдера периодически падает сервер имён (DNS) или частенько оказывается так сильно загружен, что скорость отдачи зон (резолвинг) оставляет желать лучшего. Устанавливаем собственный кэширующий DNS сервер (bind 9) с вымышленной зоной исключительно для нашей сети. С последующим помещением его в "песочницу" (chroot). (У нас нет купленного доменного имени, но есть статический ip)
УСТАНОВКА BIND 9
1. Устанавливаем Bind 9
server:/# apt-get install bind9
2. Если все установилось без ошибок то останавливаем его
server:/# /etc/init.d/bind9 stop
Из соображений безопасности лучше запускать Bind в chroot среде, для этого проделайте несколько простых операций.
3. Отредактируйте файл /etc/init.d/bind9, туда надо добавить строку в среде chroot которая будет находится у нас в /var/lib/named.
Измените строку OPTIONS=" -u bind" на OPTIONS="-u bind -t /var/lib/named"
OPTIONS="-u bind -t /var/lib/named" # Set RESOLVCONF=no to not run resolvconf RESOLVCONF=yes
Замечание: Здесь важно то, что изменять надо файл в папке init.d, а не в папке default! Если не найдете в скрипте init.d, добавьте эти строки.
4. Теперь создадим все необходимые для работы bind9 директории. Кому привычнее в mc, кому из консоли:
server:/# mkdir -p /var/lib/named/etc server:/# mkdir /var/lib/named/dev server:/# mkdir -p /var/lib/named/var/cache/bind server:/# mkdir -p /var/lib/named/var/run/bind/run
5. Переместите директорию с конфигурацией bind9 из /etc в /var/lib/named/etc:
server:/# mv /etc/bind /var/lib/named/etc
6. Создадим символическую ссылку на новую директорию с файлами конфигурации bind на случай если в дальнейшем вы соберётесь обновить пакет, это поможет избежать проблем.
server:/# ln -s /var/lib/named/etc/bind /etc/bind
7. Создадим необходимые устройства и установим права на каталоги
server:/# mknod /var/lib/named/dev/null c 1 3 server:/# mknod /var/lib/named/dev/random c 1 8 server:/# chmod 666 /var/lib/named/dev/null /var/lib/named/dev/random server:/# chown -R bind:bind /var/lib/named/var/* server:/# chown -R bind:bind /var/lib/named/etc/bind
8. Далее надо немного изменить стартовый скрипт демона sysklogd для того что бы сообщения bind попадали в syslog. Отредактировать надо файл /etc/default/sysklogd, измените там строку SYSLOGD="" на SYSLOGD="-u syslog -a /var/lib/named/dev/log". Опять же очень многие пытаются найти сточку SYSLOGD="" в файле /etc/init.d/sysklogd а её там нет и быть не должно – смотреть надо в директории /etc/default/sysklogd. Иногда sysklogd ругается на опцию "-u", тогда укажите SYSLOGD="-a /var/lib/named/dev/log".
И перезапуск службы:
server:/# /etc/init.d/sysklogd restart
Замечание: От себя добавлю, что при настройке в Debian Lenny и старше я уже службы такой не нашел. Появилась служба более глобального масштаба – rsyslog объединяющая две службы syslogd и klogd. Поэтому надо идти в папку /etc/rsyslog.d и создать там файл bind-chroot.conf (владелец root, прав достаточно будет 640)
server:/# touch /etc/rsyslog.d/bind-chroot.conf server:/# chown root:root /etc/rsyslog.d/bind-chroot.conf server:/# chmod 640 /etc/rsyslog.d/bind-chroot.conf server:/# vim /etc/rsyslog.d/bind-chroot.confДля того, чтобы Bind 9 на платформе Lenny помещенный в chroot сумел найти системный лог добавьте в этот файл только одну строчку:
$AddUnixListenSocket /var/lib/named/dev/log
Вроде бы всё, – можно настраивать сам сервер имен... Но давайте заранее создадим папку /var/lib/named/var/log для последующего хранения файла с логами:
server:/# mkdir /var/lib/named/var/log server:/# chown root:root /var/lib/named/var/log server:/# chmod 755 /var/lib/named/var/log
Вот теперь можно приступать к настройке DNS сервера.
НАСТРОЙКА BIND 9
1. I этап - настройка зон – создаем отдельный файл конфигураций для наших зон ( в данном случае у нас будет одна зона описывающая несуществующий домен .ex):
server:/# touch /var/lib/named/etc/bind/myzones.conf server:/# chown bind:bind /var/lib/named/etc/bind/myzones.conf
2. Теперь отредактируем файл конфигурации нашей зоны .ex (имя вашего домена)
server:/# vim /var/lib/named/etc/bind/myzones.conf
в файл вносим следующее (.ex - имя вашего домена)
zone "ex." { type master; file "/etc/bind/db.ex"; };
В данном случаем мы специально создаем «несуществующую зону», так как настраиваем BIND для локальной сети – основная задача настроить кэширующий ДНС с возможностью обработки локальных имен/адресов (посредством создания зоны .ex и прямой и обратной зоны для локальной сети 192.168.1.0/24)
3. Теперь создадим файл зоны (прямой) для локальной сети
server:/# touch /var/lib/named/etc/bind/db.ex server:/# chown bind:bind /var/lib/named/etc/bind/db.ex server:/# vim /var/lib/named/etc/bind/db.ex
и заполните файл как показано ниже
$TTL 86400 ; 1 day @ IN SOA ex. root.ex. ( 2009031404 ; serial 10800 ; refresh (3 hours) 900 ; retry (15 minutes) 604800 ; expire (1 week) 86400 ; minimum (1 day) ) @ IN NS ns.ex. ns A 127.0.0.1 server A 192.168.1.1 ; адрес вашего сервера в вашей сети
Замечание: Обратите внимание на так называемый серийный номер зоны(serial). Дело в том, что сервер имён не использует конфигурации с тем же серийным номером или младше чем был указан. Поэтому, всякий раз, когда Вы вносите исправления в любой из файлов зон, - обязательно "увеличивайте" этот номер на какое то значение. Я делаю так: за первую часть - беру дату последнего редактирования файла в фомате (YYYYMMDD)+ сколько раз редактировался этот файл в этот день (01,02,03,04...) best practice так сказать!
4. Теперь создадим файл обратной зоны для локальной сети local.rev
server:/# touch /var/lib/named/etc/bind/local.rev server:/# chown bind:bind /var/lib/named/etc/bind/local.rev server:/# vim /var/lib/named/etc/bind/local.rev
и заполните его:
$TTL 604800 @ IN SOA ex. root.ex. ( 2009031404 ; Serial 604800 ; Refresh 86400 ; Retry 2419200 ; Expire 604800 ) ; Negative Cache TTL ; @ IN NS localhost. 1 PTR server.ex.
5.Редактируем файл /var/lib/named/etc/bind/named.conf.options
server:/# vim /var/lib/named/etc/bind/named.conf.options
и впишите туда несколько опций усложняющих жизнь хакерам и отключим поддержку IPv6:
version "My DNS v.UnKnown"; allow-recursion {"homenet";}; allow-query {any;}; //auth-nxdomain no; # conform to RFC1035 - закомментируем listen-on-v6 { none; }; # отключим поддержку IPv6
6. Напоследок отредактируем файл /var/lib/named/etc/named.conf
server:/# vim /var/lib/named/etc/bind/named.conf
во первых включим в конце в конец файла наш файл зон
include "/etc/bind/myzones.conf";
В начале файла, до включения файла с опциями (named.conf.options), создадим список acl для указания, что будет обслуживать наш сервер BIND, указав нашу подсеть, обратную петлю и оба ДНС провайдера
acl homenet { 192.168.1.0/24; 127.0.0.1; 82.209.240.241; 82.209.243.241; };
Для возможности работы передачи зоны с подписью TSIG включаем rndc.key и указываем кто сможет управлять нашим сервером и по какому порту controls
include "/etc/bind/rndc.key"; controls { inet 127.0.0.1 port 953 allow { 127.0.0.1; } keys {rndc-key;}; };
И в конце файла добавляем настройку обратной зоны для локальной сети
zone "1.168.192.in-addr.arpa" { type master; file "/etc/bind/local.rev"; };
и подключаем файл с нашей зоной myzones.conf
include "/etc/bind/myzones.conf";
Для того, чтобы логи собирались в отдельный файл named.log, и не "сорили" в системные файлы – создадим в нашей "песочнице" (в папке, созданной ранее /var/lib/named/var/log), файл для логов и сделаем символическую ссылку в обычную папку log:
server:/# touch /var/lib/named/var/log/named.log server:/# chown bind:bind /var/lib/named/var/log/named.log server:/# chmod 666 /var/lib/named/var/log/named.log server:/# ln -s /var/lib/named/var/log/named.log /var/log/named.log
И добавим в файл конфигурации в самый конец детальную настройку работы логов:
logging { channel myfile { file "/var/log/named.log" versions 10 size 1m; severity dynamic; print-category yes; print-severity yes; print-time yes; }; category config { myfile; }; category default { myfile; }; category queries { myfile; }; // Вот LAME сервера лучше сразу сбрасывать в null. Достают они ну просто // катастрофически! (Для тех кто в танке, - это когда сервер не обслуживает // делегированную ему зону) category lame-servers { null; }; };
7. В итоге, если убрать комментарии и свести все воедино файл named.conf приобретет такой вид:
acl homenet { 192.168.1.0/24; 127.0.0.1; 82.209.240.241; 82.209.243.241; }; include "/etc/bind/named.conf.options"; include "/etc/bind/rndc.key"; controls { inet 127.0.0.1 port 953 allow { 127.0.0.1; } keys {rndc-key;}; }; zone "." { type hint; file "/etc/bind/db.root"; }; zone "localhost" { type master; file "/etc/bind/db.local"; }; zone "127.in-addr.arpa" { type master; file "/etc/bind/db.127"; }; zone "0.in-addr.arpa" { type master; file "/etc/bind/db.0"; }; zone "255.in-addr.arpa" { type master; file "/etc/bind/db.255"; }; zone "1.168.192.in-addr.arpa" { type master; file "/etc/bind/local.rev"; }; include "/etc/bind/myzones.conf"; logging { channel myfile { file "/var/log/named.log" versions 10 size 1m; severity dynamic; print-category yes; print-severity yes; print-time yes; }; category config { myfile; }; category default { myfile; }; category queries { myfile; }; category lame-servers { null; }; };
Замечание: Заметьте, что по умолчанию обратная зона в стандартной установке отключена и два файла конфигурации просто не задействованы: db.empty и zones.rfc1918 - с учетом того, что поддержка отключена в файле named.conf.local:
// Do any local configuration here // Consider adding the 1918 zones here, if they are not used in your // organization // include "/etc/bind/zones.rfc1918";Смело можно удалить все три этих файла, а из файла конфигурации named.conf, удалить в самом конце включение файла named.conf.local. Мы ведь уже создали свои файлы зон (прямую и обратную) для обслуживания локальной сети :)
8.Изменим файл /etc/resolv.conf, вписав туда свой домен первой строкой, в нашем случае это
search ex
9. Перезапускаем bind9 и перечитываем файлы зон
server:/# /etc/init.d/bind9 restart server:/# rndc reload
У меня оказалось, что утилита nslookup и dig не установлена – пришлось поставить пакеты hosts и dnsutils командой
server:/# apt-get install host dnsutils
Замечание: В Lenny и старше пакет host а не hosts!
10. И проверка на сервере:
server:/# nslookup > set q=any > localhost Server: 82.209.240.241 Address: 82.209.240.241#53 localhost origin = localhost mail addr = root.localhost serial = 1 refresh = 604800 retry = 86400 expire = 2419200 minimum = 604800 localhost nameserver = localhost. Name: localhost Address: 127.0.0.1 > 127.0.0.1 Server: 82.209.240.241 Address: 82.209.240.241#53 1.0.0.127.in-addr.arpa name = localhost. > ya.ru Server: 82.209.240.241 Address: 82.209.240.241#53 Non-authoritative answer: ya.ru mail exchanger = 10 mx1.yandex.ru. ya.ru mail exchanger = 10 mx2.yandex.ru. Name: ya.ru Address: 213.180.204.8 ya.ru nameserver = ns5.yandex.ru. Authoritative answers can be found from: ya.ru nameserver = ns1.yandex.ru. ya.ru nameserver = ns5.yandex.ru. mx1.yandex.ru internet address = 77.88.21.89
11. Проверка из локальной сети (Пуск->Выполнить->cmd):
Microsoft Windows XP [Версия 5.1.2600] (С) Корпорация Майкрософт, 1985-2001. C:\Documents and Settings\Dmitry Vl. Ivanov>nslookup Default Server: server.ex Address: 192.168.1.1 > set q=any > server.ex Server: server.ex Address: 192.168.1.1 server.ex internet address = 192.168.1.1 ex nameserver = ns.ex ns.ex internet address = 127.0.0.1
Настройка BIND 9 в chroot для Debian завершена!
Комментарии 8
- 1
Дмитрий Владимирович — Dec 02, 2014 at 02:36 PM
Спасибо за найденную ошибку в тексте. Исправлено.
По поводу AppArmor - ничего не скажу толком, по-моему это Ubuntu-специфичный пакет. На Debian - не встречался...
Владимир — Dec 02, 2014 at 01:37 AM
Вопрос. Вы создаете ссылку "ln -s /var/lib/named/var/log/named.log /var/log/bind.log", но в файле конфигурации ссылаетесь на файл "file "/var/log/named.log" versions 10 size 1m;" это опечатка? или я что-то пропустил.
Еще. У меня возникла проблема при перезапуске и старте Bind'а
/etc/init.d/bind9 start
выходила ошибка которую tail /var/log/syslog показывал
isc_stdio_open '/var/log/bind.log' failed: permission denied
после гугления оказалось что проблема в AppArmor.
Решение:
редкатируем файл конфигурации /etc/apparmor.d/usr.sbin.named и в конец файла вставляем следующее
#chroot
/var/lib/named/etc/bind/** rw,
/var/lib/named/var/cache/bind/ rw,
/var/lib/named/var/cache/bind/** rw,
/var/lib/named/var/run/bind/run/named.pid w,
/var/lib/named/var/run/bind/named.options r,
/var/lib/named/var/log/** rw,
/var/lib/named/dev/** r,
/var/lib/named/dev/log w,
далее перезагуржаем AppArmor командой /etc/init.d/apparmor restart и стартуем Bind9
может кому поможет.
Дмитрий Владимирович — Jul 13, 2010 at 07:57 PM
каюсь. забыл упомянуть что на клиентских машинках надо указать наш сервер первичным, а провайдера вторичным...
Дмитрий Владимирович — Jul 09, 2010 at 11:23 AM
-- с правами - Вы верно подметили. Их необходимо установить bind:bind. Именно от этого пользователя и работает Bind9. ему только при запуске нужны права root-a. Остальное -- соблюдение вопросов безопасности.
-- по поводу внутренних ресурсов провайдера -- добавьте его DNS адреса в обслуживание, или проставьте DNS сервер провайдера вторичным, наряду с нашим -- первичным
sd88 — Jul 09, 2010 at 09:14 AM
6* Аффтар маладец !
Только вот еще забыл написать, чтоб в /etc/resolv.conf было бы "nameserver 192.168.1.1".
А то будет вот так :
server can't find localhost: NXDOMAIN
В остальном респект !
ingvarr — Jul 04, 2010 at 10:29 PM
Несмотря на то, что дубликатами этой статьи замусорен весь интернет, в данной версии порадовало описание того, как справиться с rsyslogd и, собственно, как организовать вывод самого лога в файл.
Однако, размер лога оставался нулевым, сообщение же системы информировало об отсутствии доступа к файлу лога. Изменение собственника с root:adm на bind решило проблему, но не думаю, что это красивое решение.
И вопрос к автору: неужто вы сами запустили сеть с такими настройками? У меня они не работают. Как, кстати, пробиться на локальные адреса провайдера? Они блокированы (не прописаны). Но стоит выключить bind, и - оп-ля - ты уже на forum.lan. Это решается?
Только не стыдите - если бы соображал, то не читал бы подобных руководств ;) .
Дмитрий Владимирович — May 11, 2010 at 11:25 AM
Посмотрите в контактах есть всё...
studenteggg — May 04, 2010 at 04:12 PM
Извините если не туда, но как с админом сайта связаться?