demon.pmi.basnet.by - авторская страница разработчика сайтов.

Сервер имён - DNS (Bind9) в chroot-е

Постановка задачи: У нас есть сеть, у нас есть сервер, у нас уже настроен интернет на сервере. Но вот беда, - у провайдера периодически падает сервер имён (DNS) или частенько оказывается так сильно загружен, что скорость отдачи зон (резолвинг) оставляет желать лучшего. Устанавливаем собственный кэширующий DNS сервер (bind 9) с вымышленной зоной исключительно для нашей сети. C последующим помещением его в "песочницу" (chroot). (У нас нет купленного доменного имени, но есть статический ip)

УСТАНОВКА BIND 9


1. Устанавливаем Bind 9


server:/# apt-get install bind9

2. Если все установилось без ошибок то останавливаем его


server:/# /etc/init.d/bind9 stop

Из соображений безопасности лучше запускать Bind в chroot среде, для этого проделайте несколько простых операций.


3. Отредактируйте файл /etc/default/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
Замечание: Здесь важно то, что изменять надо файл в папке 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
Замечание: От себя добавлю, что при настройке в 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...) Так, по-моему, удобнее!

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


# vim /var/lib/named/etc/bind/named.conf.options

и впишите туда

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 root:adm /var/lib/named/var/log/named.log
server:/# chmod 640 /var/lib/named/var/log/named.log
server:/# ln -s /var/lib/named/var/log/named.log /var/log/bind.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 завершена!


Написать комментарий

  • Обязательные для заполнения поля помечены знаком *.

Если у Вас возникли проблемы с чтением кода, нажмите на картинку с кодом для нового кода.
 

sitystroyinfo
Ответов: 4
Комментарий
Подскажите, пожалуйста
Ответ #6 дата : Mon July 19, 2010, 09:14:01
Добавил в свои закладки. Теперь буду вас намного почаще читать!

admin
Ответов: 2
Комментарий
Автор
Ответ #5 дата : Tue July 13, 2010, 09:51:49
2:sd88

В моем случае в /etc/resolv.conf указаны DNS провайдера. Это есть в Первоначальной настройке сети: dns-nameservers 82.209.240.241 82.209.243.241

2:ingvarr
>>Изменение собственника с root:adm на bind решило проблему, но не думаю, что это красивое решение.

Увы у меня доступ появился только с правами 777 с владельцев bind... Предложите другое решение, я буду только рад применить...
Плюс я забыл сказать, что сделал символическую ссылку из песочницы в обычную папку /var/log/

>>Как, кстати, пробиться на локальные адреса провайдера? Они блокированы (не прописаны).

Увы я не понимаю Вас( Эта настройка проверена на 4 серверах, платформы как Etch, так и Lenny
Последняя правка: July 13, 2010, 09:52:18 пользователем admin  

sd88
Ответов: 4
Комментарий
Re: Сервер имён - <span>DNS (Bind9) в chroot-е</span>
Ответ #4 дата : Fri July 09, 2010, 09:14:37
6* Аффтар маладец !
Только вот еще забыл написать, чтоб в /etc/resolv.conf было бы "nameserver 192.168.1.1".
А то будет вот так :

server can't find localhost: NXDOMAIN

В остальном респект !

ingvarr
Ответов: 4
Комментарий
Re: Сервер имён - <span>DNS (Bind9) в chroot-е</span>
Ответ #3 дата : Sun July 04, 2010, 22:29:35
Несмотря на то, что дубликатами этой статьи замусорен весь интернет, в данной версии порадовало описание того, как справиться с rsyslogd и, собственно, как организовать вывод самого лога в файл.
Однако, размер лога оставался нулевым, сообщение же системы информировало об отсутствии доступа к файлу лога. Изменение собственника с root:adm на bind решило проблему, но не думаю, что это красивое решение.
И вопрос к автору: неужто вы сами запустили сеть с такими настройками? У меня они не работают. Как, кстати, пробиться на локальные адреса провайдера? Они блокированы (не прописаны). Но стоит выключить bind, и - оп-ля - ты уже на forum.lan. Это решается?
Только не стыдите - если бы соображал, то не читал бы подобных руководств ;) .

admin
Ответов: 2
Комментарий
Re: Сервер имён - DNS (Bind9) в chroot-е
Ответ #2 дата : Thu May 06, 2010, 15:31:36
В контактах есть аська и телефон.
Последняя правка: May 06, 2010, 15:31:58 пользователем admin  

studenteggg
Ответов: 4
Комментарий
хороший сайт
Ответ #1 дата : Tue May 04, 2010, 16:12:40
Извините если не туда, но как с админом сайта связаться?