«Консольные команды Linux» и «DNS сервер BIND с локальными зонами»: разница между страницами

Материал из support.qbpro.ru
(Различия между страницами)
imported>Vix
Нет описания правки
 
imported>Vix
Нет описания правки
 
Строка 1: Строка 1:
== Консольные команды. Часть 1, Администрирование в консоли. ==
Исходные данные


*'''login''' запрос от пользователя имени и пароля (запрос от системы к пользователю) для входа в систему( по умолчанию, при наборе пароля, он не отображается).
Для корректной работы DNS нем необходимо иметь настроенную сеть. DNS в текущей статье будет настроен на дистрибутиве Debian, особенности других дистрибутивов тоже будут отмечены. Конфиг сети стенда следующий:
*'''logout''' выход из текущего сеанса оболочки.
*'''startx''' команда для запуска графического интерфейса X Window (не путайте с системой Windows.Не бойтесь. Это не она:)).
*'''shutdown''' останавливает систему и предотвращает повреждение файловой системы при этом, но,используется только при работе в консольном режиме.При работе в режиме X Window, не используйте.
*'''halt''' быстрое и корректное выключение системы.
*'''poweroff''' корректное выключение системы.
*'''reboot''' корректное выключение с последущей загрузкой.Перезагрузка.
*'''vmstat''' выдаёт сведения о процессах, памяти и загруженности центрального процессора.
*'''su''' вход в сеанс администратора, но прийдётся ввести пароль.Для выхода из этого сеанса наберите exit и нажмите ENTER.
*'''apropos''' поиск строки в заголовках и названиях документации ( дополнительно вводится слово для поиска). Выдаёт список всего найденного.
*'''cal''' форматированный календарь на текущий месяц ( добавить y и будет календарь на весь текущий год).
*'''date''' отображает текущие дату и время, по системным часам ядра.
*'''oclock''' простые часы, которые висят на рабочем столе (много дополнительных параметров).
*'''finger''' отображение информации о пользователе, имя которого указано в команде.
*'''hostname''' команда отображает идентификатор данного узла сети ( его имя). root может изменить имя узла на новое.
*'''hwclock''' встроенные часы Вашего компьютера.Для изменения даты и времени и синхронизации с системными часами, необходимы привелегии root.
*'''pwd''' отображает полный путь к текущему каталогу.
*'''tzselect''' запуск утилиты, которая позволяет выбрать часовой пояс.
*'''uname''' выводит информацию об используемой операционной системе (при вводе дополнительных параметров команды , выдаёт довольно много информации).
*'''uptime''' показывает текущее время, продолжительность сеанса , количество пользователей и загруженность процессора.
*'''users''' отображает краткий список пользователей работающих в системе в данный момент.
*'''w''' подробная информация о всех пользователях, работающих в данный момент и также простой, вход в систему и др.Если нужен один пользователь, то указать имя в параметре.
*'''whatis''' поиск по базе данных страниц руководства и отображение краткого описания.
*'''who''' список пользователей работающих в системе в данный момент.
*'''whereiz''' находит файлы, страницы справочного руководства для указанной команды.
*'''which''' показывает полный путь к исполняемому файлу команды.
*'''whoami''' показывает текущий идентификатор пользователя, работающего в данном терминале.
*'''write''' отправляет сообщение другому пользователю, находящемуся в системе, путём копирования строк с терминала отправителя на терминал получателя.
*'''wall''' отправляет сообщение на терминал каждого пользователя находящегося в системе в данный момент.
*'''history''' показывает пронумерованный список команд, которые Вы выполняли в этом и предыдущем сеансе. Если в списке историии их довольно много, то увидите последние.
*'''jobs''' выводит список всех выполняемых и приостановленных задач.
*'''kill''' завершить процесс (необходимо указать какой).
*'''killall''' позволят управлять процессами используя их имена или имена файлов, а не идентификаторы как в kill. Завершаются все указанные процессы.
*'''kernelversion''' показывает основную и дополнительную версии ядра.
*'''nice''' позволяет отобразить или настроить приоритет задачи.
*'''ps''' выводит список всех работающих процессов.
*'''pstree''' показывает иерархию процессов системы, что хорошо показывает их взаимозависимость.
*'''renice''' задаёт приоритет для указанной задачи.
*'''script''' позволяет записывать весь вывод с терминала в файл.Что бы остановить запись нажмите Ctrl+d.Если имя файла не указано то записывается в typescript.
*'''times''' показывает полное время выполнения процессов для всей системы и данного пользователя.
*'''top''' запускает программу , которая позволяет управлять процессами.И ещё много дополнительной, полезной информации.
*'''cd''' смена текущего каталога.По умолчанию переходит в домашний каталог текущего пользователя (если без параметров).
*'''dir''' отображает файлы в текущем каталоге в алфавитном порядке и с учётом регистра.
*'''file''' показывает тип содержимого указанного файла(текст, выполняемый, данные).
*'''find''' поиск файлов в текущем каталоге.Если указать путь, можно искать везде.
*'''free''' отображает информацию об оперативной памяти, подкачки, кэше,свободная памать, общая и т.д.
*'''ls''' показывает все файлы в текущем каталоге в алфавитном порядке.Аналогична dir.
*'''last''' показывает список пользователей, которые заходили в систему с момента создания файла /var/log/wtmp.
*'''lastlog''' проверяет историю входа в систему зарегистрированных пользователей.Форматирует и выводит на печать файл /var/log/lastlog.
*'''logger''' посылает запрос демону syslogd с просьбой поместить сообщение в системный журнал.
*'''lpr''' отправляет документ на печать демону печати.
*'''chmod''' изменяет режим доступа к файлу.Символьный или числовой формат.
*'''chown''' смена владельца указанного файла.Требуется доступ root.
*'''chage''' применяется для изменения срока действия учетной записи.Для администрирования.
*'''chfn''' изменяет сведения о пользователе в файле /etc/passwd из которого берёт информацию команда finger .
*'''chgrp''' команда для администратора,для изменения группы владельцев файла.
*'''clear''' очищает экран терминала (если это возможно).
*'''crontab''' обеспечивает возможность выполнения определённых задач по расписанию. Чаще используется администратором, хотя свои задачи могут быть и у пользователей.
*'''csplit''' разбивает файл на несколько частей.Надо задать метод разбивки (строки и т.д.).
*'''cp''' копирует один файл в другой, или несколько файлов в каталог.
*'''dd''' копирование файла с одновременным выполнением различных, дополнительных преобразований.
*'''dc''' калькулятор.
*'''debugfs''' применяется для восстановления файловой системы (ext2,ext3) если недостаточно команды fsck.
*'''df''' показывает количество используемого и свободного дискового пространства для всех подключенных разделов файловой системы.
*'''du''' показывает количество блоков диска, занятых каждым из файлов каталога.
*'''mc''' запускает программу Midnight Commander диспетчер файлов в текстовой консоли. Напоминает MSDOS менеджеры и довольно проста и удобна в использовании.Очень много нужных и удобных функций.
*'''mkdir''' создание указанного каталога.
*'''man''' справочное руководство.
*'''mcat''' копирует необработанные данные на дискету.
*'''mcopy''' использует отформатированную дискету MSDOS для копирования файлов в Линукс и из Линукс без предварительного подключения дискеты к файловой системе.
*'''mdel''' удаляет файл на отформатированной дискете MSDOS.
*'''mdir''' отображает содержимое каталога на дискете MSDOS.
*'''mdu''' показывает дисковое пространство занятое каталогом MSDOS.
*'''mesg''' контролирует доступ к Вашему терминалу, что бы коллеги не могли засыпать Вас сообщениями с помощью команды write
*'''mformat''' создаёт на дискете файловую систему MSDOS.
*'''mkbootdisk''' применяется в некоторых дистрибутивах, для создания загрузочной дискеты, содержащей всё необходимое для аварийной загрузки.
*'''mktemp''' создаёт уникальное имя файла для временной работы.
*'''mlabel''' создаёт метку тома на MSDOS на отформатированной дискете.
*'''mmd''' создаёт подкаталог MSDOS на отформатированной дискете.
*'''mmount''' подключает к файловой системе отформатированное устройство MSDOS.
*'''mmove''' перемещает или переименовывает файл на дискете MSDOS.
*'''more''' средство постраничного просмотра текстового файла.
*'''mv''' переименовывает или перемещает файлы или каталоги.
*'''rm''' удаление указанного файла.Можно и много удалить.
*'''rmdir''' удаление указанного пустого каталога.
*'''safedelete''' удалиние указанного файла в каталог safedelete,где он хранится некоторое время перед необратимым удалением.
*'''stat''' отображение всей доступной информации об указанном файле.
*'''touch''' изменяет время последнего доступа или изменения файла на текущее время.
*'''undelete''' восстанавливает файлы удалённые командой safedelete.
*'''wc''' показывает число строк, слов и символов в файле.
*'''bunzip2''' распаковывает указанный файл на 30%быстрей чем gzip.
*'''bzip2''' сжимает указанный файл по ускоренному алгоритму.
*'''bzip2recover''' делает попытку восстановить данные из повреждённого файла сжатого bzip2.
*'''compress''' сжимает указанный файл по другому алгоритму.
*'''uncompress'''Полужирное начертание распаковывает файл сжатый предыдущей командой.
*'''cpio''' позволяет создавать архивы и извлекать из архивов файлы.Позволяет копировать файлы. Необходимо указывать соответствующие параметры.
*'''gpg''' позволяет зашифровать и расшифровать файл.Метод шифрования открытым ключом. Позволяет создавать электронные подписи.Если этой программы нет у Вас, скачайте http://www.gnupg.org
*'''gzip''' сжимает указанный файл.
*'''gunzip''' распаковывает указанный файл (расширения .Z,.gz,.tgz,.zip ).
*'''gzexe''' позволяет сжать исполняемый файл с указанным именем так, что бы он автоматически распаковывался и выполнялся, когда пользователь даёт команду на выполнение сжатого файла.
*'''gpasswd''' устанавливает пароль группы.
*'''mcrypt''' Шифрует указанный файл.Создаётся новый файл в рабочем каталоге с расширением .enc. Вам будет предложено ввести пароль.Не забудьте его.
*'''mdecrypt''' расшифровывает это же файл.Если этих утилит нет, скачайте http://mcrypt/hellug.grl
*'''tar''' помещает два и более файлов в новый или существующий архив или извлекает их из архива.При задании каталога, заархивирует все файлы в каталоге и подкаталоге.
*'''talk''' позволяет вести интерактивный диалог с пользователем сети ИНТЕРНЕТ.
*'''tee''' отсылет выходные данные на два устройства вывода.Можно одновременно вывести на экран и в файл.
*'''toe''' выдаёт сведения о существующих терминалах, которые могут быть использованы для дальнейшей работы.
*'''touch''' изменяет время создания файла на текущее.Если файл не существует, то создаёт новый, пустой файл.
*'''unarj''' распаковывает или выводит список содержимого указанного архива в формате .ARJ(формат сжатия MS DOS).
*'''unzip''' распаковывает и извлекает файлы из архивов , созданных утилитами ZIP ( Linux,MS DOS,Microsoft Windows ).
*'''zip''' архивирует и сжимает файлы.
*'''zipinfo''' отображает информацию о содержимом архива.Если указать имя, то выдаст информацию о конкретном файле.
*'''zipnote''' позволяет вывести и отредактировать комментарии к файлам из архива ZIP.
*'''zipsplit''' позволяет разделить архив zip на достаточно маленькие части, для записи их на сменные носители, и записывает файлы на указанное устройство(дискеты).
*'''zforce''' добавляет расширение .gz ко всем файлам в рабочем каталоге, или к указанному файлу, которые были сжаты, но не имеют расширения.Т.е. предотвращает повторное сжатие.
*'''uuencode''' кодирует двоичный файл для передачи по ASC11сетям.
*'''uudecode''' декодирует выше названный файл.
*'''autorun''' автоматически распознаёт все доступные приводы CDROM в системе, монтирует их при вставке диска и может запускать отдельные приложения (например проигрыватель).Для использования, необходимо добавить параметры в файл привода.
*'''badblocks''' проверить указанное устройство на наличие повреждённых секторов (указать устройство).
*'''eject''' извлекает носитель из указанного устройства.Если устройство смонтировано то команда производит размонтирование перед извлечением носителя.
*'''e2fsck''' проверяет и при необходимости восстанавливает повреждённый том файловой системы (ext2,ext3).
*'''echo''' выводит строку текста на стандартное устройство вывода.
*'''fdformat''' форматирование гибкого диска.Дополнительно вводится имя устройства и необходимый вид форматирования.
*'''fg''' переводит процесс выполняемый в фоновом режиме в приоритетный режим.
*'''fgconsole''' показывает количество активных виртуальных консолей.
*'''fsck''' проверяет и восстанавливает файловую систему.
*'''mount''' монтирование файловой системы.
*'''umount''' отмонтирование файловой системы (в обоих командах необходимо указать, что именно).
*'''rdev''' при вызове без параметров выводит информацию о текущей файловой системе.
*'''rcp''' применяется для копирования файлов с одного компьютера на другой.
*'''rdate''' получает значение даты и времени от другого узла сети.Используется для синхронизации системного времени узлов.
*'''rename''' переименовывает файлы.Очень удобно, когда много файлов.
*'''resize''' изменяет размер окна виртуального терминала в графическом окружении.
*'''restore''' восстанавливает файлы заархивированные с помощью команды dump.
*'''runlevel''' отображает текущий и предыдущий уровни выполнения.
*'''shred''' выполняет безопасное удаление файла предварительно перезаписав его содержимое на другой диск.
*'''sleep''' приостанавливает начало выполнения процесса на заданное количество секунд.
*'''usleep''' приостанавливает на микросекунды.
*'''sync''' очищает буферы файловой системы.
*'''cmp''' производит быстрое сравнение двух указанных файлов.Если они идентичны, то никакие сообщения не выводятся.
*'''column''' форматирует входной текст из указанного файла в список из пяти колонок.
*'''diff''' сравнивает два указанных текстовых файла.Каждое отличие выводится в контексте. Позволяет сравнивать каталоги.
*'''diff3''' сравнивает три указанных файла и выводит результаты.
*'''enscript''' преобразует указанный текстовый файл в формат Post Script.Вывод может быть направлен на печать или записан в файл.
*'''fmt''' данная утилита производит форматирование каждой строки в указанном файле таким образом, что все строки имеют одинаковую ширину.
*'''head''' утилита выводит первые десять строк файла.Можно и несколько файлов.
*'''ispell''' запуск интерактивной утилиты для проверки орфографии в указанном файле.
*'''id''' отображает действующие значения идентификаторов пользователя и группы для текущего пользователя.
*'''ifconfig''' отображает состояние текущей конфигурации сети или настраивает сетевой интерфейс.
*'''less''' отображает содержимое указанного файла на экране и позволяет удобно просмотреть.
*'''nl''' команда нумерует строки в указанном файле.
*'''paste''' обьединяет соответствующие строки файлов в колонки.При желании можно обьединить несколько файлов.
*'''pdf2ps''' преобразует файл формата PDF в Post Script.Результат записывает на диск.
*'''pdftotext''' преобразует файл из формата PDF в текст и записывает результат на диск.
*'''pr''' подготавливает текст к печати, осуществляя форматирование с разбиением на страницы.Можно подготовить несколько файлов.
*'''sort''' команда позволяет отсортировать строки файла в алфавитном порядке.
*'''split''' разбивает файл на части.
*'''zcat;zmore''' выводит содержимое файла сжатого gzip на экран без распаковки.
*'''zcmp''' сравнивает сжатые gzip два файла без распаковки.
*'''zdiff''' сравнивает сжатые gzip два файла без распаковки.
*'''zegrep;zfgrep;zgrep''' осуществляют поиск указанной строки, выражения в файле сжатом gzip, без распаковки.
*'''aumix''' запускает в интерактивном режиме утилиту, которая управляет различными настройками звуковой карты.
*'''cdda2wav''' утилита предназначена для записи звуковых дорожек с аудиокомпакт диска в файлы формата WAV.Если имя файла не указано, то запись идёт в файл audio.wav в текущем каталоге.
*'''cdlabelgen''' команда предназначена для подготовки обложек к коробкам компакт дисков. Результат в файле формата Post Script.Требуется наличие интерпретатора языка Perl не ниже 5.003 версии.
*'''cdp''' запуск проигрывателя аудиокомпакт дисков в текстовом режиме.
*'''cdparanoia''' считывает звуковые дорожки с аудиокомпактов и записывает в файлы WAV,AIFF,RAW.
*'''combine''' обьединяет два и более графических файла в один.Огромное количество спецэффектов.Является частью пакета Image Magick и можно взять http://www.imagemagick.org
*'''convert''' преобразует указанный входной графический файл, в выходной.Распознаёт множество форматов. Скачать так же как и предидущую.
*'''identify''' определяет формат и характеристики графического файла и проверяет целостность и наличие ошибок.
*'''mogrify''' преобразует графический файл и перезаписывает исходный.
*'''montage''' преобразование нескольких файлов в обьединённое изображение.Скачать http://www.imagemagick.org
*'''mpg123''' воспроизводит на основном устройстве воспроизведения аудио файл в формате MP3. Вписывается имя файла или его адрес в Интернет.Чтобы остановить воспроизведение Ctrl+c.Что бы остановить и выйти из программы Ctrl+c нажать дважды.
*'''play''' воспроизводит звуковой файл с указанным именем.Автоматически распознаёт тип файла. Позволяет добавлять различные звуковые эффекты к воспроизводимым файлам.
*'''playmidi''' воспроизводит зуковые файлы в формате MIDI.
*'''rec''' записывает входной сигнал с микрофона или других входов в звуковой файл. Тип файла следует указать с помощью параметра (type).Есть возможность добавить звуковые эффекты.
*'''sox''' преобразует сэмплы из формата входного сигнала, на выходной с добавлением эффектов.
*'''emacs''' запуск текстового редактора Emacs.
*'''joe''' простой в использовании редактор работающий в текстовом режиме.
*'''pico''' простой и удобный в использовании текстовый редактор.Удобен для редактирования конфигурационных и простых файлов.
*'''vi''' запуск классического текстового редактора VI для UNIX систем.
*'''dmesg''' выводит на экран сообщения ядра, включая отображаемые при запуске и потом. Что бы удобней читать, вводите dmesg|less.
*'''groupadd''' создание группы пользователей с указанным именем.
*'''groupdel''' удаляет группу с указанным именем.
*'''groupmod''' изменяет параметры группы с указанным именем.
*'''mkpasswd''' создаёт высококачественный пароль, состоящий по умолчанию из девяти символов и содержащий по крайней мере буквы в разном регистре и цифры.
*'''passwd''' позволяет пользователю с указанным именем изменять пароль своей учётной записи. root может изменить пароль любого пользователя.
*'''pwgen''' создаёт высококачественный пароль,который хорошо запоминается.Длинна пароля указывается числом. Если этой утилиты нет, скачать  http://metalab.unc.edu/pub/Linux/system/security
*'''quota''' показывает текущую статистику использования диска и текущие ограничения для пользователя или группы с указанным именем.
*'''quotacheck''' исследует файловую систему на предмет использования дискового пространства.
*'''quotaon''' включает и отключает ограничения на использование дискового пространства.
*'''rpm''' запускает менеджер пакетов, утилиту,позволяющую устанавливать , проверять и обновлять пакеты с расширением rpm.
*'''rpmfind''' поиск нужного пакета в базе пакетов RPM через ИНТЕРНЕТ.Последняя версия утилиты http://www.rpm.org
*'''tmpwatch''' удаление всех файлов в указанном каталоге, если к ним не осуществлялся доступ в течении последних n часов.Очищает временные каталоги.
*'''useradd''' создание нового пользователя с указанным именем.
*'''userdel''' удаляет пользователя с указанным именем.
*'''usermod''' изменяет параметры пользователя с указанным именем.
*'''fetchmail''' утилита получения почты.Роботает в фоновом режиме.Скачивает почту с указанного сервера. Если её нет, скачать можно http://www.freshmeat.net
*'''ftp''' устанавливает соединение с указанным узлом и позволяет скачивать или закачивать файлы.
*'''lynx''' запуск консольного WEBброузера.
*'''mail''' утилита редактирования и просмотра электронной почты.Отправка и получение писем.
*'''netstat''' вывод информации о сетевой подсистеме.Очень много настроек и параметров.
*'''ping''' отправка на указанный адрес пакетов для проверки возможности соединения с этим узлом.
*'''telnet''' открывает окно терминала на удалённом узле и запускает интерактивный сеанс.
*'''wvdia'''l программа подключается к ИНТЕРНЕТ по протоколу PPP с использованием параметров, хранящихся в файле /etc/wvdial.conf
*'''wvdialconf''' осуществляет поиск модема, определяет порт, к которому он подключен, его строку инициализации и максимальную скорость передачи данных.Эта информация автоматически записывается в файл (смотри выше).Требуется доступ root.
*'''ar''' средство архивирования, предназначено для создания и распаковки архива.
*'''arch''' отображает данные об архитектуре центрального процессора.
*'''at''' ставит задания в очередь для последующего выполнения в указанное время.
*'''atq''' показывает список заданий которые поставлены в очередь на выполнение.


