Тема: Установка и настройка DNS Bind

Здравствуйте уважаемые дамы и господа.
Есть установленный сервер Linux slackware  и DNS Server Bind 9-ой версии.
Предомною стоит задача заставить BIND работать с базой MySQL а не текстовыми файлами. По стандартной установке Bind держит информацию о зонах в обычных текстовых файлах.

В интернете куча информации о всяких модулях к DNS Серверу Bind для работы с базой MySQL.
Но мне не удалось найти исчерпывающего мануала для полных чайников.
В последней версии Bind (в 10-ой) разработчики добавили поддержку базы SQLite но это исключительно для тестовых целей и не отвечает моим требованиям. Мне нужна система для боевого сервера а не тестового. Хвала Всевышнему что в следующих версиях Bind'а разработчики собираются уже вшить функции для работы с базой МусКул или PostgreSQL. Но а пока чайники подобно меня мучаются и ждут момента истины. Но у меня нет времени ждать следующей версии.
Пожалуйста помогите чем сможете. Как мне установить Bind 9 ой или 10 ой версии с поддержкой MySQL вместо текстовых файлов ?
Хотябы пните в правильном направлении.


    ОС (Linux slackware 11.0.0) (Хотя версия и дистрибутив Линукса не важно если есть хороший мануал для другого дистрибутива Линукса с радостью переставлю Линукс)
    DNS (bind 9)
    Apache (Apache/ 1.3.37 (Unix))
    MySQL (verson 4.0.24)
    PHP (php 5.2.5)
    СУБД (PHPMyadmin 2.7.0)

2

Re: Установка и настройка DNS Bind

писал когда-то для убунтологии про бинд, не дописал из за отсутствия беллетристического таланта.
лежит она в админском разделе, ссылку дать не могу. напишу сюда часть про интеграцию с БД.
подойдёт под любой deb дистрибутив, возможно уже с небольшими изменениями.
UPD.
нужно было запилить патч, но я этого не сделал из лени. теперь вообще никогда не сделаю. и да, там не статью забили и дальше не пишут, а жаль, у многих бы пропали вопросы что такое ptr.


Интеграция BIND с MySQL
Для чтение этого материала вы должны иметь опыт работы с СУБД MySQL, понимание работы служб DNS на уровне системного администратора, понимать принципы конфигурации BIND сервера
В BIND 9 существует две реализации драйверов для хранения зон во внешних СУБД – DLZ и SDB
Здесь будет рассмотрена возможность работы BIND через SDB драйвера посредством mysql-bind

Все команды будут производится от привилегированного пользователя.
Установим mysql-server если его еще нет и пакеты необходимые для компиляции.

Консоль
root@virtual:~# aptitude install mysql-server
root@virtual:~# aptitude install dpkg-dev libldap2-dev libxml2-dev libcap2-dev hardening-wrapper libgeoip-dev libkrb5-dev libssl-dev libtool bison libdb-dev fakeroot debhelper libmysqlclient15-dev

установим исходные коды bind9 и mysql-bind

Консоль
root@virtual:~# cd /usr/src/
root@virtual:/usr/src# apt-get source bind9
root@virtual:/usr/src# wget http://downloads.sourceforge.net/projec … rror=ignum
root@virtual:/usr/src# tar zxvf mysql-bind.tar.gz
root@virtual:/usr/src# cd mysql-bind

разложим нужные нам фалы в каталог bind, у каждой версии имя каталога может отличатся.

Консоль
root@virtual:/usr/src/mysql-bind# cp mysqldb.c ../bind9-9.6.1.dfsg.P3/bin/named/
root@virtual:/usr/src/mysql-bind# cp mysqldb.h ../bind9-9.6.1.dfsg.P3/bin/named/
root@virtual:/usr/src/mysql-bind# cp mysqldb.c ../bind9-9.6.1.dfsg.P3/bin/named/include/
root@virtual:/usr/src/mysql-bind# cp mysqldb.h ../bind9-9.6.1.dfsg.P3/bin/named/include/

