Статьи

DNS server BIND на Linux | Блог любителя експериментів

  1. Загальні відомості
  2. Вихідні дані
  3. установка BIND9
  4. Параметри (синтаксис) named.conf
  5. розділ Acl
  6. розділ Options
  7. розділ Zone
  8. Розширені можливості пошуку конфігурації
  9. Налаштування кешуючого DNS сервера
  10. Головний (master) сервер зони
  11. Вторинний (secondary, slave) авторитетний сервер зони
  12. Налаштування netfilter ( iptables ) Для DNS BIND
  13. Усунення несправностей

Доброго часу, читачі. Продовжуючи теоретичний матеріал про DNS сервері BIND , В поточній статті хочу розглянути практичний приклад установки і настройки різних конфігурацій сервера BIND. У статті я опишу настройку DNS-кешу і повноцінного DNS master сервера. Почну опис з загальних понять і необхідних кроків для організації будь-якого DNS сервера.

Загальні відомості

Named - це демон, що входить до складу пакету bind9 і є сервером доменних імен. Демон named може реалізовувати функції серверів будь-якого типу: master, slave, cache. На наведеній схемі я постарався максимально прозоро відобразити основний принцип роботи DNS сервера BIND. Бінарник, який виконує основну роботу, розташований в / usr / sbin / named. Він бере настройки з основного конфігураційного файлу, який називається named.conf і розташований в каталозі / etc / bind. В основному конфіге описується робочий каталог асервера, найчастіше це каталог / var / cache / bind, в якому лежать файли опису зон та інші службові файли. Відповідність назви зони і файлу опису зони задає розділ zone з параметром file. Розділ zone так само задає тип відповідальності даного сервера за зону (master, slave і ін.), А так само визначає особливі параметри для поточної зони (наприклад, на якому інтерфейсі обробляти запити для поточної зони). У файлах опису зон містяться параметри зон і записи ресурсів (шляху, зазначені в цьому абзаці можуть відрізнятися, це залежить від дистрибутива Linux або параметрів збірки сервера з початкових кодів ).

Ця загальна схема роботи, яка допоможе в подальшому не заплутатися, при розгляді конкретних конфігурацій.

Формат файлу конфігурації для 4-ої версії програми відрізняється від того, який застосовується в восьмою і дев'ятою версіях BIND. З огляду на, що я розраховую на установку нового DNS сервера, а стару версію сенсу ставити не бачу, тому буду розглядати конфиг нової версії.

Вихідні дані

Для коректної роботи DNS ньому необхідно мати налаштовану мережу . DNS в поточній статті буде налаштований на дистрибутиві Debian, особливості інших дистрибутивів теж будуть відзначені. Конфиг мережі стенду наступний:

dns: ~ # cat / etc / network / interfaces auto lo iface lo inet loopback auto eth0 iface eth0 inet static address 10.0.0.152 netmask 255.255.255.0 gateway 10.0.0.254 auto eth1 iface eth1 inet static address 192.168.1.1 netmask 255.255.255.0

де 10.0.0.152/24 - зовнішній інтерфейс (підмережа, виділена провайдером), 192.168.1.1/24 - внутрішній (Локальна мережа). Настроюється зона матиме ім'я example.com. У прикладі зі slave сервером, вторинний сервер буде розташований на IP 10.0.0.191.

установка BIND9

Для роботи DNS сервера необхідно встановити пакет bind9 (в деяких дистрибутивах - bind). Як зазначено на схемі - основним конфігураційним файлом BIND є файл named.conf (даний файл може бути розміщений в каталозі / etc, іноді в / etc / bind).

Параметри (синтаксис) named.conf

Синтаксис файлу named.conf дотримується наступних правил:

IP-адреси - список IP повинен бути розділений символом ";" , Можливо вказувати підмережа в форматі 192.168.1.1/24 або 192.168.1.1/255.255.255.0, (для виключення IP перед ним потрібно поставити знак!), Може свідчити імена "any", "none", "localhost" в подвійних лапках.

Коментарі - рядки починаються на #, // і укладені в / * і * / вважаються коментарями.

У файлах опису зон - символ @ є "змінної" зберігає ім'я зони, зазначеної в файлі конфігурації named.conf або в директиві @ $ ORIGIN поточного опису зони.

Кожна завершена рядок параметрів повинна завершуватися символом; .

розділ Acl

Acl (access control list) - дозволяє задати іменований список мереж. Формат розділу: acl "імя_сеті" {ip; ip; ip; };

розділ Options

