Налаштовуємо DJBDNS

ВСТУП
Доволі часто для адміністратора, який лише починає своє знайомство з FreeBSD виникає необхідність налаштувати власний DNS. Хто пробував це робити знає яка це важка, трудомістка та клопітка праця… Разом з FreeBSD у Вас у системі обов’язково стоятиме одна з версій BIND (Berkeley Internet Name Domain). Можливо, що для гуру це не проблема, проте початківцю це далеко не легко!

Що таке DNS? DNS – це протокол, який перетворює імена в IP-адреси та навпаки. Наприклад, у відповідь на запит www.unix.lviv.ua ми отримаємо IP-адресу веб-серверу офіційного сайту відкритої Львівської групи користувачів Unix. Так само відбувається й зворотній процес. Запит IP-адреси машини, поверне ім’я хосту. Для того щоб система працювала не обов’язково мати працюючий DNS у себе на комп’ютері, їх достатньо існує в інтернеті, проте коли ми говоримо про мережу, то DNS нам знадобиться: чи для основного серверу нашого домену (який Ви використовуватимете), чи просто для кешування DNS-запитів, наприклад, браузерів.

Дана стаття не претендує стати підручником по DNS, таких існує достатньо і набагато більш фаховіше написаних! Я прагну лише допомогти в налаштуванні DNS для конкретних потреб на конкретному прикладі.

Як було сказано найбільш розповсюдженим DNS є BIND, проте не зважаючи на свою популярність, він таки залишається доволі болючим і дирявим місцем 🙂 Біда ще й у тім, що більшість проблем BIND криється в бібліотеках, більше відомих як libresolv та libbind, переповнення буферу та інші гадості – результат помилок у цих бібліотеках. Саме тому я використовую djbDNS. Він був написаний D. J. Bernstein. Як на мене його переваги очевидні – легка та швидка конфігурація, безпека, стабільність… Джеймсом Бернштейн замінив стандартну libresolv на власну, відому як djbdns client library. Відразу зауважу, що багато хто не долюблює його програм (djbdns, qmail, daemontools та ін.). Не заперечую, що він має свій особливий стиль програмування, який однак є доволі структурованим та цікавим.

Отже, DJBDNS is a collection of Domain Name System tools. It includes several components:
The dnscache program is a local DNS cache. It accepts recursive DNS queries from local clients such as web browsers. It collects responses from remote DNS servers.
The tinydns program is a fast, UDP-only DNS server. It makes local DNS information available to the Internet.
The pickdns program is a load-balancing DNS server. It points clients to a dynamic selection of IP addresses.
The walldns program is a reverse DNS wall. It provides matching reverse and forward records while hiding local host information.
The dns library handles outgoing and incoming DNS packets. It can be used by clients such as web browsers to look up host addresses, host names, MX records, etc. It supports asynchronous resolution.
The dnsfilter program is a parallel IP-address-to-host-name converter.
The dnsip, dnsipq, dnsname, dnstxt, and dnsmx programs are simple command-line interfaces to DNS.
The dnsq and dnstrace programs are DNS debugging tools.

Переваги DJBDNS:
– Підтримка wildcards в записах.
– Підтримка load-balancing.
– Автоматична зміна SOA (звичайно, можна й ручками ).
– Зручний формат зон.
– Можно зробити зміну зони по розкладу (напр., після такої-то дати, ім’я test.com змінює свій ІР)
– Висока безпека.

Недоліки:
– Нема підтримки slave/secondary зон.

Якщо Вам потрібно віддавати зони bind серверу, який працює як slave – проблем нема, ставиться axfrdns (саме такий приклад ми розглянемо) Якщо ж Ви хочете використовувати djbdns як slave сервер, то найкраще робити синхронізацію data файлу (файл, в якому зберігаються зони) через самописаний скрипт, який написати, на мою думку, не так вже і складно!

МЕТА
у Вас є свій домен (me.lviv.ua);
поштовий сервер (@me.lviv.ua);
внутрішні та зовнішні імена;
Існує сервак під FreeBSD (core.me.lviv.ua) на якому два мережеві інтерфейси – xl0 (192.168.0.2 – локальний) та ppp0 (195.5.29.45 – зовнішній), ns.neo.net (217.15.15.15 – вторинний DNS для Вашого домену), 195.5.29.11 – DNS сервре у Вашого провайдера.