теперь нам придется отредактировать исходные файлы bind, иначе при компиляции mysql-bind будет проигнорирован.

Консоль
root@virtual:/usr/src# nano /usr/src/bind9-9.6.1.dfsg.P3/bin/named/Makefile.in

находим

#
# Add database drivers here.
#
DBDRIVER_OBJS =
DBDRIVER_SRCS =
DBDRIVER_INCLUDES =
DBDRIVER_LIBS =

и приводим в вид

#
# Add database drivers here.
#
DBDRIVER_OBJS = mysqldb.@O@
DBDRIVER_SRCS = mysqldb.c
DBDRIVER_INCLUDES =
DBDRIVER_LIBS =

Не заполненные поля зависят от типа сборки MySQL и операционной системы, по этому нам самим нужно узнать эти данные у СУБД.
Найдем значение DBDRIVER_INCLUDES:

mysql_config --cflags

я получил строку

-I/usr/include/mysql  -DBIG_JOINS=1    -DUNIV_LINUX -DUNIV_LINUX

Найдем значение DBDRIVER_LIBS:

mysql_config --libs

в моём случае это

-rdynamic -L/usr/lib/mysql -lmysqlclient

и так, получается что в моём файле /usr/src/bind9-9.6.1.dfsg.P3/bin/named/Makefile.in
эти строки должны выглядеть так:

#
# Add database drivers here.
#
DBDRIVER_OBJS = mysqldb.@O@
DBDRIVER_SRCS = mysqldb.c
DBDRIVER_INCLUDES = -I/usr/include/mysql -DBIG_JOINS=1 -DUNIV_LINUX -DUNIV_LINUX
DBDRIVER_LIBS = -rdynamic -L/usr/lib/mysql -lmysqlclient

теперь открываем файл /usr/src/bind9-9.6.1.dfsg.P3/bin/named/main.c
ищем там строки:

/*
* Defining NS_MAIN provides storage declarations (rather than extern)
* for variables in named/globals.h.
*/

и добавляем #include "include/mysqldb.h"

#include "include/mysqldb.h"
/*
* Defining NS_MAIN provides storage declarations (rather than extern)
* for variables in named/globals.h.
*/

в этом же файле

/*
* Add calls to register sdb drivers here.
*/
/* xxdb_init(); */

и приведем к такому виду

/*
* Add calls to register sdb drivers here.
*/
/* xxdb_init(); */
        mysqldb_init();

и еще немного поиска =))

isc_log_write(ns_g_lctx, NS_LOGCATEGORY_GENERAL, NS_LOGMODULE_MAIN,
                      ISC_LOG_NOTICE, "exiting");

приводим к виду

mysqldb_clear();
        isc_log_write(ns_g_lctx, NS_LOGCATEGORY_GENERAL, NS_LOGMODULE_MAIN,
                      ISC_LOG_NOTICE, "exiting");

Отлично, теперь самый интересный файл: /usr/src/bind9-9.6.1.dfsg.P3/bin/named/mysqldb.c
находим

#include <named/mysqldb.h>

заменяем на

#include "include/mysqldb.h"

Тем самым, только что, мы пропатчили официальный bind =))
Компилируем и собираем

Консоль
root@virtual:/usr/src# cd /usr/src/bind9-9.6.1.dfsg.P3/ && dpkg-buildpackage -rfakeroot -b

В результате в каталоге /usr/src/ должны появится *.deb пакеты собранных программ.
Устанавливаем: (внимание, пакет lwresd устанавливать не нужно ни в коем случае!)

Это чрезвычайно урезанный, только кэширующий сервер имён, который
отвечает на запросы с помощью облегчённого протокола определения имён
BIND 9, а не протокола DNS.