== Консольные команды. Часть 5, управляем файлами-пакетами deb в консоли. ==
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.


Приведу примеры использования утилит dpkg и apt отвечающих за управления пакетами в системах семейства Debian.
Установка BIND9


'''DPKGdpkg -i имя_пакета '''установит или обновит ранее установленный пакет.
Для работы DNS сервера необходимо установить пакет bind9 (в некоторых дистрибутивах - bind). Как отмечено на схеме - основным конфигурационным файлом BIND является файл named.conf (данный файл может быть размещен в каталоге /etc, иногда в /etc/bind ).
'''dpkg -r имя_пакета''' удалит ранее установленный пакет, но сохранит файл конфигурации.
'''dpkg -l '''отобразит список всех установленных пакетов.
'''dpkg -l | grep tux '''отобразит список всех установленных пакетов с именем "tux".
'''dpkg -s имя_пакета''' имя_пакета отобразит информацию по конкретному пакету.
'''dpkg -P у '''удалит ранее установленный пакет и удалит файл конфигурации.


'''APTapt-get install имя_пакета '''установит пакет.
Параметры (синтаксис) named.conf
'''apt-get update '''получить список пакетов доступных для обновления.
'''apt-get upgrade '''обновит все установленные пакеты.
'''apt-get remove имя_пакета '''удалит пакет.
'''apt-get check '''поможет узнать о конфликтующих пакетов, а также поломанных зависимостях пакетов .
'''apt-get -f install''' исправит выявлены нарушенные зависимости.


