понедельник, 6 апреля 2009 г.

Настройка кэширующего DNS

Все команды задавал от имени root.

Установка Bind в chroot окружении
Устанавил Bind 9.
server:/# apt-get install bind9
Все установилось без ошибок (проверить можно командой 'server:/# named -v' — должна отобразится версия bind) останавил его.
server:/# /etc/init.d/bind9 stop
Из соображений безопасности запускать буду Bind в chroot среде (“песочнице), а вот как я это делал:
1. Отредактировал файл '/etc/default/bind9', туда добавил строку о среде chroot, которая будет находится у меня в '/var/lib/dns', изменив строку OPTIONS=” -u bind на OPTIONS=”-u bind -t /var/lib/dnsт.е. должно получится что-то типа:
OPTIONS=”-u bind -t /var/lib/dns”
# Set RESOLVCONF=no to not run resolvconf
RESOLVCONF=yes
2. Теперь создал все необходимые для работы bind9 директории:
server:/# mkdir -p /var/lib/dns/etc
server:/# mkdir /var/lib/dns/dev
server:/# mkdir -p /var/lib/dns/var/cache/bind
server:/# mkdir -p /var/lib/dns/var/run/bind/run
3. Переместил директорию с конфигурацией bind9 из '/etc' в '/var/lib/dns/etc':
server:/# mv /etc/bind /var/lib/dns/etc
4. Создал символическую ссылку на новую директорию с файлами конфигурации bind на случай если в дальнейшем соберусь обновить пакет, это поможет избежать проблем.
server:/# ln -s /var/lib/dns/etc/bind /etc/bind
5. Создал необходимые устройства и устанавил права на каталоги
server:/# mknod /var/lib/dns/dev/null c 1 3
server:/# mknod /var/lib/dns/dev/random c 1 8
server:/# chmod 666 /var/lib/dns/dev/null /var/lib/dns/dev/random
server:/# chown -R bind:bind /var/lib/dns/var/*
server:/# chown -R bind:bind /var/lib/dns/etc/bind
    ***В дистрибутиве Etch надо изменить стартовый скрипт демона sysklogd для того что бы сообщения bind попадали в syslog для этого надо отредактировать файл '/etc/default/sysklogd' , изменив там строку SYSLOGD=”” на SYSLOGD=”-u syslog -a /var/lib/dns/dev/log”. Иногда sysklogd ругается на опцию «-u»,тогда надо SYSLOGD=”-a /var/lib/dns/dev/log. И перезапуск службы:
server:/# /etc/init.d/sysklogd restart
*** В дистрибутиве Lenny я не нашел стартовый скрипт демона sysklogd, однако сообщения bind попадали в syslog, возможно из-за символической ссылки.

Настройка Bind
1. Cоздал отдельный файл конфигураций для моих зон ( в данном случае у меня будет одна зона описывающая виртуальный домен .ex):
server:/# touch /var/lib/named/etc/bind/myzones.conf
server:/# chown bind:bind /var/lib/named/etc/bind/myzones.conf
2. Редактирую файл конфигурации моей зоны .ex (имя моего домена) он должен выглядеть примерно так:
zone "ex." {
type master;
file "/etc/bind/db.ex";
};
В данном случае я специально создал «несуществующую зону», т.к. настраивал Bind в роли кэширующего DNS с возможностью обработки локальных имен/адресов моих локальных сетей.
3. Создал файл и назначил права доступа прямой зоны для локальных сетей.
server:/# touch /var/lib/dns/etc/bind/db.ex
server:/# chown bind:bind /var/lib/dns/etc/bind/db.ex
Отредактировал файл:
$TTL 86400 ; 1 day
@ IN SOA server root.server (
2009032601 ; serial
10800 ; refresh (3 hours)
900 ; retry (15 minutes)
604800 ; expire (1 week)
86400 ; minimum (1 day)
)
@ IN NS server

server A 192.168.0.1 ; адрес сервера для 1-й сети
server A 192.165.15.1 ; адрес сервера для 2-й сети
Внимание: в конце файла обязательно должна быть пустая строка!!!
4. Создал файл и назначил права доступа обратной зоны для локальных сетей.
server:/# touch /var/lib/dns/etc/bind/local.rev
server:/# chown bind:bind /var/lib/dns/etc/bind/local.rev
Отредактировал файл:
$TTL 604800
@ IN SOA server.ex. root.server.ex. (
2009032601 ; serial
604800 ; refresh
86400 ; retry
2419200 ; expire
604800 ; negative cache TTL
)
@ IN NS server.ex.
1.0.168 IN PTR server.ex.
1.15.165 IN PTR server.ex.