ІНСТАЛЯЦІЯ
Вам буде просто необхідно daemontools i ucspi-tcp. Я, звичайно, звик інсталювати з портів, проте останню версію Ви завжди знайдете на сайті.

[11:19] core:~# cd /usr/ports/dns/djbdns/
[11:19] core:djbdns# make install clean
[11:26] core:~# cd /usr/ports/sysutils/daemontools/
[11:26] core:daemontools# make install clean

Як бачите ми компілемо djbDNS з портів, будуть проінстальовані усі необхідні залежності. Теж інсталюємо daemontools для того, щоб запускати DNS не через стандартний inetd.conf, а через svscan, який входить у набір daemontools – безпека перш за все!!!

КОНФІГУРАЦІЯ КОМПОНЕНТІВ DJBDNS

dnscache – це DNS кеш. Він приймає рекурсивні запити від локальних клієнтів, збирає відповіді від інших DNS серверів та кешує результат. Зазвичай конфігурується при допомозі утиліти dnscache-conf. Запускається dnscache в оточені chroot, в директорії, котра задана у змінній $ROOT з uid та gid задані змінними $UID та $GID. dnscache прослуховує сокет на 53/udp та 53/tcp з ІР адресою вказаною в $IP – це може бути як локальна петля (127.0.0.1 – DNS кеш використовується лише даним комп’ютером), так і зовнішній ІР. В останньому випадку необхідно буде створити файли доступу типу ip/192.168.0 – доступ до DNS кешу матимуть лише комп’ютери з мережі 192.168.0.

[11:53] core:~# dnscache-conf dnscache dnslog /usr/local/etc/dnscache 192.168.0.2

де,
dnscache – користувач, від якого буде запускатися dnscache
dnslog – користувач, від якого ведуться log-файли
/usr/local/etc/dnscache – chroot для dnscache
192.168.0.2 – локальна ІР

Для запуску DNS під svscan створимо лінк у теку з svscan, у мене це /var/service/
(перегляньте файл запуску svscan і усе зрозумієте more /usr/local/etc/rc.d/svscan.sh)

[11:55] core:~# ln -s /usr/local/etc/dnscache /var/service/dnscache

Налаштовуємо хто має право доступу до DNS кешу:
[11:56] core:~# touch /usr/local/etc/dnscache/root/ip/192.168.0
[11:56] core:~# touch /usr/local/etc/dnscache/root/ip/195.5.29.45

Список ІР кореневих серверів для dnscache міститься в servers/@ створюємо файли, щоб dnscache знав, що при зверненні до локальних доменних імен/ІР звертатися необхідно до даного кореневого серверу:
[11:57] core:~# echo “127.0.0.1” > /usr/local/etc/dnscache/root/servers/168.192.in-addr.arpa
[11:57] core:~# echo “127.0.0.1” >/usr/local/etc/dnscache/root/root/severs/me.lviv.ua

tinydns – це DNS сервер, який приймає інтерактивні DNS запити зі всіх хостів в Internet і відповідає на них. За звичай налаштовується при допомозі tinydns-conf. Аналогічно до dnscache запускається в оточені chroot, в директорії, котра задана у змінній $ROOT з uid та gid задані змінними $UID та $GID, прослуховує сокет лише на 53/udp і відповідає на запити з файлу data.cbd створиного при допомозі tinydns-data. TCP-запити tinydns не обслуговує!

[11:58] core:~# tinydns-conf tinydns dnslog /usr/local/etc/tinydns 0.0.0.0
[11:58] core:~# ln -s /usr/local/etc/tinydns /var/service/tinydns

думаю, що Ви зрозуміли, що ми щойно зробили! чому 0.0.0.0? отримуємо запит від усіх хостів в Internet!
Переходимо до налаштування tinydns

[12:01] core:~# cd /usr/local/etc/tinydns/root/
[12:01] core:root# vi data

прописуємо таке (відповідно до поставленої нами вище цілі):

