Установка и настройка DNS сервера Bind9

Обновил статью 12.10.2009

Bind — давно идёт считается штатным DNS-сервером в любой *nix системе. Кстати, помимо bind существует много других серверов, таких как NDS, Unbound, PowerDNS, и много других. У каждого свои преимущества и недостатки.

Идём в папку с портами и ставим bind последней версии (на момент написания статьи была версия 9.5) (Когда вылезет окошко, обязательно выбираем опцию Replace base BIND with this version)

#cd /usr/ports/dns/bind95
#make install clean

Далее  переходим в каталог /etc/named для настройки сервера. Вот минимальные настройки для работоспособности сервера.

options {
// Relative to the chroot directory, if any
directory       "/etc/namedb";
pid-file        "/var/run/named/pid";
dump-file       "/var/dump/named_dump.db";
statistics-file "/var/stats/named.stats";

listen-on       { 127.0.0.1; 10.0.52.254; }; // - здесь указываем интерфейсы, которые слушает DNS сервер (собственно, только эти адреса можно указывать в качестве DNS серверов на клиентах)
};

zone "." { type hint; file "named.root"; };

zone "lan" {
type master;
file "master/lan.rev";
};

zone "0.0.127.IN-ADDR.ARPA" {
type master;
file "master/localhost.rev";
};

Теперь нужно создать localhost.rev. В папке /etc/named должны быть 2 файла:PROTO.localhost.rev и make-localhost. Если у вас их нет, то можете взять их отсюда (ниже приведён листинг этих файлов)