Консоль
root@virtual:/usr/src/bind9-9.6.1.dfsg.P3# cd ../
root@virtual:/usr/src# dpkg -i bind9_9.6.1.dfsg.P3-1_i386.deb bind9-doc_9.6.1.dfsg.P3-1_all.deb bind9-host_9.6.1.dfsg.P3-1_i386.deb dnsutils_9.6.1.dfsg.P3-1_i386.deb bind9utils_9.6.1.dfsg.P3-1_i386.deb libbind9-50_9.6.1.dfsg.P3-1_i386.deb libdns53_9.6.1.dfsg.P3-1_i386.deb libbind-dev_9.6.1.dfsg.P3-1_i386.deb libisc50_9.6.1.dfsg.P3-1_i386.deb libisccc50_9.6.1.dfsg.P3-1_i386.deb libisccfg50_9.6.1.dfsg.P3-1_i386.deb liblwres50_9.6.1.dfsg.P3-1_i386.deb

Проверяем работу bind

Консоль
root@virtual:/usr/src# dig @127.0.0.1 localhost
------------
; <<>> DiG 9.6.1-P3 <<>> @127.0.0.1 localhost
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 37920
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 1

;; QUESTION SECTION:
;localhost.         IN   A

;; ANSWER SECTION:
localhost.      604800   IN   A   127.0.0.1

;; AUTHORITY SECTION:
localhost.      604800   IN   NS   localhost.

;; ADDITIONAL SECTION:
localhost.      604800   IN   AAAA   ::1

;; Query time: 59 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Fri Feb 26 03:23:44 2010
;; MSG SIZE  rcvd: 85

Теперь пора создать базу named для хранения там наших зон

Консоль
root@virtual:/usr/src# mysqladmin create named -u root -p
Enter password:
root@virtual:/usr/src#

создадим пользователя bind с паролем для примера passwd

Консоль
root@virtual:/usr/src# mysql -u root -p
mysql> GRANT ALL ON named.* TO 'bind'@'localhost' IDENTIFIED BY 'passwd' WITH GRANT OPTION;
mysql> exit;

логинимся новым пользователем и выполним тестовые примеры описанные в файле /usr/src/bind9-9.6.1.dfsg.P3/bin/named/mysqldb.c

Консоль
mysql -u named –p
mysql> connect named

Консоль
mysql> CREATE TABLE mydomain (
name varchar(255) default NULL,
ttl int(11) default NULL,
rdtype varchar(255) default NULL,
rdata varchar(255) default NULL
) TYPE=MyISAM;

Консоль
mysql> INSERT INTO mydomain VALUES ('mydomain.com', 259200, 'SOA', 'mydomain.com. www.mydomain.com. 200309181 28800 7200 86400 28800');
mysql> INSERT INTO mydomain VALUES ('mydomain.com', 259200, 'NS', 'ns0.mydomain.com.');
mysql> INSERT INTO mydomain VALUES ('mydomain.com', 259200, 'NS', 'ns1.mydomain.com.');
mysql> INSERT INTO mydomain VALUES ('mydomain.com', 259200, 'MX', '10 mail.mydomain.com.');
mysql> INSERT INTO mydomain VALUES ('w0.mydomain.com', 259200, 'A', '192.168.1.1');
mysql> INSERT INTO mydomain VALUES ('w1.mydomain.com', 259200, 'A', '192.168.1.2');
mysql> INSERT INTO mydomain VALUES ('mydomain.com', 259200, 'Cname', 'w0.mydomain.com.');
mysql> INSERT INTO mydomain VALUES ('mail.mydomain.com', 259200, 'Cname', 'w0.mydomain.com.');
mysql> INSERT INTO mydomain VALUES ('ns0.mydomain.com', 259200, 'Cname', 'w0.mydomain.com.');
mysql> INSERT INTO mydomain VALUES ('ns1.mydomain.com', 259200, 'Cname', 'w1.mydomain.com.');
mysql> INSERT INTO mydomain VALUES ('www.mydomain.com', 259200, 'Cname', 'w0.mydomain.com.');
mysql> INSERT INTO mydomain VALUES ('ftp.mydomain.com', 259200, 'Cname', 'w0.mydomain.com.');
mysql> exit;
Bye

