настройка сервера имён DNS под linux

или как живётся bind9-у в chroot-е

Постановка задачи: У нас есть сеть, у нас есть сервер, у нас уже настроен интернет на сервере. Но вот беда, - у провайдера периодически падает сервер имён (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 - не встречался...

  2. Владимир — 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
    может кому поможет.

    1. Дмитрий Владимирович — Jul 13, 2010 at 07:57 PM

      каюсь. забыл упомянуть что на клиентских машинках надо указать наш сервер первичным, а провайдера вторичным...

    2. Дмитрий Владимирович — Jul 09, 2010 at 11:23 AM

      -- с правами - Вы верно подметили. Их необходимо установить bind:bind. Именно от этого пользователя и работает Bind9. ему только при запуске нужны права root-a. Остальное -- соблюдение вопросов безопасности.

      -- по поводу внутренних ресурсов провайдера -- добавьте его DNS адреса в обслуживание, или проставьте DNS сервер провайдера вторичным, наряду с нашим -- первичным

  3. sd88 — Jul 09, 2010 at 09:14 AM

    6* Аффтар маладец !
    Только вот еще забыл написать, чтоб в /etc/resolv.conf было бы "nameserver 192.168.1.1".
    А то будет вот так :

    server can't find localhost: NXDOMAIN

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

  4. ingvarr — Jul 04, 2010 at 10:29 PM

    Несмотря на то, что дубликатами этой статьи замусорен весь интернет, в данной версии порадовало описание того, как справиться с rsyslogd и, собственно, как организовать вывод самого лога в файл.
    Однако, размер лога оставался нулевым, сообщение же системы информировало об отсутствии доступа к файлу лога. Изменение собственника с root:adm на bind решило проблему, но не думаю, что это красивое решение.
    И вопрос к автору: неужто вы сами запустили сеть с такими настройками? У меня они не работают. Как, кстати, пробиться на локальные адреса провайдера? Они блокированы (не прописаны). Но стоит выключить bind, и - оп-ля - ты уже на forum.lan. Это решается?
    Только не стыдите - если бы соображал, то не читал бы подобных руководств ;) .

    1. Дмитрий Владимирович — May 11, 2010 at 11:25 AM

      Посмотрите в контактах есть всё...

  5. studenteggg — May 04, 2010 at 04:12 PM

    Извините если не туда, но как с админом сайта связаться?

  • 1

Комментарии отключены, сожалеем