понедельник, 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