%in:192.168
%in:127.0.0.1
%ex
=core.me.lviv.ua:195.5.29.45:::ex
=core.me.lviv.ua:192.168.0.2:::in
+mail.me.lviv.ua:195.5.29.45:::ex
+me.lviv.ua:195.5.29.45:::ex
.me.lviv.ua:195.5.29.45:ns.me.lviv.ua
.me.lviv.ua::ns.neo.net
@me.lviv.ua::mail.me.lviv.ua
.168.192.in-addr.arpa::ns.me.lviv.ua:::in
=ws01.me.lviv.ua:192.168.0.101:::in
=ws02.me.lviv.ua:192.168.0.102:::in
=ws03.me.lviv.ua:192.168.0.103:::in

Тепер пояснення:
= – первинне ім’я
+ – це альяс, їх може бути скільки завгодно, тоді як справжє ім’я має бути лише одне і починатися з “=”
ex – видно ззовні
in – лише для локальної мережі
.me.lviv.ua:195.5.29.45:ns.me.lviv.ua – наш зовнішній DNS
@me.lviv.ua::mail.me.lviv.ua – це для пошти
.168.192.in-addr.arpa::ns.me.lviv.ua:::in – трансляцыя локальних адрес
=ws01.me.lviv.ua:192.168.0.101:::in – а це вже пішли машини в локальній мережі

Формат запису даних у файлі data такий:
.fqdn:ip:ttl:timestamp:lo

.fqdn – ім’я домену
ip – ІР адреса
ttl – time to live – вказує кількість секунд на які кешується дане ім’я, по замовчанню 300 с.
timestamp – часовий штамп має вигляд зовнішнього TAI64 timestamp у форматі 16-ти шістнадцяткових знаків.
lo – інтерфейс (in – лише для внутрішніх ІР, ex – для усіх)

Це мінімум, детальніше – читайте документацію – там усе гарно описано, або ж запитуйте мене
Після редагування:
[12:09] core:root# make

І, нарешті, axfrdns – сервіс переносу зон. Класично налаштовується при допомозі axfrdns-conf.

[11:59] core:~# axfrdns-conf axfrdns dnslog /usr/local/etc/axfrdns /usr/local/etc/tinydns 195.5.29.45
[11:59] core:~# ln -s /usr/local/etc/axfrdns /var/service/axfrdns

Тепер конфігурація:
Далі, дозволемо перенос зони на зовнішній інтерфейс та для вторинного DNS:

[12:11] core:~# cd /usr/local/etc/axfrdns/
[12:11] core:axfrdns# vi tcp

Там прописуємо таке:

195.5.29.45:allow,AXFR=”me.lviv.ua”
195.5.29.11:allow,AXFR=”me.lviv.ua”
217.15.15.15:allow
127.0.0.1:allow
:allow,AXFR=””

Після редагування:
[12:16] core:axfrdns# make

Перезавантажуємо сервер. Після цього у Вас має запрацювати DNS! З чим Вас і вітаю!

ВИСНОВОК
DJBDNS – надзвичайно гнучкий, швидкісний та стабільний DNS сервер, що дуже важливо для роботи усіх клієнтськийх програм від браузера до ftp-клієнта. Звичайно – обирати завжди ВАМ!!! Але якщо Ви обрали саме DJBDNS, то поставте на сайті лінк http://tinydns.org/powered-by-djbdns.gif з написом alt=”Powered by djbdns” 🙂

Детальнішу інформацію Ви можете знайти на сайтах:
http://cr.yp.to/djbdns.html
http://lithium.opennet.ru/dnscache.html
http://www.opennet.ru/base/net/djbdns.txt.html
http://www.guinix.com/technote/dualdns.html
http://www.hackinglinuxexposed.com/a…/20020716.html

1 Comment on "Налаштовуємо DJBDNS"


  1. Шість років пройшло з того моменту, як я написав цю статтю… Сьогодні я хочу сказати: BIND не даремно став стандартом у Глобальній Мережі! Не полінуйтеся, вивчіть його… А djbDNS – це так, погратися у своїй пісочниці 😉

Leave a Reply

Your email address will not be published. Required fields are marked *