Хочу рассказать о странном – о платной (25$) программе “” для создания DNS-сервера. Об этом меня попросил один из читателей:
Есть такая программа “DNS Enabler” (www.cutedgesystems.com). Если будет время и желание – напиши, как ею пользоваться с примерами. Думаю, маководы скажут спасибо за этот материал.
О “странном”, так как в Mac OS X и так есть DNS-сервер (в лицензионных условиях я сейчас разбираться не очень хочу, поэтому скажу, что это бесплатное программное обеспечение с открытыми исходными текстами).
$ named -v BIND 9.6.0-APPLE-P2
Я хотел продемонстрировать, что BIND является очень популярным сервером DNS в Интернет, но моя демонстрация хоть и не удалась, но по крайней мере развеселила. В идеале можно узнать версию удалённого DNS-сервера с помощью команды:
$ dig @dns.server.ip.address version.bind chaos txt
Но информация о версии BIND считается небезопасной утечкой информации, и администраторы DNS отключают её выдачу, но при этом всячески развлекаются. Мне особенно понравился ответ сервера ns2.life.net: “None of your business” (грубо говоря “Не твоё собачье дело”) :-) Примеры ниже (только один сервер сообщил о своей версии):
$ dig @4.2.2.1 version.bind chaos txt version.bind. 0 CH TXT "If you have a legitimate reason for requesting this info, please contact hostmaster@Level3.net" $ dig @A.ROOT-SERVERS.NET version.bind chaos txt version.bind. 0 CH TXT "This space intentionally left blank" $ dig @ns2.life.ua version.bind chaos txt version.bind. 0 CH TXT "None of your business" $ dig @66.244.95.20 version.bind chaos txt version.bind. 0 CH TXT "[secured]" $ dig @133.145.228.6 version.bind chaos txt version.bind. 0 CH TXT "unknown" $ dig @218.248.240.208 version.bind chaos txt version.bind. 0 CH TXT "9.2.1"
Несмотря на популярность BIND, его настройка требует навыков системного администрирования. Поэтому на Mac OS X его настройка – удел не слишком многих. Есть другое решение – в Mac OS X Server тоже используется BIND в качестве DNS-сервера, и у него есть хороший графический интерфейс. Но это сервер, и обычному пользователю он тоже вряд ли доступен. Поэтому третья альтернатива – использование под Mac OS X стороннего пакета, создающего DNS-сервер, и как раз здесь я рассмотрю ““.
Три альтернативы – три части этой статьи. Сложность идёт по убыванию. Первый раздел – самый сложный, это Unix-way. Последний – самый простой, это Mac-way. Тема получается объёмной, поэтому если не хотите сложностей, то подождите вторую и третью части статьи, они, в отличие от ещё не написанной “Amazon Web Services, часть 3“, будут в течение следующих дней.
Задача
Для чего предназначен DNS-сервер? Если вы дочитали до этого момента, то можно :-)
Детальное описание определений, сценариев работы, конфигурирования DNS можно узнать в книге издательства O’reilly ““.
Я расскажу о типичной конфигурация, которую я хочу реализовать. Допустим, у меня есть домен ctrld.me. Этот домен расположен на DNS-серверах провайдера. Но для дома я хочу сделать поддомен home.ctrld.me, в котором я хочу описать iPhone, iPod Touch, PS3, ноутбук и тестовый Mac OS X Server. Это будет “прямая зона”. Устройства подключены по WiFi к TimeCapsule, которая раздаёт им по DHCP закреплённые за их MAC-адресами.
Вопрос выбора имён непрост. Называть устройство просто iPhone информативно, но неинтересно. Лучше выбрать какое-либо правило, и его придерживаться. Некоторые называют хосты по именам груческих богов, некоторые – по названием гор. Главное чтобы этих названий было достаточно для того, чтобы назвать все хосты. Для этого конкретного случая я решил использовать . Кроме этого в домашней сети (192.168.98.0/24, у меня отнюдь не 253 хоста, но так проще) я придерживаюсь того, что адрес .1 закреплён за маршрутизатором, адреса с .2 по .9 зарезервированы для серверов, с .10 по .99 зарезервированы для “статических” адресов, закреплённых по MAC, а после .100 выдаются любым другим устройствам, попадающим в сеть.
Раскладка такая:
- TimeCapsule: aves.home.ctrld.me, 192.168.98.1
- Mac OS X Server: coche.home.ctrld.me, 192.168.98.2
- PS3: cubagua.home.ctrld.me, 192.168.98.3
- MacBook Pro: patos.home.ctrld.me, 192.168.98.10
- iPod Touch: toas.home.ctrld.me, 192.168.98.11
- iPhone: zapara.home.ctrld.me, 192.168.98.12
DNS-сервер будет стоять на MacBook Pro. Плохая идея – DNS-сервер должен всегда находиться в сети, и правильно его ставить на выделенном сервере (в моём случае это 192.168.98.2). Но для теста подойдёт.
Чтобы DNS-сервер мог обслуживать запросы клиентов в сети на определение произвольных хостов (например, cnn.com), а но только тех, которые мы сконфигурировали в home.ctrld.me, нужно перенаправить эти запросы на внешний DNS. Я буду использовать для этого публичный DNS-сервер Google 8.8.8.8.
В результате мы сможем использовать наш DNS-сервер для полноценной работы.
Настройка BIND на Mac OS X
Сформулирую задачу терминами DNS. Прямая зона (соответствие между именами и IP-адресами) выглядит так:
$ORIGIN home.ctrld.me. aves IN A 192.168.98.1 coche IN A 192.168.98.2 cubagua IN A 192.168.98.3 patos IN A 192.168.98.10 toas IN A 192.168.98.11 zapara IN A 192.168.98.12
Обратная зона (соответствие между IP-адресом и именем) такая:
$ORIGIN 98.168.192.in-addr.arpa. 1 IN PTR aves.home.ctrld.me. 2 IN PTR coche.home.ctrld.me. 3 IN PTR cubagua.home.ctrld.me. 10 IN PTR patos.home.ctrld.me. 11 IN PTR toas.home.ctrld.me. 12 IN PTR zapara.home.ctrld.me.
Обратите внимание, что точки в конце – это отнюдь не моя любовь к непропусканию точек в конце предложения.
Настраивать bind я буду, опираясь на статью ““. Также хочу порекомендовать посмотреть инструкцию по настройке BIND на FreeBSD на одном из моих любимых блогов по Unix .
Конфигурируем rndc
rndc – это утилита для управления BIND’ом. Для начала нужно сгенерировать ключ и конфигурационный файл:
$ sudo -s $ rndc-confgen -b 256 > /etc/rndc.conf $ head -n5 /etc/rndc.conf | tail -n4 > /etc/rndc.key
Файл /etc/rndc.conf будет примерно такой:
# Start of rndc.conf
key "rndc-key" {
algorithm hmac-md5;
secret "C0p1VDGqN1m4ApoKIDze+GZORY+tbYSORw56+WjIpGg=";
};
options {
default-key "rndc-key";
default-server 127.0.0.1;
default-port 953;
};
# End of rndc.conf
Файл /etc/rndc.key – это выдержка из предыдущего:
key "rndc-key" {
algorithm hmac-md5;
secret "C0p1VDGqN1m4ApoKIDze+GZORY+tbYSORw56+WjIpGg=";
};
Мне эти ключи не жаль, но вы свои ключи никому не показывайте.
Важно, чтобы порт для rndc в /etc/named.conf (он есть изначально) и в /etc/rndc.conf должны быть одинаковыми, иначе вы не сможете управлять BIND’ом:
# cat /etc/named.conf | grep 'inet.*\?port'
inet 127.0.0.1 port 54 allow {any;}
# cat /etc/rndc.conf | grep '\-port'
default-port 953;
Если они отличаются, то нужно в /etc/named.conf указать нужный порт:
# sed 's/inet 127.0.0.1 port 54/inet 127.0.0.1 port 953/' /etc/named.conf > /tmp/named.conf # cp /etc/named.conf /etc/named.conf.dist # mv /tmp/named.conf /etc/
Настройка автозапуска
Отключаем ключ “Disabled” в конфигурации для launchd при запуске BIND (демон называется named), для чего указываем в lauchctl опцию “-w”:
# launchctl load -w /System/Library/LaunchDaemons/org.isc.named.plist
Обратите внимание на то, что в последних Mac OS X .plist не меняется, “Now the state of the Disabled key is stored elsewhere on-disk”. И это “elsewhere” значит “/private/var/db/launchd.db/com.apple.launchd/overrides.plist”. Как я узнал? Перечитайте статью “Слежение за изменениями файловой системы“.
Named теперь запущен и должен стартовать при перезапуске системы.
# ps ax | grep named | grep -v grep 27718 ?? Ss 0:00.01 /usr/sbin/named -f
Ручная остановка named:
# launchctl stop org.isc.named
Ручной запуск:
# launchctl start org.isc.named
Конфигурируем named
# vim /etc/named.conf
В разделе options добавляем forwarder – адрес DNS-сервера куда будут идти транслироваться все запросы, на которые наш DNS-сервер ответить не может?
forwarders { 8.8.8.8; };
Желающие могут скрыть версию BIND:
version "for this info please contact hostmaster@ctrld.me";
В глобальной конфигурации добавляем файлы зон (прямую и обратную):
zone "home.ctrld.me" IN {
type master;
file "home.ctrld.me.fwd";
};
zone "98.168.192.in-addr.arpa" {
type master;
file "192.168.98.rev";
allow-update { none; };
};
Файл /etc/named.conf будет выглядеть так:
include "/etc/rndc.key";
controls {
inet 127.0.0.1 port 953 allow {any;}
keys { "rndc-key"; };
};
options {
directory "/var/named";
forwarders { 8.8.8.8; };
version "for this info please contact hostmaster@ctrld.me";
};
zone "." IN {
type hint;
file "named.ca";
};
zone "localhost" IN {
type master;
file "localhost.zone";
allow-update { none; };
};
zone "0.0.127.in-addr.arpa" IN {
type master;
file "named.local";
allow-update { none; };
};
zone "home.ctrld.me" IN {
type master;
file "home.ctrld.me.fwd";
};
zone "98.168.192.in-addr.arpa" {
type master;
file "192.168.98.rev";
allow-update { none; };
};
logging {
category default {
_default_log;
};
channel _default_log {
file "/Library/Logs/named.log";
severity info;
print-time yes;
};
};
Конфигурируем прямую зону
# cd /var/named/ # vim home.ctrld.me.fwd
Зона выглядит так:
$TTL 3600
@ IN SOA home.ctrld.me. hostmaster.home.ctrld.me. (
2009121801 ; Serial
3600 ; Refresh
900 ; Retry
3600000 ; Expire
3600 ) ; Minimum
@ IN NS patos.home.ctrld.me.
$ORIGIN home.ctrld.me.
aves IN A 192.168.98.1
coche IN A 192.168.98.2
cubagua IN A 192.168.98.3
patos IN A 192.168.98.10
toas IN A 192.168.98.11
zapara IN A 192.168.98.12
NS – адрес DNS-сервера. A – соответствие имя-адрес. Важное поле – Serial, при модификации зоны нужно его увеличивать. $ORIGIN не нужен, он берётся из конфигурации зоны, но я так привык.
Конфигурируем обратную зону
# vim 192.168.98.rev
Зона:
$TTL 3600
@ IN SOA home.ctrld.me. hostmaster.home.ctrld.me. (
2009121801 ; Serial
3600 ; Refresh
900 ; Retry
3600000 ; Expire
3600 ) ; Minimum
@ IN NS patos.home.ctrld.me.
$ORIGIN 98.168.192.in-addr.arpa.
1 IN PTR aves.home.ctrld.me.
2 IN PTR coche.home.ctrld.me.
3 IN PTR cubagua.home.ctrld.me.
10 IN PTR patos.home.ctrld.me.
11 IN PTR toas.home.ctrld.me.
12 IN PTR zapara.home.ctrld.me.
98.168.192.in-addr.arpa = 192.168.98 в обратном порядке плюс суффикс, говорящий о том, что это обратная зона.
Применение изменений
Поработали мы хорошо, перечитываем конфигурацию:
# rndc reload server reload successful
Проверяем логи (successful не всегда обозначает отсутствие ошибок):
# tail -20 /Library/Logs/named.log 18-Dec-2009 21:29:42.366 received control channel command 'reload' 18-Dec-2009 21:29:42.366 loading configuration from '/private/etc/named.conf' 18-Dec-2009 21:29:42.367 using default UDP/IPv4 port range: [49152, 65535] 18-Dec-2009 21:29:42.367 using default UDP/IPv6 port range: [49152, 65535] 18-Dec-2009 21:29:42.369 reloading configuration succeeded 18-Dec-2009 21:29:42.369 reloading zones succeeded
Всё в порядке.
Если же где-то была ошибка, то всё будет в логах. Например, имитируем ошибку в имени файла зоны:
# mv 192.168.98.rev 192.168.98.rev_err # > /Library/Logs/named.log # rndc reload # tail -20 /Library/Logs/named.log
Получили ошибку в логе:
18-Dec-2009 21:31:27.001 zone 98.168.192.in-addr.arpa/IN: loading from master file 192.168.98.rev failed: file not found
Восстанавливаем файл зоны, теперь всё в норме:
# mv 192.168.98.rev_err 192.168.98.rev # rndc reload # tail /Library/Logs/named.log 18-Dec-2009 21:32:39.168 reloading configuration succeeded 18-Dec-2009 21:32:39.168 reloading zones succeeded
Проверка работы named
Для проверки используем dig, запрашиваем информацию по корневой зоне (по 9.6.0-APPLE-P2 и @192.168.98.10 видим, что используется именно наш DNS):
$ dig @192.168.98.10 ; DiG 9.6.0-APPLE-P2 @192.168.98.10 ; (1 server found) ;; global options: +cmd ;; Got answer: ;; HEADER opcode: QUERY, status: NOERROR, id: 12368 ;; flags: qr rd ra; QUERY: 1, ANSWER: 13, AUTHORITY: 0, ADDITIONAL: 0 ;; QUESTION SECTION: ;. IN NS ;; ANSWER SECTION: . 125343 IN NS K.ROOT-SERVERS.NET. . 125343 IN NS M.ROOT-SERVERS.NET. . 125343 IN NS C.ROOT-SERVERS.NET. . 125343 IN NS H.ROOT-SERVERS.NET. . 125343 IN NS B.ROOT-SERVERS.NET. . 125343 IN NS E.ROOT-SERVERS.NET. . 125343 IN NS J.ROOT-SERVERS.NET. . 125343 IN NS L.ROOT-SERVERS.NET. . 125343 IN NS F.ROOT-SERVERS.NET. . 125343 IN NS D.ROOT-SERVERS.NET. . 125343 IN NS I.ROOT-SERVERS.NET. . 125343 IN NS A.ROOT-SERVERS.NET. . 125343 IN NS G.ROOT-SERVERS.NET. ;; Query time: 9 msec ;; SERVER: 192.168.98.10#53(192.168.98.10) ;; WHEN: Fri Dec 18 21:34:22 2009 ;; MSG SIZE rcvd: 228
Смотрим нашу зону home.ctrld.me:
$ dig @192.168.98.10 home.ctrld.me soa home.ctrld.me. 3600 IN SOA home.ctrld.me. hostmaster.home.ctrld.me. 2009121801 3600 900 3600000 3600 home.ctrld.me. 3600 IN NS patos.home.ctrld.me. patos.home.ctrld.me. 3600 IN A 192.168.98.10
Смотрим одну из записей:
# dig @192.168.98.10 zapara.home.ctrld.me any zapara.home.ctrld.me. 3600 IN A 192.168.98.12
Проверяем реверсную зону:
$ dig @192.168.98.10 -x 192.168.98.2 2.98.168.192.in-addr.arpa. 3600 IN PTR coche.home.ctrld.me.
Проверяем, что форвардер тоже работает, запрашивая внешний домен:
$ dig @192.168.98.10 cnn.com cnn.com. 300 IN A 157.166.255.19 cnn.com. 300 IN A 157.166.224.25 cnn.com. 300 IN A 157.166.224.26 cnn.com. 300 IN A 157.166.226.25 cnn.com. 300 IN A 157.166.226.26 cnn.com. 300 IN A 157.166.255.18
Ещё вспоминаем о версии named и получаем именно то, что сконфигурировали в /etc/named.conf:
$ dig @192.168.98.10 version.bind chaos txt version.bind. 0 CH TXT "for this info please contact hostmaster@ctrld.me"
Всё работает.
Настраиваем использование нашего DNS
Для того, чтобы воспользоваться нашим свеженастроенным DNS, конфигурируем его в System Preferences/Network на активном сетевом соединении (у меня это Airport):
Нажимаем кнопку Advanced и в закладке DNS устанавливаем 192.168.98.10:
Ok, Apply. Убеждаемся, что автоматически установлен именно нужный DNS:
$ cat /etc/resolv.conf nameserver 192.168.98.10
Dig берёт информацию из /etc/resolv.conf, проверяем:
$ dig toas.home.ctrld.me toas.home.ctrld.me. 3600 IN A 192.168.98.11
Всё. DNS настроен. Идём пить чай и радоваться тому, что каждый следующий способ на порядок проще предыдущего.
To be continued…