'''Вам могут быть полезны следующие опции:
Синтаксис файла named.conf придерживается следующих правил:
'''apt-get -h''' справка
'''apt-get -d''' только загрузить - не устанавливать и не распаковывать архивы
'''apt-get -s''' ничего не делать, имитировать выполнение
'''apt-get -y '''предполагается ответ Yes на все вопросы, сами вопросы не выводить
'''apt-get -f''' продолжать, даже если проверка целостности не удачна
'''apt-get -u''' плюс ко всему показывать список обновленных пакетов


Скачанные из сети файлы помещаются в каталог '''/var/cache/apt/archives''' их всегда можно найти и удалить используя команду
IP-адреса - список IP должен быть разделен символом ";" , возможно указывать подсеть в формате 192.168.1.1/24 или 192.168.1.1/255.255.255.0, (для исключения IP перед ним нужно поставить знак !), возможно указывать имена "any", "none", "localhost" в двойных кавычках.
'''apt-get clean'''


== Изучаем CronTab. ==
Комментарии - строки начинающиеся на #, // и заключенные в /* и */ считаются комментариями.
'''CronTab''' – это утилита позволяющая в определенный день и час '''автоматически запускать''' различные программы или скрипты. Согласитесь, очень удобно.


Структура файла с заданиями для '''CronTab.'''
В файлах описания зон - символ @ является "переменной" хранящей имя зоны, указанной в конфигурационном файле named.conf или в директиве @ $ORIGIN текущего описания зоны.


* <nowiki>* * * * command</nowiki>
Каждая завершенная строка параметров должна завершаться символом ; .
* - - - - -
* | | | | |
* | | | | +----- День недели (0 - 6) (Sunday=0)
* | | | +------- Месяц года (1 — 12)
* | | +--------- День месяца (1 — 31)
* | +----------- Час дня запуска (0 — 23)
* +------------- Минута часа для запуска (0 - 59)


command запускаемая программа или скрипт.
Раздел 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}; Операторы, которые наиболее часто используются:


  '''01 * * * * command''' запуск программы или скрипта каждый час в одну минуту.
  allow-update {список_ip} - указывает системы, которым разрешено динамически обновлять данную зону.
file "имя_файла" - указывает путь файла параметров зоны (должен быть расположен в каталоге, определенном в разделе options оператором directory)
masters {список_ip} -указывает список мастер-серверов. (допустим только в подчиненных зонах)
type "тип_зоны" - указывает тип зоны, описываемой в текущем разделе,тип_зоны может принимать следующие значения:
forward - указывает зону переадресации, которая переадресовывает запросы, пришедшие в эту зону.
hint - указывает вспомогательную зону (данный тип содержит информацию о корневых серверах, к которым сервер будет обращаться в случае невозможности найти ответ в кэше)
master - указывает работать в качестве мастер сервера для текущей зоны.
slave - указывает работать в качестве подчиненного сервера для текущей зоны.
Дополнительные параметры конфигурации
Значения времени в файлах зон по умолчанию указывается в секундах, если за ними не стоит одна из следующих букв: S - секунды, M - минуты, H- часы, D - дни, W - недели. Соответственно, запись 2h20m5s будет иметь значение 2 часа 20 минут 5 секунд и соответствовать 8405 секунд.


'''<nowiki>* 6 * * * command</nowiki>''' запуск программы или скрипта каждый день в 6 часов утра.
Любое имя хоста/записи, не оканчивающиеся точкой считается неFQDN именем и будет дополнено именем текущей зоны. Например, запись domen в файле зоны examle.com будет развернуто в FQDN-имя domen.examle.com. .


Значения могут быть числом, трех-буквенным названием, а так же диапазоном например запись «1-5» в поле day будет означать «с понедельника по пятницу». Значения могут отделяться запятыми: «1,15,31» в поле day будет запускать указанную команду 1-го, 15-го и 31-го числа каждого месяца.
В конфигурационных файлах BIND могут применяться следующие директивы:


Все пять полей времени допускают использование символа звездочка – «*», который обозначает «использовать любое допустимое значение» для этого поля.
$TTL - определяет TTL по-умолчанию для всех записей в текущей зоне.
$ORIGIN - изменяет имя зоны с указанного в файле named.conf. При этом, область действия данной директивы не распространяется  "выше" (то есть если файл включен директивой $INCLUDE, то область действия$ORIGN не распространяется на родительский)
$INCLUDE - включает указанный файл как часть файла зоны.
Для того чтобы локальный резолвер сервера тоже использовал локальный DNS, необходимо привести файл resolv.conf к следующему виду:


'''Для создания задания используйте ниже приведённые команды:'''
dns:~# cat /etc/resolv.conf
nameserver 127.0.0.1
Если в имени ресурсной записи встречается символ "*", то это он означает что вместо него можно подразумевать любую разрешенную последовательность символов. Такую запись называют "wildcard запись". Однако, символ "*" не может быть использован где угодно. Это может быть только первый символ в поле Name текущего домена, отделенный от остальных символом "."


'''crontab -e''' Изменит Ваш crontab файл или создаст новый.
Настройка кэширующего DNS сервера
'''crontab -l''' Отобразит содержимое существующего crontab файла.
'''crontab -r''' Удалит Ваш crontab файл.
'''crontab -v''' Отобразит когда в последний раз Вы изменяли свой crontab файла.


'''Сложно работать с консольным редактором?'''Правьте файлы привычным текстовым редактором... Например используйте Gedit.
После установки bind, он полностью готов работать как кэширующий DNS сервер без дополнительной настройки. Единственный недостаток - он обрабатывает запросы на всех интерфейсах, что нам абсолютно не нужно, поэтому мы немного подредактируем настройки сервера.


'''Файлы с заданиями можно найти тут:'''/usr/lib/cronОсновной каталог команд, связанных со временем./usr/spool/cron/crontabsКаталог файлов регулярных действий./usr/lib/cron/logУчетная информация./usr/lib/cron/cron.allowСписок пользователей, которым разрешено выполнять команду crontab./usr/lib/cron/cron.denyСписок пользователей, которым запрещено выполнять команду crontab.
Для того, чтобы BIND работал в качестве кэширующего сервера, необходимо иметь конфигурационные файлы заполненные необходимой информацией:


  '''hwclock''' - посмотреть время в БИОС
  named.conf;
'''/etc/adjtime''' - показывает отклонение часов и какое время они показывают, локальное или UTC
описание серверов корневой зоны (зона типа hint);
  '''/etc/timezone файл''' - используется для установки переменной окружения
описание зоны 127.in-addr.arpa.
  '''etc/sysconfig/clock''' -  
dns:~# cat /etc/bind/named.conf
'''sudo dpkg-reconfigure tzdata''' - установка часового пояса
acl "lan" {
'''date 110114312011.00''' - 11-месяц-01-день14-час31-минуты-2011-год.00-секунды  - системное время
            192.168.1.1/24;
'''sudo hwclock -w''' - записать системное время в БИОС
            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 01:28 0.in-addr.arpa
-rw-r--r-- 1 root root  271 Май 28 01:28 127.in-addr.arpa
-rw-r--r-- 1 root root  237 Май 28 01:28 255.in-addr.arpa
-rw-r--r-- 1 root root 2994 Май 28 01:28 db.root
-rw-r--r-- 1 root root  270 Май 28 01: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 можно почитать в man (5) named.conf.
 
Отдельно хочется описать параметр  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)
Получение зоны прошло успешно. Далее, для настройки подчиненного сервера, алгоритм следующий:
 
Скопировать конфигурационный файл named.conf с master сервера;
Заменить параметр type master на type slave в тех зонах, для которых он будет вторичным;
Параметр  allow-transfer { 10.0.0.191; }; заменить на masters { 10.0.0.152;}; в тех зонах, для которых он будет вторичным;
Удалить зоны, которые не будет обслуживать текущий сервер, в том числе и корневую, если slave не будет отвечать на рекурсивные запросы;
Создать каталоги для логов, как в предыдущем примере.
Итого, мы получаем конфиг 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:662704]
: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 built-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: D.F.IP6.ARPA
Jul  5 18:15:05 dns-server named[4298]: automatic empty zone: 8.E.F.IP6.ARPA
Jul  5 18:15:05 dns-server named[4298]: automatic empty zone: 9.E.F.IP6.ARPA
Jul  5 18:15:05 dns-server named[4298]: automatic empty zone: A.E.F.IP6.ARPA
Jul  5 18:15:05 dns-server named[4298]: automatic empty zone: B.E.F.IP6.ARPA
Jul  5 18:15:05 dns-server named[4298]: automatic empty zone: 8.B.D.0.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.
 
* [http://www.k-max.name/linux/howto-dns-server-bind/ HOWTO DNS сервер BIND (практика)]

Версия от 16:26, 16 октября 2016

Исходные данные

Для корректной работы 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 01:28 0.in-addr.arpa -rw-r--r-- 1 root root 271 Май 28 01:28 127.in-addr.arpa -rw-r--r-- 1 root root 237 Май 28 01:28 255.in-addr.arpa -rw-r--r-- 1 root root 2994 Май 28 01:28 db.root -rw-r--r-- 1 root root 270 Май 28 01: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";
  1. 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 можно почитать в man (5) named.conf.

Отдельно хочется описать параметр 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)

Получение зоны прошло успешно. Далее, для настройки подчиненного сервера, алгоритм следующий:

Скопировать конфигурационный файл named.conf с master сервера; Заменить параметр type master на type slave в тех зонах, для которых он будет вторичным; Параметр allow-transfer { 10.0.0.191; }; заменить на masters { 10.0.0.152;}; в тех зонах, для которых он будет вторичным; Удалить зоны, которые не будет обслуживать текущий сервер, в том числе и корневую, если slave не будет отвечать на рекурсивные запросы; Создать каталоги для логов, как в предыдущем примере. Итого, мы получаем конфиг 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

  1. типовые правила iptables для DNS
  • filter
INPUT DROP [7511:662704]
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

  1. разрешить доступ локальной сети к 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

  1. разрешить доступ 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 built-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: D.F.IP6.ARPA Jul 5 18:15:05 dns-server named[4298]: automatic empty zone: 8.E.F.IP6.ARPA Jul 5 18:15:05 dns-server named[4298]: automatic empty zone: 9.E.F.IP6.ARPA Jul 5 18:15:05 dns-server named[4298]: automatic empty zone: A.E.F.IP6.ARPA Jul 5 18:15:05 dns-server named[4298]: automatic empty zone: B.E.F.IP6.ARPA Jul 5 18:15:05 dns-server named[4298]: automatic empty zone: 8.B.D.0.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.