Розділ Options задає глобальні параметри конфігураційного файлу, керівники всіма зонами. Даний розділ має формат: options {оператори_раздела_Options}; . Options може бути "вкладений" в розділ Zone, при цьому він перевизначає глобальні параметри. Часто використовувані оператори options:

  • allow-query {спісок_ip} - Дозволяє відповіді на запити тільки з спісок_ip. При відсутності - сервер відповідає на всі запити.
  • allow-recursion {спісок_ip} - На запити з спісок_ip будуть виконуватися рекурсивні запити. Для інших - ітеративні. Якщо не заданий параметр, то сервер виконує рекурсивні запити для всіх мереж.
  • allow-transfer {спісок_ip} - Вказує список серверів, яким дозволено брати зону з сервера (в основному тут вказують slave сервера)
  • directory / path / to / work / dir - вказує абсолютний шлях до робочого каталогу сервера. Цей оператор допустимо тільки в розділі options.
  • forwarders {ip порт, ip порт ...} - вказує адреси хостів і якщо потрібно порти, куди переадресовувати запити (зазвичай тут вказуються DNS провайдерів ISP).
  • forward ONLY або forward FIRST - параметр first вказує, DNS-сервера намагатися вирішувати імена за допомогою DNS-серверів, зазначених в параметрі forwarders, і лише в разі, якщо дозволити ім'я за допомогою даних серверів не вдалося, то буде здійснювати спроби дозволу імені самостійно.
  • notify YES | NO - YES - повідомляти slave сервера про зміни в зоні, NO - не повідомляють.
  • recursion YES | NO - YES - виконувати рекурсивні запити, якщо просить клієнт, NO - не виконувати (тільки ітеративні запити). Якщо відповідь знайдена в кеші, то повертається з кешу. (Може використовуватися тільки в розділі Options)

розділ Zone

Визначає опис зон (и). Формат розділу: zone {оператори_раздела_zone}; Оператори, які найбільш часто використовуються:

  • allow-update {спісок_ip} - вказує системи, яким дозволено динамічно оновлювати дану зону.
  • file "имя_файла" - вказує шлях до файлу параметрів зони (повинен бути розташований в каталозі, визначеному в розділі options оператором directory)
  • masters {спісок_ip} -зазначає список майстер-серверів. (Припустимо тільки в підлеглих зонах)
  • type "тіп_зони" - вказує тип зони, описуваної в поточному розділі, тіп_зони може набувати таких значень:
    • forward - вказує зону переадресації, яка переадресовує запити, які прийшли в цю зону.
    • hint - вказує допоміжну зону (даний тип містить інформацію про кореневих серверах, до яких сервер буде звертатися в разі неможливості знайти відповідь в кеші)
    • master - вказує працювати в якості майстер сервера для поточної зони.
    • slave - вказує працювати в якості підлеглого сервера для поточної зони.

Розширені можливості пошуку конфігурації

Значення часу в файлах зон за замовчуванням вказується в секундах, якщо за ними не стоїть одна з наступних букв: S - секунди, M - хвилини, H- годинник, D - дні, W - тижні. Відповідно, запис 2h20m5s матиме значення 2 години 20 хвилин 5 секунд і відповідати 8405 секунд.

Будь-яке ім'я хоста / записи, які не закінчуються точкою вважається неFQDN ім'ям і буде доповнено ім'ям поточної зони. Наприклад, запис domen в файлі зони examle.com буде розгорнуто в FQDN-имя domen.examle.com. .

У конфігураційних файлах BIND можуть застосовуватися такі директиви:

  • $ TTL - визначає TTL за замовчуванням для всіх записів в поточній зоні.
  • $ ORIGIN - змінює ім'я зони з зазначеного в файлі named.conf. При цьому, область дії даної директиви не поширюється "вище" (тобто якщо файл включений директивою $ INCLUDE, то область дії $ ORIGN не поширюється на батьківський)
  • $ INCLUDE - включає вказаний файл як частина файлу зони.

Для того щоб локальний Резолвер сервера теж використовував локальний DNS, необхідно привести файл resolv.conf до наступного вигляду:

dns: ~ # cat /etc/resolv.conf nameserver 127.0.0.1

Якщо в імені ресурсної записи зустрічається символ "*", то це він означає що замість нього можна мати на увазі будь-яку дозволену послідовність символів. Такий запис називають "wildcard запис". Однак, символ "*" не може бути використаний будь-де. Це може бути тільки перший символ в поле Name поточного домену, відокремлений від решти символом "."

Налаштування кешуючого DNS сервера

Після установки bind, він повністю готовий працювати як кешуючий DNS сервер без додаткової настройки. Єдиний недолік - він обробляє запити на всіх інтерфейсах, що нам абсолютно не потрібно, тому ми трохи подредактіруем настройки сервера.