создадим тестовую зону mydomain.com в файле /etc/bind/named.conf.default-zones

zone "mydomain.com" {
type master;
notify no;
database "mysqldb named mydomain 127.0.0.1 bind passwd";
};

перегружаем сервер bind

Консоль
rndc reload

проверяем работу с базой

Консоль
root@virtual:/etc/bind# dig @127.0.0.1 mydomain.com

; <<>> DiG 9.6.1-P3 <<>> @127.0.0.1 mydomain.com
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 61025
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 2, ADDITIONAL: 0

;; QUESTION SECTION:
;mydomain.com.         IN   A

;; ANSWER SECTION:
mydomain.com.      259200   IN   CNAME   w0.mydomain.com.
w0.mydomain.com.   259200   IN   A   192.168.1.1

;; AUTHORITY SECTION:
mydomain.com.      259200   IN   NS   ns0.mydomain.com.
mydomain.com.      259200   IN   NS   ns1.mydomain.com.

;; Query time: 76 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Fri Feb 26 05:04:50 2010
;; MSG SIZE  rcvd: 99

3

Re: Установка и настройка DNS Bind

Такую "химиотерапию" я и раньше делал. Но тут как видите для каждой зоны одна таблица в МусКуле создается и еще нужно в файл /etc/bind/named.conf.default-zones добавить инфо о том что данные находятся в базе. И ко всему этому нужно еще и саму Байнд перегрузить. Какой то "садамазахизм" по моему ИМХО. Прощу прощения.
Ниужели нет прощей пути ?
Как например работают сайты которые регистрируют домены в реальном времени, так же как вы наверху описали ?  (То есть добавляют по одной таблице для каждой зоны + прописывают в файл /etc/bind/named.conf.default-zones название таблицы и перегружают байнд. )

Просто трудно поверить что в 21 веке мы все еще должны проделывать такой длинный путь для осуществления казалось бы простенькой задачи.
Не пинайте сильно я в Линуксе понимаю ровно столько же сколько и вы в балете... ag

4

Re: Установка и настройка DNS Bind

можно использовать DLZ. но там такой синтаксис, что без тяжелых наркотиков я бы не стал.

swordholder пишет

Просто трудно поверить что в 21 веке мы все еще должны проделывать такой длинный путь для осуществления казалось бы простенькой задачи.

я бы не сказал что такие действия простенькие и малозначительные.

swordholder пишет

И ко всему этому нужно еще и саму Байнд перегрузить.

а он на лету не умеет пока что.

5 (18.02.2015 19:22:07 отредактировано zhaktaev91)

Re: Установка и настройка DNS Bind

Консоль
Компилируем и собираем
Консоль
root@virtual:/usr/src# cd /usr/src/bind9-9.6.1.dfsg.P3/ && dpkg-buildpackage -rfakeroot -b

почему то когда я это пропысываю, только вот со своими путями, выходит что такая команда не существует.
в чем тут ошибка? где проблема?

6

Re: Установка и настройка DNS Bind

zhaktaev91,
ошибка в том, что инструкция для Ubuntu, вероятно также подойдет для Debian.

7

Re: Установка и настройка DNS Bind

а где найти инструкцию для clearOS? все обыскал или не рабочие или же каких то скриптов не хватает, помогите плиз найти...

8

Re: Установка и настройка DNS Bind

Ремарка: если эти пляски с бубном ради обновления зон "на лету", то не стоит, достаточно послать SIGHUP процессу named, либо использовать rndc.

Если проблема в количестве обслуживаемых зон, можно глянуть в сторону nsd.