Внимание: в конце файла обязательно должна быть пустая строка!!!
5. Отредактировал файл '/var/lib/dns/etc/named.conf.options' до такого вида:
options {
directory "/var/cache/bind";

version "SecurityDNS v.USSR";
allow-recursion { "net"; };
allow-query { any; };
//auth-nxdomain no; # conform to RFC1035
listen-on-v6 { none; };
# отключил поддержку IPv6
};
6. Отредактировал файл '/var/lib/named/etc/named.conf'.
В начале файла, до включения файла с опциями (named.conf.options), создал список acl для указания, что будет обслуживать мой сервер Bind, указав свои подсети, обратную петлю, адрес сетевой карты, смотрящей в интернет, и оба DNS провайдера:
acl "net" {
192.168.0.0/24;
192.165.15.0/24;
127.0.0.1;
212.98.185.103;
212.98.160.50;
212.98.160.65;
};
Для возможности работы и передачи зоны с подписью TSIG включил rndc.key и указал, кто сможет управлять моим сервером и по какому порту:
include "/etc/bind/rndc.key";
controls {
inet 127.0.0.1 port 953 allow { 127.0.0.1; } keys {rndc-key;};
};
В конце файла добавил настройки обратной зоны для локальных сетей:
zone "192.in-addr.arpa" {
type master;
file "/etc/bind/local.rev";
};
Ну и последним (последняя команда) подключил прямые зоны:
include "/etc/bind/myzones.conf";
7. Подведя итоги пункта 6, получил файл named.conf следующего вида:
acl "net" {
192.168.0.0/24;
192.165.15.0/24;
127.0.0.1;
212.98.185.103;
212.98.160.50;
212.98.160.65;
};

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 "192.in-addr.arpa" {
type master;
file "/etc/bind/local.rev";
};

include "/etc/bind/myzones.conf";
С учетом моих настроек у меня оказались не задействованы следующие файлы 'db.empty', 'zones.rfc1918' и 'named.conf.local' естественно я их удалил.
8. Поправил следующие файлы:
/etc/resolv.conf — добавил в начале файла следующие строки (вписал свой домен):
search server.ex
nameserver 127.0.0.1
/etc/hosts.conf добавил в начале файла следующую строку:
order hosts, bind
/etc/hosts — вписал строки после строки '127.0.0.1 localhost':
192.168.0.1 server.ex server
192.165.15.1 server.ex server
9. Добавил в свой фаервол следующие правила:
# DNS rndc сервер на Lo разрешаю. (обход connection refused)
/sbin/iptables -A OUTPUT -p tcp -m tcp -o lo --dport 953 --sport 1024:6553 -j ACCEPT
# разрешаю доступ DNS-серверу наружу
/sbin/iptables -A OUTPUT -p tcp --dport 53 -j ACCEPT
/sbin/iptables -A OUTPUT -p udp --dport 53 -j ACCEPT
/sbin/iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
10. Запустил Bind.
server:/# /etc/init.d/bind9 start
server:/# rndc reload
11. Проверил работоспособность под Debian:
serverd:/etc/init.d# nslookup
> set q=any
> localhost
Server: 127.0.0.1
Address: 127.0.0.1#53

localhost
origin = localhost
mail addr = root.localhost
serial = 2
refresh = 604800
retry = 86400
expire = 2419200
minimum = 604800
localhost nameserver = localhost.
Name: localhost
Address: 127.0.0.1
localhost has AAAA address ::1
> 127.0.0.1
Server: 127.0.0.1
Address: 127.0.0.1#53

1.0.0.127.in-addr.arpa name = localhost.
> google.ru
Server: 127.0.0.1
Address: 127.0.0.1#53

Non-authoritative answer:
google.ru mail exchanger = 10 smtp2.google.com.
google.ru mail exchanger = 10 smtp3.google.com.
google.ru mail exchanger = 10 smtp4.google.com.
google.ru mail exchanger = 10 smtp1.google.com.
Name: google.ru
Address: 72.14.221.104
Name: google.ru
Address: 74.125.77.104
Name: google.ru
Address: 216.239.59.104
google.ru
origin = ns1.google.com
mail addr = dns-admin.google.com
serial = 2009033100
refresh = 21600
retry = 3600
expire = 1209600
minimum = 300
google.ru nameserver = ns3.google.com.
google.ru nameserver = ns1.google.com.
google.ru nameserver = ns4.google.com.
google.ru nameserver = ns2.google.com.

Authoritative answers can be found from:
google.ru nameserver = ns1.google.com.
google.ru nameserver = ns3.google.com.
google.ru nameserver = ns2.google.com.
google.ru nameserver = ns4.google.com.
ns2.google.com internet address = 216.239.34.10
ns3.google.com internet address = 216.239.36.10
ns4.google.com internet address = 216.239.38.10
serverd:/etc/init.d# dig @server.ex google.com

; <<>> DiG 9.5.1-P1 <<>> @server.ex google.com
; (2 servers found)
;; global options: printcmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 28297
;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 4, ADDITIONAL: 4