Для того, щоб BIND працював в якості кешуючого, необхідно мати конфігураційні файли заповнені необхідною інформацією:

  • named.conf;
  • опис серверів кореневої зони (зона типу hint);
  • опис зони 127.in-addr.arpa.
dns: ~ # cat /etc/bind/named.conf acl "lan" {192.168.1.1/24; 127.0.0.1; }; options {directory "/ var / cache / bind"; // If there is a firewall between you and nameservers you want // to talk to, you may need to fix the firewall to allow multiple // ports to talk. See http://www.kb.cert.org/vuls/id/800113 / * * Тут сказано, що якщо використовується фаерволл, то необхідно * нашого сервера створити відповідні правила * тобто відкрити доступ по 53 TCP і UDP порту * / forward first; // задаємо пересилання тільки першого запиту forwarders {// вказуємо DNS сервера для пересилання 83.239.0.202; // надані провайдером 213.132.67.110; // бо до них ближче ніж до кореневих}; listen-on {lan; }; // нехай слухає тільки потрібні інтерфейси allow-query {lan; }; // дозволити запити тільки з локальної мережі allow-recursion {lan; }; // рекурсивні запити теж тільки з локальної allow-transfer {none; }; // трансфер зон нам не потрібен version "unknown"; // не відображати версію DNS сервера при відповідях auth-nxdomain no; # Для сумісності RFC1035 listen-on-v6 {none; }; // IPv6 нам не потрібен}; // опис налаштувань кореневих серверів zone "." {Type hint; file "db.root"; }; // описані надалі зони визначають сервер авторитетним для петльових // інтерфейсів, а так само для броадкаст-зон (згідно RFC 1912) zone "localhost" {type master; file "localhost"; }; zone "127.in-addr.arpa" {type master; file "127.in-addr.arpa"; }; zone "0.in-addr.arpa" {type master; file "0.in-addr.arpa"; }; zone "255.in-addr.arpa" {type master; file "255.in-addr.arpa"; };

