BIND9 (методическое пособие)
Содержание
Архитектура DNS
root(.)
gTLD
ccTLD
Домены, поддомены, псевдо-поддомены, зоны прямые и обратные
Делегирование зон
Трансфер зон
Рекурсивный и нерекурсивный запрос
Stub-resolver. Тупиковый резолвер с кэшем поддерживает только рекурсивный запрос. (win: DNS-client) TSIG протокол позволяет аутентифицировать передачу данных между DNS-серверами. Можно проверять подлинность данных при передаче зон, рекурсивных запросах, динамических обновлениях. Сами данные не шифруются, но подлинность проверяется. TSIG использует метки времени для предотвращения атаки повторения пакетов.
DNSSEC
nslookup
Пример dns запроса на сервер 10.13.0.101 - рекурсия разрешена:
root@netctrl-01:/etc/bind# nslookup www.ru. 10.13.0.101 Server: 10.13.0.101 Address: 10.13.0.101#53 Non-authoritative answer: Name: www.ru Address: 194.87.0.50
Пример dns запроса на сервер 10.13.0.101 - рекурсия запрещена:
root@netctrl-01:/etc/bind# nslookup www.ru. 10.13.0.101 Server: 10.13.0.101 Address: 10.13.0.101#53 ** server can't find www.ru: REFUSED
dig
Пример запроса при помощи команды dig. Рекурсия запрещена
root@netctrl-01:/etc# dig +all ya.ru. ; <<>> DiG 9.8.4-rpz2+rl005.12-P1 <<>> +all ya.ru. ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: REFUSED, id: 36103 ;; flags: qr rd; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 0 ;; WARNING: recursion requested but not available ;; QUESTION SECTION: ;ya.ru. IN A ;; Query time: 0 msec ;; SERVER: 127.0.0.1#53(127.0.0.1) ;; WHEN: Thu Feb 20 16:21:58 2014 ;; MSG SIZE rcvd: 23
Рекурсия разрешена
root@netctrl-01:/etc/bind# dig +trace ya.ru.
; <<>> DiG 9.8.4-rpz2+rl005.12-P1 <<>> +trace ya.ru.
;; global options: +cmd
. 510544 IN NS m.root-servers.net.
. 510544 IN NS b.root-servers.net.
. 510544 IN NS a.root-servers.net.
. 510544 IN NS g.root-servers.net.
. 510544 IN NS k.root-servers.net.
. 510544 IN NS f.root-servers.net.
. 510544 IN NS d.root-servers.net.
. 510544 IN NS j.root-servers.net.
. 510544 IN NS l.root-servers.net.
. 510544 IN NS h.root-servers.net.
. 510544 IN NS e.root-servers.net.
. 510544 IN NS i.root-servers.net.
. 510544 IN NS c.root-servers.net.
;; Received 512 bytes from 127.0.0.1#53(127.0.0.1) in 3 ms
ru. 172800 IN NS a.dns.ripn.net.
ru. 172800 IN NS b.dns.ripn.net.
ru. 172800 IN NS d.dns.ripn.net.
ru. 172800 IN NS e.dns.ripn.net.
ru. 172800 IN NS f.dns.ripn.net.
;; Received 335 bytes from 128.63.2.53#53(128.63.2.53) in 191 ms
ya.ru. 345600 IN NS ns1.yandex.ru.
ya.ru. 345600 IN NS ns2.yandex.ru.
;; Received 154 bytes from 193.232.156.17#53(193.232.156.17) in 288 ms
ya.ru. 7200 IN A 213.180.204.3
ya.ru. 7200 IN A 93.158.134.3
ya.ru. 7200 IN A 213.180.193.3
ya.ru. 7200 IN NS ns1.yandex.ru.
ya.ru. 7200 IN NS ns2.yandex.ru.
;; Received 202 bytes from 213.180.193.1#53(213.180.193.1) in 47 ms
Сервер имен BIND9
Управление
Проверяет конфиг сервера имен
named-checkconf
Перезагружает конфиг и зоны
rndc reload
Перезагружает только изменившиеся зоны
rndc reconfig
Запуск
service bind9 start
Состояние сервера
rndc status
Сброс кэша
rndc flush
Конфигурация и файлы зон по-умолчанию лежат в /etc/bind/
Опции
Списки доступа
acl network1 {
1.2.3.0/24;
192.168.0.0/20;
};
acl GoodDns {
1.2.3.4;
};
Ограничение на трансфер зон и запросы
allow-transfer {
localhost;
GoodDns;
};
allow-query {
any;
};
Настройка зоны и подключение файла зоны
zone "example.com" {
type master;
file "/etc/bind/db.example.com.";
allow-query {
any;
};
};
Зона прямого просмотра
Зоны прямого просмотра делегируются нам владельцем родительского домена.
Пример файла зоны, для которой мы являемся мастером (SOA ns1.model.local.) Сервер ns.example.com. указан в качестве вторичного.
Параметры времени жизни записи:
- TTL - время, на которое запись считается действительной, после выдачи сервером. Записи в кэше хранятся в течение TTL.
- Negative Cache TTL - время действия ответа об отсутствии записи (NXDOMAIN). Запись о том, что запрошенное имя не существует хранится в кэше на это время.
TTL можно задавать отдельно для каждой записи. Negative Cache TTL - действует на зоны в целом.
;
$ORIGIN model.local.
$TTL 1h
;
@ IN SOA ns1.model.local. hostmaster.model.local. (
2014023001 ; Serial Number
10800 ; refresh
3600 ; retry
604800 ; expire
86400 ) ; Negative Cache TTL
;
IN NS ns1.model.local.
IN NS ns.example.com.
IN MX 10 mail1
;
gw IN A 10.13.0.1
; несколько имен на один адрес
ns1 IN A 10.13.0.2
net-ctrl-1 IN A 10.13.0.2
mail1 IN A 10.13.0.10
front2 IN A 10.13.0.11
back1 IN A 10.13.0.20
back2 IN A 10.13.0.21
; несколько адресов на одно имя - балансировка
back IN A 10.13.0.20
IN A 10.13.0.21
stor1 IN A 10.13.0.30
stor2 IN A 10.13.0.31
stor-vip IN A 10.13.0.40
front-vrrp IN A 10.13.0.50
www IN CNAME model.local.
bc IN A 10.13.0.255
;
; users
user1 IN CNAME back.model.local.
www.user1 IN CNAME back.model.local.
user2 IN CNAME back.model.local.
www.user2 IN CNAME back.model.local.
;
Зона обратного просмотра
Зона обратного просмотра управляется владельцем диапазона ip адресов.
Пример файла зоны обратного просмотра, для которой мы являемся мастером
;
$ORIGIN 0.13.10.IN-ADDR.ARPA.
$TTL 1h
;
@ IN SOA ns1.model.local. hostmaster.model.local. (
2014023001 ; Serial Number
10800 ; refresh
3600 ; retry
604800 ; expire
86400 ) ; min TTL
;
IN NS ns1.model.local.
;
2 IN PTR ns1.model.local.
101 IN PTR netctrl-01.model.local.
255 IN PTR bc.model.local.
;
Зоны по-умолчанию
Зона типа hint для домена точки со списком корневых серверов. Файл зона необходимо периодически обновлять с сервера ftp://ftp.internic.net/domain/named.cache
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";
};
Пример прямой и обратной зоны замыкания на себя, входящих в дистрибутив BIND9
; BIND data file for local loopback interface
;
$TTL 604800
@ IN SOA localhost. root.localhost. (
2 ; Serial
604800 ; Refresh
86400 ; Retry
2419200 ; Expire
604800 ) ; Negative Cache TTL
;
@ IN NS localhost.
@ IN A 127.0.0.1
@ IN AAAA ::1
;
$TTL 604800
@ IN SOA localhost. root.localhost. (
1 ; Serial
604800 ; Refresh
86400 ; Retry
2419200 ; Expire
604800 ) ; Negative Cache TTL
;
@ IN NS localhost.
1.0.0 IN PTR localhost.
Типы ресурсных записей (RR)
SOA
SOA запись в файле зоны должна быть только одна. В файле она должна стоять первой. Запись SOA определяет какой сервер является владельцем зоны и какие на зону установлены параметры. После записи SOA надо обязательно указать IN NS запись с тем-же сервером, что и в заголовке.
Пример: домен example.com обслуживается серверами ns.example.com и ns.examle.net. После указания директивы $ORIGIN сервер автоматически допишет за нас все неполные dns имена (таким образом hostmaster читается как hostmaster.example.com). Имя сервера вне зоны пишется полностью.
$TTL 2d ; zone TTL default = 2 days or 172800 seconds
$ORIGIN example.com.
@ IN SOA ns hostmaster (
2003080800 ; serial number
1d12h ; refresh = 1 day 12 hours
15M ; update retry = 15 minutes
3W12h ; expiry = 3 weeks + 12 hours
2h20M ; minimum = 2 hours + 20 minutes
)
IN NS ns
IN NS ns.example.net. ; out-of-zone
...
; A record for the NS RR above
ns IN A 192.168.2.1
;
Пример 2: домен example.com обслуживается двумя серверами вне зоны. Для них указаны полные имена в записях IN NS. Т.к. домен обслуживается другими серверами никакие A записи не допускаются.
$TTL 2d ; zone TTL default = 2 days or 172800 seconds
$ORIGIN example.com.
@ IN SOA ns.example.net. hostmaster.example.com. (
2003080800 ; serial number
1d12h ; refresh = 1 day 12 hours
15M ; update retry = 15 minutes
3W12h ; expiry = 3 weeks + 12 hours
2h20M ; minimum = 2 hours + 20 minutes
)
IN NS ns.example.net. ; out-of-zone name server
IN NS ns.example.org. ; out-of-zone name server
NS
Инфраструктурная запись, указывающая имя сервера имен для данного домена. Формат
owner-name ttl class rr target-name
example.com. IN NS ns1.example.com.
Согласно стандарту, каждый публичный домен должен иметь минимум 2 сервера имен. Частный домен может обслуживаться и одним сервером.
Если NS сервер для нашего домена находится в нашем домене, то мы обязаны указать A-запись для этого сервера (glue-record). Если NS сервер лежит вне домена - A-запись указывать не нужно.
Пример: NS записи для основного домена и для делегированного поддомена с указанием glue-records.
$TTL 2d ; default TTL is 2 days
$ORIGIN example.com.
@ IN SOA ns1.example.com. hostmaster.example.com. (
2003080800 ; serial number
2h ; refresh = 2 hours
15M ; update retry = 15 minutes
3W12h ; expiry = 3 weeks + 12 hours
2h20M ; minimum = 2 hours + 20 minutes
)
IN NS ns1.example.com.
IN NS ns2.example.com.
; обязательно указываем адреса этих серверов
ns1 IN A 192.168.0.3
ns2 IN A 192.168.0.4
; переключение на поддомен
$ORIGIN us.example.com.
@ IN NS ns3.us.example.com.
IN NS ns1.example.com.
; обязательно указываем на сервер поддомена
ns3.us.example.com. A 10.10.0.24
A, AAAA
A-запись указывает на ip адрес для данного имени хоста. Опционально указать особо ttl.
Пример: различные вариации записи
$TTL 2d ; zone default = 2 days or 172800 seconds
joe IN A 192.168.0.3 ; одинаковые ip
www IN A 192.168.0.3
; можно указать домен полностью
www.example.com. A 192.168.0.3
fred 3600 IN A 192.168.0.4 ; указан другой ttl
ftp IN A 192.168.0.24 ; разные ip для одного имени
IN A 192.168.0.7
mail IN A 192.168.0.15 ; разные ip для одного имени
mail IN A 192.168.0.32
mail IN A 192.168.0.3
squat IN A 10.0.14.13 ; другая подсеть
AAAA-запись используется для IPv6 адресов
ws1-29 A 10.0.10.29
AAAA 2002:d4c0:4090::d110:1011
Когда одному имени сопоставлено много адресов, в обратной записи для адреса нужно выдрать только одно имя.
MX
Инфраструктурная запись указывающая на имя почтового сервера для домена. Если имя сервера в этом-же домене - требуется еще А-запись с ip адресом почтового сервера.
Почтовых серверов для домена можно указать несколько с разными приоритетами.
Пример: почтовые сервера для домена и поддомена в одном файле
$TTL 2d ; zone default = 2 days or 172800 seconds
$ORIGIN example.com.
example.com. IN SOA ns1.example.com. root.example.com. (
2003080800 ; serial number
2h ; refresh = 2 hours
15M ; update retry = 15 minutes
3W12h ; expiry = 3 weeks + 12 hours
2h20M ; minimum = 2 hours + 20 minutes
)
; почтовый сервер для адресов вида user@example.com
IN MX 10 mail.example.com.
; почтовые сервера для поддомена user@us.example.com
us IN MX 10 mail.us.example.com.
us IN MX 20 mail.example.com.
; A-запись для основного почтового сервера
mail IN A 192.168.0.5
; Переключение на поддомен
$ORIGIN us.example.com.
; A-запись для почтового сервера поддомена
mail IN A 10.10.0.29
CNAME
Запись CNAME используется для указания псевдонима или ссылки одного имени на другое. Если сервер вернул клиенту CNAME в ответ на запрос, то клиенту придется повторно делать запрос на разрешение CNAME. Используется для удобства администрирования при наличии многих имен у одного сервера.
Примеры различных псевдонимов в домене example.com.:
joe IN A 192.168.254.3
www IN CNAME joe
www IN CNAME joe.example.com.
ftp IN CNAME www.example.com. ; паровоз
bill IN CNAME fred.another.com. ; перенаправление на имя в другом домене
;
IN A 192.168.254.8
www IN CNAME example.com.
DNAME
Перенаправление зон
PTR
Обратная запись указывает на имя по ip адресу. Используется специальный домен .IN-ADDR.ARPA. Для IPv6 используется другой домен - IP6.ARPA. Поэтому обратные записи необходимо держать в разных файлах для ipv4 и ipv6.
Пример для IPv4:
$TTL 2d ; 172800 secs
$ORIGIN 23.168.192.IN-ADDR.ARPA.
@ IN SOA ns1.example.com. hostmaster.example.com. (
2003080800 ; serial number
12h ; refresh
15m ; update retry
3w ; expiry
3h ; minimum
)
IN NS ns1.example.com.
IN NS ns2.example.com.
2 IN PTR joe.example.com. ; FDQN
15 IN PTR www.example.com.
17 IN PTR bill.example.com.
74 IN PTR fred.example.com.
Пример для IPv6:
; reverse IPV6 zone file for example.com
$TTL 2d ; default TTL for zone 172800 secs
$ORIGIN 0.0.0.0.8.b.d.0.1.0.0.2.IP6.ARPA.
@ IN SOA ns1.example.com. hostmaster.example.com. (
2003080800 ; sn = serial number
12h ; refresh = refresh
15m ; retry = update retry
3w ; expiry = expiry
2h ; min = minimum
)
IN NS ns1.example.com.
IN NS ns2.example.net.
1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.1.0.0.0 IN PTR ns1.example.com.
2.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.1.0.0.0 IN PTR mail.example.com.
1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.2.0.0.0 IN PTR joe.example.com.
2.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.2.0.0.0 IN PTR www.example.com.
TEXT
SRV
Обратные зоны для бесклассовых подсетей
Приемы через CNAME и DNAME
Директивы сервера bind
$TTL $ORIGIN
View - ограничение видимости зон
Использование ограничения видимости позволяет применять различные опции по отношению к различным клиентам. Опция вступают в действие в зависимости от ip адреса клиента - источника запроса.
Это позволяет использовать разные данные по одной и той-же зоне для разных клиентов. Для внутренних клиентов мы должны разрешить рекурсивные запросы, для внешних - запретить.
В конфигурационном файле необходимо запретить рекурсию по-умолчанию (закомментировать). На рубеже версии 9.5 поведение этого флажка меняется, на новых версиях надо оставить строчку включенной.
allow-recursion { any; };
На версии 9.8.4 поведение такое:
- allow-recursion { any; }; view recusion yes; - разрешает рекурсию. (на нерекурсивный запрос дает хинт root-list);
- allow-recursion { any; }; view recusion no; - запрещает рекурсию молча (no answer);
- allow-recursion { none; }; view recusion yes|no; - запрещает рекурсию (REFUSED);
- закомментарен allow-recursion { none; }; view recusion yes|no; - запрещает рекурсию (REFUSED);
Т.е. для нас актуальны первые два варианта.
Выключить проверку DNSSEC. Требуется если мы в лабораторных условиях сквоттим TLD.
dnssec-validation no;
Конфигурация зон /etc/bind/named.conf
; список доступа - наши внутренние клиенты
acl internal {
10.13.0.0/24;
localhost;
};
; область видимости для внутренних клиентов
view "internal-view" {
; клиент - соответствует списку доступа
match-clients { internal; };
; разрешена рекурсия для внутренних клиентов
recursion yes;
; зона видима только для внутренних клиентов
zone "model.local" in {
type master;
file "/etc/bind/db.model.local";
};
; зона видима для внутренних клиентов иначе, чем для внешних
; файл зоны свой
zone "model.example.net" in {
type master;
file "/etc/bind/db.model.example.net.internal";
};
; обратная зона для внутренних клиентов тоже своя
zone "0.13.10.in-addr.arpa" in {
type master;
file "/etc/bind/rev.10.13.0.internal";
};
; дефолтные зоны сервера
include "/etc/bind/named.conf.default-zones";
};
; область видимости, доступная всем прочим клиентам
view "external-view" {
match-clients { any; };
; запрет рекурсии
recursion no;
; запрет добавления Additional секции со ссылками на root сервера для всех запросов, которых нет в зонах.
; заставляет bind отвечать REFUSED на запрос посторонних имен. (Блокировка Upward referrals)
additional-from-cache no;
; зона видится внешними клиентами не так, как внутренними
; файл зоны свой
zone "model.example.net" in {
type master;
file "/etc/bind/db.model.example.net";
};
; обратная зона видится внешними клиентами не так, как внутренними
; файл зоны свой
zone "0.13.10.in-addr.arpa" in {
type master;
file "/etc/bind/rev.10.13.0";
};
};
Обратите внимание: при запрете рекурсии внутри view перестанут работать CNAME на посторонние зоны.
При дублировании зон в областях видимости не забывайте прописать после NS записи еще и A-запись для вашего dns-сервера. Внешние клиенты тоже должны знать ip адрес вашего NS. Пример:
$ORIGIN model.local.
$TTL 1h
;
@ IN SOA ns1.model.local. hostmaster.model.local. (
2014025006 ; Serial Number
10800 ; refresh
3600 ; retry
604800 ; expire
86400 ) ; min TTL
;
IN NS ns1.model.local.
IN MX 10 mail1
;
ns1 IN A 10.13.0.104 ; <--------- ОБЯЗАТЕЛЬНО
gw IN A 10.13.0.43
hi IN A 10.13.0.223
Если этого не сделать, в ответ на запрос к любому имени в зоне сервер будет отвечать ошибкой "ServerFail":
root@model-net-ctrl-1:/etc/bind# dig hi.model.local. @10.13.0.104
;; Got answer:
;; HEADER opcode: QUERY, status: SERVFAIL, id: 60022
Запрет рекурсий
См. upward referrals debates https://www.dns-oarc.net/oarc/articles/upward-referrals-considered-harmful