#1 28.10.2010 19:14:09

swordholder
Administrator
Зарегистрирован: 27.10.2010
Сообщений: 12
IP-адрес

Установка и настройка 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 30.10.2010 23:37:12

system-root
Administrator
Зарегистрирован: 22.02.2010
Сообщений: 3 590
IP-адрес

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

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


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

Все команды будут производится от привилегированного пользователя.
Установим mysql-server если его еще нет и пакеты необходимые для компиляции.
[console]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[/console]

установим исходные коды bind9 и mysql-bind
[console]root@virtual:~# cd /usr/src/
root@virtual:/usr/src# apt-get source bind9
root@virtual:/usr/src# wget http://downloads.sourceforge.net/project/mysql-bind/mysql-bind/mysql-bind-0.2%20src/mysql-bind.tar.gz?use_mirror=ignum
root@virtual:/usr/src# tar zxvf mysql-bind.tar.gz
root@virtual:/usr/src# cd mysql-bind[/console]

разложим нужные нам фалы в каталог bind, у каждой версии имя каталога может отличатся.
[console]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/[/console]

теперь нам придется отредактировать исходные файлы bind, иначе при компиляции mysql-bind будет проигнорирован.
[console]root@virtual:/usr/src# nano /usr/src/bind9-9.6.1.dfsg.P3/bin/named/Makefile.in[/console]

находим
#
# 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

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

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

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

и так, получается что в моём файле /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 =))
Компилируем и собираем
[console]root@virtual:/usr/src# cd /usr/src/bind9-9.6.1.dfsg.P3/ && dpkg-buildpackage -rfakeroot -b[/console]

В результате в каталоге /usr/src/ должны появится *.deb пакеты собранных программ.
Устанавливаем: (внимание, пакет lwresd устанавливать не нужно ни в коем случае!)
Это чрезвычайно урезанный, только кэширующий сервер имён, который
отвечает на запросы с помощью облегчённого протокола определения имён
BIND 9, а не протокола DNS.

[console]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[/console]

Проверяем работу bind
[console]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[/console]

Теперь пора создать базу named для хранения там наших зон
[console]root@virtual:/usr/src# mysqladmin create named -u root -p
Enter password:
root@virtual:/usr/src#[/console]

создадим пользователя bind с паролем для примера passwd
[console]root@virtual:/usr/src# mysql -u root -p
mysql> GRANT ALL ON named.* TO 'bind'@'localhost' IDENTIFIED BY 'passwd' WITH GRANT OPTION;
mysql> exit;[/console]

логинимся новым пользователем и выполним тестовые примеры описанные в файле /usr/src/bind9-9.6.1.dfsg.P3/bin/named/mysqldb.c
[console]mysql -u named –p
mysql> connect named[/console]

[console]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;[/console]

[console]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[/console]

создадим тестовую зону 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
[console]rndc reload[/console]

проверяем работу с базой
[console]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[/console]

#3 31.10.2010 11:30:09

swordholder
Administrator
Зарегистрирован: 27.10.2010
Сообщений: 12
IP-адрес

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

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

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

#4 31.10.2010 16:41:04

system-root
Administrator
Зарегистрирован: 22.02.2010
Сообщений: 3 590
IP-адрес

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

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

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

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

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

#5 18.02.2015 16:21:43

zhaktaev91
Administrator
Зарегистрирован: 18.02.2015
Сообщений: 2
IP-адрес

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

[console]Компилируем и собираем
Консоль
root@virtual:/usr/src# cd /usr/src/bind9-9.6.1.dfsg.P3/ && dpkg-buildpackage -rfakeroot -b[/console]
почему то когда я это пропысываю, только вот со своими путями, выходит что такая команда не существует.
в чем тут ошибка? где проблема?

#6 18.02.2015 19:20:53

bormant
Administrator
Зарегистрирован: 22.02.2010
Сообщений: 2 265
IP-адрес

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

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

#7 19.02.2015 02:10:58

zhaktaev91
Administrator
Зарегистрирован: 18.02.2015
Сообщений: 2
IP-адрес

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

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

#8 19.02.2015 05:45:04

bormant
Administrator
Зарегистрирован: 22.02.2010
Сообщений: 2 265
IP-адрес

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

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

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

Board footer