В даному прикладі наведено кешуючий DNS сервер, що обробляє запити зі списку мереж lan, в яку входить тільки одна локальна мережа 192.168.1.1/24 і петлевий інтерфейс. При необхідності можна включити туди і інші мережі. Після визначення списку мереж в директиві acl, в будь-якому місці конфіга можна буде посилатися на цей список по імені (в нашому прикладі ім'я - lan), що, власне і зроблено в розділі options. Більшість параметрів я прокоментував, але окремої уваги вимагає розділ, що описує зону кореневих серверів. У параметрі file заданий відносний шлях до файлу опису кореневих серверів (шлях, щодо робочого каталогу сервера). За оновленнями даного файлу необхідно стежити, хоча він оновлюється досить рідко (звідки брати оновлений файл я писав в теорії DNS ). Як ви помітили, є так само два записи для зони localhost і два записи зворотних зон для бродкаст доменів. Призначення цих зон полягає в тому, щоб уникнути трансляції випадкових запитів імен відповідних IP-адрес на сервери, які обслуговують кореневу зону.

Щоб не вносити плутанину в купі конфігураційних файлів, в статті я наводжу приклади на основі єдиного конфігураційного файлу. Насправді, в останніх версіях Debian (та інших дистрибутивах Linux), файл named.conf виглядає наступним чином:

root @ master: ~ # cat /etc/bind/named.conf // This is the primary configuration file for the BIND DNS server named. // // Please read /usr/share/doc/bind9/README.Debian.gz for information on the // structure of BIND configuration files in Debian, * BEFORE * you customize // this configuration file. // // If you are just adding zones, please do that in /etc/bind/named.conf.local include "/etc/bind/named.conf.options"; include "/etc/bind/named.conf.local"; include "/etc/bind/named.conf.default-zones";

Тобто основний файл не містить змін, а включає в себе більш вузько спеціалізовані файли, які відповідають за свої завдання, наприклад named.conf.options - містить глобальні параметри конфігурації, named.conf.default-zones - містить опис localhost і broadcast зон, а named.conf.local містить опису зон, за які відповідає даний сервер.

Далі, хочу звернути увагу на наявність файлів зон в каталозі, вказаному в розділі options в параметрі directory з іменами, відповідними параметрами file в розділах, що описують зони:

dns: ~ # ls -l / var / cache / bind / разом 24 -rw-r - r-- 1 root root 237 Май 28 1:28 0.in-addr.arpa -rw-r - r-- 1 root root 271 Май 28 1:28 127.in-addr.arpa -rw-r - r-- 1 root root 237 Май 28 1:28 255.in-addr.arpa -rw-r - r-- 1 root root 2994 Май 28 1:28 db.root -rw-r - r-- 1 root root 270 Май 28 1:28 localhost dns: ~ # cat /var/cache/bind/127.in-addr.arpa ; ; BIND reverse data file for local loopback interface; $ 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.

Розглядати файли "петльових" і бродкастових зон не бачу сенсу, тому що після установки пакета bind настройки задані за замовчуванням в цих файлах цілком прийнятні. Далі, при організації майстер сервера ми розглянемо приклад опису файлу зони. Хочу звернути увагу, що ми налаштовуємо кешуючий сервер, а визначаємо ми його і як master для деяких з зон. У нашому випадку "кешуючий" говорить про те, що наш сервер не підтримує жодну з реально існуючих зон, тобто йому не делеговане прав на таке обслуговування.

Так, мало не забув, демон named повинен бути дозволений для запуску на необхідних рівнях виконання ОС (команда в RedHat - / sbin / chkconfig bind9 on, в Debian - /usr/sbin/update-rc.d bind9 defaults). Після зміни конфігураційних файлів можна додати сервіс в автозавантаження і запустити демон:

dns: ~ # update-rc.d bind9 defaults Adding system startup for /etc/init.d/bind9 ... /etc/rc0.d/K20bind9 -> ../init.d/bind9 /etc/rc1.d / K20bind9 -> ../init.d/bind9 /etc/rc6.d/K20bind9 -> ../init.d/bind9 /etc/rc2.d/S20bind9 -> ../init.d/bind9 / etc /rc3.d/S20bind9 -> ../init.d/bind9 /etc/rc4.d/S20bind9 -> ../init.d/bind9 /etc/rc5.d/S20bind9 -> ../init.d / bind9 dns: ~ # /etc/init.d/bind9 start Starting domain name service ...: bind9.

На цьому настройка кешуючого DNS завершена. Всі запити, які потрапляють в кеш DNS сервера він зберігає в оперативній пам'яті комп'ютера і при перезапуску демона ці дані обнуляються. Для перевірки роботи кеша можна виконати команду nslookup mail.ru example.com. , Якщо у відповіді міститься рядок Non-authoritative answer, то адреса прийшов з кешу, а так само якщо виконати dig www.ru. (Або інший домен, якого ще немає в кеші) і через деякий час повторити команду, то час відповіді повинно бути набагато менше.

Давайте розглянемо інші варіанти сервера.

Головний (master) сервер зони

Основний конфиг містить наступні настройки:

dns: ~ # cat /etc/bind/named.conf acl "lan" {192.168.1.1/24; 127.0.0.1; }; options {directory "/ var / cache / bind"; allow-query {any; }; // відповідати на зпроси з усіх інтерфейсів recursion no; // заборонити рекурсивні запити auth-nxdomain no; // для сумісності RFC1035 listen-on-v6 {none; }; // IPv6 нам не потрібен version "unknown"; // не відображати версію DNS сервера при відповідях / * * Розкоментуйте рядки нижче, якщо * хочете дозволити рекрусівние запити * з локальної мережі. * (Так само, необхідно закомментировать * recursion no;) * / # forwarders {// вказуємо DNS сервера для пересилання # 83.239.0.202; // надані провайдером # 213.132.67.110; // бо до них ближче ніж до кореневих #}; # Allow-recursion {lan; }; // рекурсивні запити теж тільки з локальної}; // опис налаштувань кореневих серверів zone "." {Type hint; file "db.root"; }; // описані надалі зони визначають сервер авторитетним для петльових // інтерфейсів, а так само для броадкаст-зон (згідно RFC 1912) zone "localhost" {type master; file "localhost"; }; zone "127.in-addr.arpa" {type master; file "127.in-addr.arpa"; }; zone "0.in-addr.arpa" {type master; file "0.in-addr.arpa"; }; zone "255.in-addr.arpa" {type master; file "255.in-addr.arpa"; }; // опис основної зони zone "example.com" {type master; file "example.com"; allow-transfer {10.0.0.191; }; }; // опис зворотних зон zone "0.0.10.in-addr.arpa" {type master; file "0.0.10.in-addr.arpa"; allow-transfer {10.0.0.191; }; }; zone "1.168.192.in-addr.arpa" {type master; file "1.168.192.in-addr.arpa"; # Allow-transfer {10.0.0.191; }; // зона описує локальну мережу тому її не передали}; // настройки логування logging {channel "misc" {file "/var/log/bind/misc.log" versions 4 size 4m; print-time yes; print-severity yes; print-category yes; }; channel "query" {file "/var/log/bind/query.log" versions 4 size 4m; print-time yes; print-severity no; print-category no; }; category default { "misc"; }; category queries { "query"; }; };

Давайте коротко розберемо конфігураційний файл і настройки master сервера: ми налаштовуємо майстер сервер для зони example.com. . Згідно конфіга, наш BIND має робочий каталог / var / cache / bind, сервер відповідає на запити з усіх інтерфейсів (allow-query {any;};), рекурсивні запити обробляє як ітеративні (Recursion no), є майстер-сервером для зони example.com і локальних службових зон (type master). При цьому, якщо необхідно дозволити кешування (тобто рекурсивні запити) для локальної мережі, то необхідно розкоментувати параметри forwarders і allow-recursion і закомментировать recursion no ;.

Так само, для прикладу, я привів можливості BIND Залогуватися все, що відбувається при роботі сервера (можна для цієї мети використовувати syslog ). У розділі logging задаються 2 параметра channel (можна і більше двох - на ваш розсуд), ці параметри дослівно можна назвати "канал" записи. Кожен канал визначає ім'я каналу та налаштування параметрів запису (що записувати, а що - ні і куди писати). Директива category задає яку категорію повідомлень в який канал відправляти. Виходячи з цього, ми маємо: запис стандартної інформації в канал misc, а приходять запити надсилаються в канал query. При цьому, якщо файли журналу досягають 4Мб (size 4m), він перейменовується додаванням до імені .1 і починається запис в новий журнал, числа в кінці інших журналів збільшуються. Журнали з номером, більш зазначеного в version (в нашому випадку 4) видаляються (Керувати ротацією логів можна так само за допомогою logrotate ). Параметри print * визначають заносити в журнал час появи, важливість і категорію інформації. Більш докладно про налаштування розділу logging можна почитати в.

Окремо хочеться описати параметр allow-transfer {10.0.0.191; }; . Даний параметр описує сервери, яким дозволено завантажувати копію зони - т.зв. slave серверів. У наступному прикладі ми розберемо настройку slave DNS.

Для коректної роботи логування необхідно створити відповідний каталог і привласнити необхідні права:

dns: ~ # mkdir / var / log / bind / dns: ~ # chmod 744 / var / log / bind / dns: ~ # ps aux | grep named bind 4298 0.0 3.4 46792 13272? Ssl Jul05 0:00 / usr / sbin / named -u bind root 4815 0.0 0.1 3304 772 pts / 4 S + 18:19 0:00 grep named dns: ~ # chown bind / var / log / bind / dns: ~ # ls -ld / var / log / bind / drwxr - r-- 2 bind root 4096 Лип 6 18:18 / var / log / bind /

Давайте далі розглянемо наш файл опису зони example.com. :

dns: ~ # cat /var/cache/bind/example.com $ TTL 3D @ IN SOA ns.example.com. root.example.com. (2011070601; serial 8H; refresh 2H; retry 2W; expire 1D); minimum @ IN NS ns.example.com. @ IN NS ns2.example.com. @ IN A 10.0.0.152 @ IN MX 5 mx.example.com. ns IN A 10.0.0.152 ns2 IN A 10.0.0.191 mx IN A 10.0.0.152 www IN CNAME @

а так само в домені in-addr.arpa.

dns: ~ # cat /var/cache/bind/0.0.10.in-addr.arpa $ TTL 3600 @ IN SOA ns.examle.com. root.example.com. (2007042001; Serial 3600; Refresh 900; Retry 3600000; Expire 3600); Minimum IN NS ns.examle.com. IN NS ns2.example.com. 152 IN PTR examle.com. 191 IN PTR ns.example.com. * IN PTR examle.com. dns: ~ # cat /var/cache/bind/1.168.192.in-addr.arpa $ TTL 3600 @ IN SOA ns.examle.com. root.example.com. (2007042001; Serial 3600; Refresh 900; Retry 3600000; Expire 3600); Minimum IN NS ns.examle.com. IN NS ns2.example.com. * IN PTR examle.com.

Наша мережа невелика, передбачається, що в мережі зовсім мало машин. Всі сервіси мережі розміщені на одному хості example.com., Тому і master DNS (ns.example.com.) І поштовий сервер (mx.example.com.) Вказує на одну машину (10.0.0.152).

Вторинний (secondary, slave) авторитетний сервер зони

Основна функція slave сервера - автоматична синхронізація опису зони з master сервером. Дане завдання регламентується документом RFC 1034 в розділі 4.3.5. Згідно з цим документом обмін даними між серверами рекомендовано проводити по протоколу TCP , За допомогою запиту AXFR. За цим запитом за одне TCP з'єднання повинна передаватися вся зона цілком (RFC 1035).

Так само, slave DNS-сервер ділить навантаження з master сервером або приймає на себе все навантаження в разі аварії па першому сервері.

Перш ніж приступити до налаштування slave DNS сервера, необхідно перевірити можливість отримання зони вручну із вторинного сервера за допомогою наступної команди:

root @ debian: ~ # dig @ 10.0.0.152 example.com. axfr; << >> DiG 9.7.3 << >> @ 10.0.0.152 example.com. axfr; (1 server found) ;; global options: + cmd example.com. 259200 IN SOA ns.example.com. root.example.com. 2011070801 28800 7200 1209600 86400 example.com. 259200 IN NS ns.example.com. example.com. 259200 IN NS ns2.example.com. example.com. 259200 IN A 10.0.0.152 example.com. 259200 IN MX 5 mx.example.com. mx.example.com. 259200 IN A 10.0.0.152 ns.example.com. 259200 IN A 10.0.0.152 ns2.example.com. 259200 IN A 10.0.0.191 www.example.com. 259200 IN CNAME example.com. example.com. 259200 IN SOA ns.example.com. root.example.com. 2011070801 28800 7200 1209600 86400 ;; Query time: 14 msec ;; SERVER: 10.0.0.152 # 53 (10.0.0.152) ;; WHEN: Fri Jul 8 15:33:54 2011 ;; XFR size: 11 records (messages 1, bytes 258)

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

  1. Скопіювати конфігураційний файл named.conf з master сервера;
  2. Замінити параметр type master на type slave в тих зонах, для яких він буде вторинним;
  3. Параметр allow-transfer {10.0.0.191; }; замінити на masters {10.0.0.152;}; в тих зонах, для яких він буде вторинним;
  4. Видалити зони, що не буде обслуговувати поточний сервер, в тому числі і кореневу, якщо slave не відповідатиме на рекурсивні запити;
  5. Створити каталоги для логів, як в попередньому прикладі.

Разом, ми отримуємо конфіг slave сервера:

root @ debian: ~ # cat /etc/bind/named.conf options {directory "/ var / cache / bind"; allow-query {any; }; // відповідати на запити з усіх інтерфейсів recursion no; // заборонити рекурсивні запити auth-nxdomain no; // для сумісності RFC1035 listen-on-v6 {none; }; // IPv6 нам не потрібен version "unknown"; // не відображати версію DNS сервера при відповідях}; // описані надалі зони визначають сервер авторитетним для петльових // інтерфейсів, а так само для броадкаст-зон (згідно RFC 1912) zone "localhost" {type master; file "localhost"; }; zone "127.in-addr.arpa" {type master; file "127.in-addr.arpa"; }; zone "0.in-addr.arpa" {type master; file "0.in-addr.arpa"; }; zone "255.in-addr.arpa" {type master; file "255.in-addr.arpa"; }; // опис основної зони zone "example.com" {type slave; file "example.com"; masters {10.0.0.152; }; }; // опис зворотного зони zone "0.0.10.in-addr.arpa" {type slave; file "0.0.10.in-addr.arpa"; masters {10.0.0.152; }; }; // настройки логування logging {channel "misc" {file "/var/log/bind/misc.log" versions 4 size 4m; print-time YES; print-severity YES; print-category YES; }; channel "query" {file "/var/log/bind/query.log" versions 4 size 4m; print-time YES; print-severity NO; print-category NO; }; category default { "misc"; }; category queries { "query"; }; };

після перезапуску наш slave сервер благополучно скопіює необхідну йому інформацію з головного сервера, про що буде говорити наявність файлів в каталозі:

root @ debian: ~ # ls -la / var / cache / bind / разом 28 drwxrwxr-x 2 root bind 4096 Лип 8 18:47. drwxr-xr-x 10 root root 4096 Лип 8 15:17 .. -rw-r - r-- 1 bind bind 416 Лип 8 18:32 0.0.10.in-addr.arpa ...... - rw-r - r-- 1 bind bind 455 Лип 8 18:32 example.com ........

В принципі, / stroallow-transfer {pngp slave сервер може не зберігати копію зони у себе в файлової системі. Ця копія потрібна тільки в момент старту DNS. Наявність копії зони в файлової системі може позбавити від збою при недоступності master сервера під час запуску slave DNS. Якщо не вказати опцію file в розділі zone, то копія не створюється.

Налаштування netfilter ( iptables ) Для DNS BIND

Власне, налаштувавши роботу сервера, непогано було б його захистити. Ми знаємо, що сервер працює на 53 / udp порту. Почитавши статтю про те, що таке netfilter і правила iptables і ознайомившись з практичними прикладами iptables , Можна створити правила фільтрації мережевого трафіку:

dns ~ # iptables-save # типові правила iptables для DNS * filter: INPUT DROP [7511: 662 704]: FORWARD DROP [0: 0]: OUTPUT DROP [0: 0] -A INPUT -i lo -j ACCEPT -A INPUT -m conntrack --ctstate RELATED, ESTABLISHED -j ACCEPT -A INPUT -m conntrack --ctstate INVALID -j DROP # дозволити доступ локальної мережі до DNS сервера: -A INPUT -s 192.168.1.1/24 -d 192.168.1.1/ 32 -p udp -m udp --dport 53 -m conntrack --ctstate NEW -j ACCEPT -A OUTPUT -o lo -j ACCEPT -A OUTPUT -p icmp -j ACCEPT -A OUTPUT -p udp -m udp - sport 32768: 61000 -j ACCEPT -A OUTPUT -p tcp -m tcp --sport 32768: 61000 -j ACCEPT -A OUTPUT -m conntrack --ctstate RELATED, ESTABLISHED -j ACCEPT # дозволити доступ DNS сервера здійснювати вихідні запити -A OUTPUT -p udp -m udp --dport 53 -m conntrack --ctstate NEW -j ACCEPT COMMIT

Це типовий приклад! Для завдання правил iptables під Ваші завдання і конфігурацію мережі, необхідно розуміти принцип роботи netfilter в Linux, почитавши вищевказані статті.

Усунення несправностей

Основним джерелом для виявлення проблем з DNS є системний лог . Ось приклад помилок при запуску, коли я помилився з шляхом до файлу зони корових серверів:

Jul 5 18:12:43 dns-server named [4224]: starting BIND 9.7.3 -u bind Jul 5 18:12:43 dns-server named [4224]: built with '--prefix = / usr' '- -mandir = / usr / share / man '' --infodir = / usr / share / info '' --sysconfdir = / etc / bind '' --localstatedir = / var '' --enable-threads '' - enable-largefile '' --with-libtool '' --enable-shared '' --enable-static '' --with-openssl = / usr '' --with-gssapi = / usr '' --with- gnu-ld '' --with-dlz-postgres = no '' --with-dlz-mysql = no '' --with-dlz-bdb = yes '' --with-dlz-filesystem = yes '' - -with-dlz-ldap = yes '' --with-dlz-stub = yes '' --with-geoip = / usr '' --enable-ipv6 '' CFLAGS = -fno-strict-aliasing -DDIG_SIGCHASE -O2 '' LDFLAGS = '' CPPFLAGS = 'Jul 5 18:12:43 dns-server named [4224]: adjusted limit on open files from 1024 to 1048576 Jul 5 18:12:43 dns-server named [4224]: found 1 CPU, using 1 worker thread Jul 5 18:12:43 dns-server named [4224]: using up to 4096 sockets Jul 5 18:12:43 dns-server named [4224]: loading configuration from '/ etc / bind / named.conf 'Jul 5 18:12:43 dns-server named [4224]: reading bu ilt-in trusted keys from file '/etc/bind/bind.keys' Jul 5 18:12:43 dns-server named [4224]: using default UDP / IPv4 port range: [1024, 65535] Jul 5 18:12 : 43 dns-server named [4224]: using default UDP / IPv6 port range: [1024, 65535] Jul 5 18:12:43 dns-server named [4224]: listening on IPv4 interface lo, 127.0.0.1 # 53 Jul 5 18:12:43 dns-server named [4224]: listening on IPv4 interface eth1, 192.168.1.1 # 53 Jul 5 18:12:43 dns-server named [4224]: generating session key for dynamic DNS Jul 5 18: 12:43 dns-server named [4224]: could not configure root hints from '/etc/bind/db.root': file not found Jul 5 18:12:43 dns-server named [4224]: loading configuration: file not found # файл не знайдений Jul 5 18:12:43 dns-server named [4224]: exiting (due to fatal error) Jul 5 18:15:05 dns-server named [4298]: starting BIND 9.7.3 -u bind Jul 5 18:15:05 dns-server named [4298]: built with '--prefix = / usr' '--mandir = / usr / share / man' '--infodir = / usr / share / info' '--sysconfdir = / etc / bind' '--localstatedir = / var' '- -enable-threads '' --enable-largefile '' --with-libtool '' --enable-shared '' --enable-static '' --with-openssl = / usr '' --with-gssapi = / usr '' --with-gnu-ld '' --with-dlz-postgres = no '' --with-dlz-mysql = no '' --with-dlz-bdb = yes '' --with- dlz-filesystem = yes '' --with-dlz-ldap = yes '' --with-dlz-stub = yes '' --with-geoip = / usr '' --enable-ipv6 '' CFLAGS = -fno -strict-aliasing -DDIG_SIGCHASE -O2 '' LDFLAGS = '' CPPFLAGS = 'Jul 5 18:15:05 dns-server named [4298]: adjusted limit on open files from 1024 to 1048576 Jul 5 18:15:05 dns- server named [4298]: found 1 CPU, using 1 worker thread Jul 5 18:15:05 dns-server named [4298]: using up to 4096 sockets Jul 5 18:15:05 dns-server named [4298]: loading configuration from '/etc/bind/named.conf' Jul 5 18:15:05 dns-server named [4298]: using default UDP / IPv4 port range: [1024, 65535] Jul 5 18:15:05 dns-server named [4298]: using default UDP / IPv6 port range: [1024, 65535] Jul 5 18:15:05 dns-server named [4298]: listening on IPv4 interface lo, 127.0.0.1 # 53 Jul 5 18:15: 05 dns-server named [4298]: listening on IPv4 interface eth1, 192.168.1.1 # 53 Jul 5 18:15:05 dns-server named [4298]: automatic empty zone: 254.169.IN-ADDR.ARPA Jul 5 18:15:05 dns -server named [4298]: automatic empty zone: 2.0.192.IN-ADDR.ARPA Jul 5 18:15:05 dns-server named [4298]: automatic empty zone: 100.51.198.IN-ADDR.ARPA Jul 5 18:15:05 dns-server named [4298]: automatic empty zone: 113.0.203.IN-ADDR.ARPA Jul 5 18:15:05 dns-server named [4298]: automatic empty zone: 255.255.255.255.IN -ADDR.ARPA Jul 5 18:15:05 dns-server named [4298]: automatic empty zone: 0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0 .0.0.0.0.IP6.ARPA Jul 5 18:15:05 dns-server named [4298]: automatic empty zone: 1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0 .0.0.0.0.0.0.0.0.IP6.ARPA Jul 5 18:15:05 dns-server named [4298]: automatic empty zone: DFIP6.ARPA Jul 5 18:15:05 dns-server named [4298]: automatic empty zone: 8.EFIP6.ARPA Jul 5 18:15:05 dns-server named [4298]: automatic empty zone: 9.EFIP6.ARPA Jul 5 18:15:05 dns-server n amed [4298]: automatic empty zone: AEFIP6.ARPA Jul 5 18:15:05 dns-server named [4298]: automatic empty zone: BEFIP6.ARPA Jul 5 18:15:05 dns-server named [4298]: automatic empty zone: 8.BD0.1.0.0.2.IP6.ARPA Jul 5 18:15:05 dns-server named [4298]: zone 0.in-addr.arpa/IN: loaded serial 1 Jul 5 18:15:05 dns-server named [4298]: zone 127.in-addr.arpa/IN: loaded serial 1 Jul 5 18:15:05 dns-server named [4298]: zone 255.in-addr.arpa/IN: loaded serial 1 Jul 5 18:15:05 dns-server named [4298]: zone localhost / IN: loaded serial 2 Jul 5 18:15:05 dns-server named [4298]: running # запуск пройшов вдало

Відмінним інструментом для діагностики є команди діагностики DNS .

резюме

У поточній статті я описав настройку основних конфігурацій DNS сервера BIND. Метою статті було - дати уявлення про роботу сервера BIND в UNIX. Я практично не торкнувся питання безпеки ДНС і мало торкнувся таких специфічні настройки, як робота сервера в прикордонний режим, коли в різні мережі віддається різна інформація про зону (нах). Для більш глибокого освоєння я надам список додаткових джерел, в яких, я сподіваюся, вдасться отримати потрібну інформацію. На цьому ставлю крапку. До новой зустрічі.

Що читати:

Система доменних імен: http://citforum.ru/internet/dns/khramtsov/
RFC 1034 - Domain Names - Concepts and Facilities: http://tools.ietf.org/html/rfc1034
RFC 1035 - Domain Names - Implementation and Specification: http://tools.ietf.org/html/rfc1035
RFC тисячі п'ятсот тридцять сім - Common DNS Data File Configuration Errors: http://tools.ietf.org/html/rfc1537
RFC тисяча п'ятсот дев'яносто одна - Domain Name System Structure and Delegation: http://tools.ietf.org/html/rfc1591
RFC 1713 - Tools for DNS Debugging: http://tools.ietf.org/html/rfc1713
RFC 2606 - Reserved Top Level DNS Names: http://tools.ietf.org/html/rfc2606
Безпека DNS (DNSSEC): http://book.itep.ru/4/4/dnssec.htm
BIND 9 Administrator Reference Manual: http://www.bind9.net/manual/bind/9.3.2/Bv9ARM.html
Secure BIND Template: http://www.cymru.com/Documents/secure-bind-template.html
Добре розписані параметри конфіга російською: http://www.bog.pp.ru/work/bind.html
Автоматичне створення файлу зони: http://www.zonefile.org/?lang=en#zonefile

Upd 2012.02.14: додав настройку netfilter для DNS

З повагою, Mc.Sim!

Інші матеріали в категорії HOWTO

Org/?

Новости