#cat PROTO.localhost.rev
;       From: @(#)localhost.rev 5.1 (Berkeley) 6/30/90
; $FreeBSD: src/etc/namedb/PROTO.localhost.rev,v 1.6 2000/01/10 15:31:40 peter Exp $
;
; This file is automatically edited by the `make-localhost' script in
; the /etc/namedb directory.
;

$TTL    3600
@       IN      SOA     @host@. root.@host@.  (
@date@  ; Serial
3600    ; Refresh
900     ; Retry
3600000 ; Expire
3600 )  ; Minimum
IN      NS      @host@.
1       IN      PTR     localhost.@domain@.

========================================

$cat make-localhost

#!/bin/sh
#
# $FreeBSD: src/etc/namedb/make-localhost,v 1.6.8.1 2004/09/30 23:36:07 dougb Exp $
#
# make-localhost - edit the appropriate local information into
# /etc/namedb/localhost.rev
#

PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin
export PATH

if [ "`hostname -s`" != "`hostname`" ]; then
# hostname must contain domain

host=`hostname -s`
fullhost=`hostname`
domain=`echo $fullhost | sed "s/^$host\.//"`
else
host=`hostname`

if [ -z "$1" ]; then
echo -n 'Enter your domain name: '
read domain
else
domain="$1"
fi

# strip trailing dot, if any
domain=`echo $domain | sed 's/\.$//'`
fullhost="$host.$domain"
fi

date=`date +"%Y%m%d"`
mkdir -p master
mv -f master/localhost.rev master/localhost.rev.BAK 2>/dev/null

exec sed -e "s/@host@/$fullhost/g" \
-e "s/@domain@/$domain/g" \
-e "s/@date@/$date/g" \
< PROTO.localhost.rev > master/localhost.rev

Теперь нужно сгенерировать localhost.rev с помощью этих 2 файлов.

#sh make-localhost

Собственно теперь в папке master появился файл localhost.rev. Если это не так — смотрите логи.

Теперь опишем зону lan.

$cat /etc/namedb/master/lan.rev

$ORIGIN lan.
$TTL    86400
@    IN      SOA     ns.domain.ua. hostmaster.domain.ua. (
2006060537      ; Serial
86400           ; Refresh
7200            ; Retry
604800          ; Expire
86400 )         ; Default Minimum TTL
IN      NS      domain.ua.
ns1             IN     A        15.15.15.15
my              IN      A       13.13.13.13
*.my            IN      A       13.13.13.13
*               IN      A       14.14.14.14

А теперь расскажу, что здесь описано. При запросе через nslookup для имени blabla.lan — будет возвращаться 14.14.14.14, при запросе blabla.my.lan будет возвращаться 13.13.13.13, при запросеns1.lan будет — 15.15.15.15

Переходим к настройке запуска сервера. Добавляем такие строчки в /etc/rc.conf

named_enable="YES"
named_flags="-u bind"

что бы сервис запускался при запуске ОС. Запускаем сервис

#/etc/rc.d/named start

Теперь настало время проверить собственно работу нашего DNS сервера. Для этого добавим в файл /etc/resolv.conf первой строчкой такую:

nameserver 127.0.0.1

Теперь выполним nslookup для резолва имён:

$ nslookup meta.ua
Server:         127.0.0.1
Address:        127.0.0.1#53

Non-authoritative answer:
Name:   meta.ua
Address: 194.0.131.18

Если у вас такое, значит сервер работает. Так же проверим второй адрес (10.0.0.52.254 который мы вносили в файл /etc/named/named.conf) который мы будем прописывать клиентам в качествеDNS сервера:

$ nslookup ukr.net 10.0.52.254
Server:         10.0.52.254
Address:        10.0.52.254#53

Non-authoritative answer:
Name:   ukr.net
Address: 195.214.195.105

Видим, что всё работает.

Для внесения изменений в конфиги требуется их перечитка. Перечитать конфиги можно командной

#/etc/rc.d/named reload

Всё работает. Теперь можно немного добавить функциональности, а именно смотреть содержимое кеша, очищать его, да и много другого, что представляется через rndc. Что бы добавить возможность управлять DNS-сервером немного подправим конфиги. И так, после установки bind’a у нас в каталоге есть ещё один файл, а именно rndc.conf.sample, который копируем в rndc.conf и начинаем править. Приводим его к такому виду:

key "rndc-key" {
algorithm hmac-md5;
secret "ejjddRFsdkljrRdlj45jdDFdfkUJJGJddOOJGdd";
};
options {
default-key "rndc-key";
default-server 127.0.0.1;
default-port 953;
};

Сам ключ secret у вас будет другим. Теперь добавляем такое в named.conf:

key "rndc-key" {
algorithm hmac-md5;
secret "ejjddRFsdkljrRdlj45jdDFdfkUJJGJddOOJGdd";
};
controls {
inet 127.0.0.1 port 953
allow { 127.0.0.1; } keys { "rndc-key"; };
};

Теперь перечитываем конфиги и смотрим sockstat: у нас должен слушаться ещё порт 953. Если всё хорошо, значит всё правильно сделали. Если нет — смотрите логи.

Я заметил, что при устновке версий 9.5 и выше у меня в логах появляется такая строка:

working directory is not writeable

Это побеждается легко. Открываем файл /etc/mtree/BIND.chroot.dist и находим и приводим его к такому виду:

/set type=dir uname=root gname=wheel mode=0755
.
dev             mode=0555
..
etc
namedb uname=bind
dynamic uname=bind
..
master  uname=bind
..
slave   uname=bind
..
..
..
/set type=dir uname=bind gname=wheel mode=0755
var             uname=root
dump
..
log
..
run
named
..
..
stats
..
..
..

то есть, добавили uname=bind где этого не хватает. Собственно, для чего это нужно. Поскольку у меня bind запускается от имени юзера bind, а согласно этому файлу (до внесения изменений) права принудительно выставляли владельцем юзера root, поэтому юзер bind имел толькоReadOnly права. После изменений нужно перезапустить named.

Иногда бывает полезным очистить кэш DNS. Например, вы зарегистрировали новый адрес, а изменения ещё не пришли в силу. Для этого можно воспользоваться командой

#rndc flush internal (если вы используете версию 9.2.0 или выше)
#rndc stop && rndc start (если версия 9.0 и выше)
#ndc stop && sleep 30 && ndc start (если у вас версия 8 )
# cat /dev/null > /var/named/etc/namedb/named.run && /etc/rc.d/named restart (грубый сброс)

 

Примечание1

Очень полезный обзор, почему нельзя делать CNAME на корень доменной зоны

Примечание2

Если у вас проблемы с DNS сервером, рекомендую ознакомиться

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *