Сохранение dns зон BIND в дирректориях openLDAP.

Автор: Andrey Afletdinov
Оригинал: http://www.sgb.irk.ru/~andrek/bind2ldap/

Этот документ - попытка описать КАК под Linux можно упростить администрирование DNS зон сохраняя их в дирректориях openLDAP. Здесь Вы не найдете описания работы BIND, LDAP и как компилируются эти программы.

Часть 1.
Первое что необходимо - это переделать BIND чтобы он понимал LDAP дирректории, для этого необходимо скачать архив bind-sdb-ldap-0.9. К моменту написания документа последние версии программ которые я использовал это BIND-9.2.1 и bind-sdb-ldap-0.9, и я надеюсь разработчики BIND обратят внимание на такую возможность и включат ее в свой пакет в дальнейшем.
Распаковываем архивы.
Все ниже приведенные действия описаны в файле bin-sdb-ldap/INSTALL.

Копируем файлы ldapdb.c в дирректории bin/named и ldapdb.h в bin/named/include исходников BIND.
Редактируем файл bin/named/Makefile.in добавляем строки:

DBDRIVER_OBJS = ldapdb.@O@ DBDRIVER_SRCS = ldapdb.c DBDRIVER_INCLUDES = -I/usr/local/include DBDRIVER_LIBS = -L/usr/local/lib -lldap -llber -lresolv Редактируем файл bin/named/main.c:
- находим строку #include "xxdb.h" добавляем #include<ldapdb.h>
- находим строку xxdb_init() добавляем ldapdb_init();
- находим строку xxdb_clear() добавляем ldapdb_clear();

Все. Дальше конфигурируем и компилируем BIND так как нам это надо. Так же если выше приведенные действия Вам кажутся сложными, то уже готовый патч для версии BIND-9.2.1 лежит здесь.

Часть 2.
Следующий этап - настройка файла named.conf и заполнение дирректорий LDAP.
Для понимания LDAP сервером необходимых значений dns зон - копируем схему dnszone.schema в дирректорию схем LDAP сервера.

Разберем на примере небольшую зону (sgb мой внутренний домен):
@ IN SOA book.sgb. root.book.sgb. ( 1 8H 2H 1W 1D) NS book.sgb. localhost A 127.0.0.1 book A 192.168.2.1 boss A 192.168.2.11 Создаем группу DNS в дирректории LDAP (dc=sgb это root_ldap дирректория и это никак не связано с доменом sgb, просто совпадения :)

dn: ou=DNS,dc=sgb objectClass: top objectClass: organizationalUnit ou: DNS dns
Описание самой зоны sgb:
dn: zoneName=sgb,ou=DNS,dc=sgb objectClass: top objectClass: dNSZone zoneName: sgb relativeDomainName: sgb dns
dn: relativeDomainName=@,zoneName=sgb,ou=DNS,dc=sgb objectClass: top objectClass: dNSZone zoneName: sgb relativeDomainName: @ nSRecord: book.sgb. sOARecord: book.sgb. root.book.sgb. 1 8H 2H 1W 1D dns
Описание записи A для localhost:
dn: relativeDomainName=localhost,zoneName=sgb, ou=DNS,dc=sgb objectClass: top objectClass: dNSZone zoneName: sgb relativeDomainName: localhost dNSClass: IN aRecord: 127.0.0.1 dns
Описание записи A для book и boss аналогична:
dn: relativeDomainName=book,zoneName=sgb, ou=DNS,dc=sgb objectClass: top objectClass: dNSZone zoneName: sgb relativeDomainName: book dNSClass: IN aRecord: 192.168.2.1 dns
dn: relativeDomainName=boss,zoneName=sgb, ou=DNS,dc=sgb objectClass: top objectClass: dNSZone zoneName: sgb relativeDomainName: boss dNSClass: IN aRecord: 192.168.2.11 dns
Записываем в ldif файл и добавляем в директорию командой ldapadd. Так же для управления директориями можно установить программу с графическим интерфейсом.

Разберем обратную зону 2.168.192.in-addr.arpa: @ IN SOA book.sgb. root.book.sgb. ( 1 8H 2H 1W 1D) NS book.sgb. 1 PTR book.sgb. 11 PTR boss.sgb. Описание зоны 2.168.192.in-addr.arpa:

dn: zoneName=2.168.192.in-addr.arpa,ou=DNS,dc=sgb objectClass: top objectClass: dNSZone zoneName: 2.168.192.in-addr.arpa relativeDomainName: 2.168.192.in-addr.arpa dns
dn: relativeDomainName=@,zoneName=2.168.192.in-addr. arpa,ou=DNS,dc=sgb objectClass: top objectClass: dNSZone zoneName: 2.168.192.in-addr.arpa relativeDomainName: @ nSRecord: book.sgb. sOARecord: book.sgb. root.book.sgb. 1 8H 2H 1W 1D dns
Описание записи PTR для book и boss:
dn: relativeDomainName=1,zoneName=2.168.192.in-addr. arpa,ou=DNS,dc=sgb objectClass: top objectClass: dNSZone zoneName: 2.168.192.in-addr.arpa relativeDomainName: 1 pTRRecord: book.sgb. dns
dn: relativeDomainName=11,zoneName=2.168.192.in-addr. arpa,ou=DNS,dc=sgb objectClass: top objectClass: dNSZone zoneName: 2.168.192.in-addr.arpa relativeDomainName: 11 pTRRecord: boss.sgb. dns
Все просто. Полный HOWTO по заполнению dns зон в LDAP с примерами здесь.

Осталось заменить запись зон в named.conf.
Если раньше было так: zone "sgb" in { type master; files "db.sgb"; }; zone "2.168.192.in-addr.arpa" in { type master; files "db.2.168.192"; }; Заменяем: zone "sgb" in { type master; database "ldap ldap://127.0.0.1/zoneName=sgb,ou=DNS,dc=sgb 178600"; }; zone "2.168.192.in-addr.arpa" in { type master; database "ldap ldap://127.0.0.1/zoneName=2.168.192.in-addr.arpa,ou=DNS,dc=sgb 178600"; }; Число 178600 это TTL для всех записей где неопределен dNSTTL.

Заключение.
Большинство из источников этого документа было придумано другими людьми, однако почти все примеры взяты из моей головы и протестированы на моем ноутбуке с дистрибутивом RedHat-7.2 и openldap-2.0.11. Если кому нибудь придет в голову написать более обширный документ по централизованному администрированию сетей на базе дирректорий LDAP и воспользоваться данным источником, то я невозражаю, с условием сохранения ниже перечисленных ссылок на исходную документацию.

Ссылки на использованную документацию и программы.