;; QUESTION SECTION:
;google.com. IN A

;; ANSWER SECTION:
google.com. 300 IN A 74.125.67.100
google.com. 300 IN A 209.85.171.100
google.com. 300 IN A 74.125.45.100

;; AUTHORITY SECTION:
google.com. 345600 IN NS ns1.google.com.
google.com. 345600 IN NS ns3.google.com.
google.com. 345600 IN NS ns4.google.com.
google.com. 345600 IN NS ns2.google.com.

;; ADDITIONAL SECTION:
ns1.google.com. 172741 IN A 216.239.32.10
ns2.google.com. 172740 IN A 216.239.34.10
ns3.google.com. 172740 IN A 216.239.36.10
ns4.google.com. 172740 IN A 216.239.38.10

;; Query time: 107 msec
;; SERVER: 192.168.0.1#53(192.168.0.1)
;; WHEN: Mon Jan 1 00:39:58 2001
;; MSG SIZE rcvd: 212

serverd:/etc/init.d# dig @server.ex google.com

; <<>> DiG 9.5.1-P1 <<>> @server.ex google.com
; (2 servers found)
;; global options: printcmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 27974
;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 4, ADDITIONAL: 4

;; QUESTION SECTION:
;google.com. IN A

;; ANSWER SECTION:
google.com. 273 IN A 74.125.45.100
google.com. 273 IN A 74.125.67.100
google.com. 273 IN A 209.85.171.100

;; AUTHORITY SECTION:
google.com. 345573 IN NS ns1.google.com.
google.com. 345573 IN NS ns4.google.com.
google.com. 345573 IN NS ns3.google.com.
google.com. 345573 IN NS ns2.google.com.

;; ADDITIONAL SECTION:
ns1.google.com. 172714 IN A 216.239.32.10
ns2.google.com. 172713 IN A 216.239.34.10
ns3.google.com. 172713 IN A 216.239.36.10
ns4.google.com. 172713 IN A 216.239.38.10

;; Query time: 2 msec
;; SERVER: 192.168.0.1#53(192.168.0.1)
;; WHEN: Mon Jan 1 00:40:25 2001
;; MSG SIZE rcvd: 212
И на машине входящей в сеть под управлением
Windows XP:
Microsoft Windows XP [Версия 5.1.2600]

(С) Корпорация Майкрософт, 1985-2001.
C:\Documents and Settings\Администратор>nslookup
Default Server: server.ex
Address: 192.168.0.1
> set q=any
> server.ex
Server: server.ex
Address: 192.168.0.1

server.ex internet address = 192.165.15.1
server.ex internet address = 192.168.0.1
ex nameserver = server.ex

3 комментария:

Unknown комментирует...

"В дистрибутиве Etch надо изменить стартовый скрипт демона sysklogd для того что бы сообщения bind попадали в syslog для этого надо отредактировать файл '/etc/default/sysklogd' , изменив там строку SYSLOGD=”” на SYSLOGD=”-u syslog -a /var/lib/dns/dev/log”. Иногда sysklogd ругается на опцию «-u»,тогда надо SYSLOGD=”-a /var/lib/dns/dev/log”. И перезапуск службы:"

А ничего, что sysklogd ведет аудит не только за сервером имен?)))))

ты же переменную на все предлагаешь поменять.

Руслан aka Dethroner комментирует...

"А ничего, что sysklogd ведет аудит не только за сервером имен?)))))

ты же переменную на все предлагаешь поменять."

Такое решение мне подсказал знакомый, который меня на Debian и подсадил. По крайней мере мне это помогло о_О Если ты можешь подсказать более корректное решение я буду только рад. Все таки я сюда выкладываю мои решения, т.е. блог выступает в роли, так сказать, лабораторной тетради. А ввиду моих не очень глубоких познаний, тут могут быть многие вещи реализованы не совсем верно. Буду рад, если люди которые их заметят будут поправлять или хотя бы давать ценные решения по их устранению. ;)

Руслан aka Dethroner комментирует...

Разобрался более подробно с логом.В Lenny появилась служба более глобального масштаба – rsyslog объединяющая две службы syslogd и klogd. Поэтому надо идти в папку /etc/rsyslog.d и создать файл bind-chroot.conf:
'touch /etc/rsyslog.d/bind-chroot.conf'
'chown root:root /etc/rsyslog.d/bind-chroot.conf'
'chmod 640 /etc/rsyslog.d/bind-chroot.conf'
В созданный файл
'nano /etc/rsyslog.d/bind-chroot.conf'
внести единственную строчку - '$AddUnixListenSocket /var/lib/named/dev/log'

Помимо этого надо заранее создать указанную папку:
'mkdir /var/lib/named/var/log'
'chown root:root /var/lib/named/var/log'
'chmod 755 /var/lib/named/var/log'

На этом вроде и все.