12 November 2013

Автоматический вторичный DNS давно уже не проблема

DNS
Sandbox
Посмотрев недавно статью, был сильно удивлен, что кто-то еще задается вопросом автоматического прописывания ДНС доменов на вторичном сервере. Хочу поделится своим вариантом «Automate slave DNS support», которым пользуюсь уже много лет. Возможно он подойдет не всем, но он довольно прост.

В качестве вторичного использую PowerDNS, мастером использую Bind, хотя подойдет любой другой сервер умеющий DNS NOTIFY при изменении/создании зоны (присматриваюсь к YADIFA, но руки пока не дошли). Именно эту фичу мы и будем использовать чтобы создавать и изменять зоны на вторичном сервере, минус будет только в том при удалении зоны на слейве, ее нужно удалить вручную. В логах удаленные зоны хорошо видны и при необходимости можно навоять скриптик для автоматизации процесса, у меня зоны удаляются довольно редко, поэтому такой необходимости не было.

Наверное если Вы заинтересовались этой статьей, то имеете представление о том, как настроить мастер или при желании самостоятельно найдете материал по настройке. В случаи Bind хочу обратить внимание, что в конфиге обязательная должна быть прописана опция:

notify yes


Итак у нас есть два хоста 10.0.0.1 (ns.server.net) и 10.0.0.2 (ns0.server.net), где ns.server.net основной, а ns0.server.net вторичный.

Опишем их в файле домена server.net:

@       IN      NS      ns.server.net.
@       IN      NS      ns0.server.net.
ns      IN      A       10.0.0.1
ns0     IN      A       10.0.0.2


Приступим к установке и настройки Pdns. На серверах у меня Debian:

apt-get install pdns-backend-sqlite3


Такой вариант автоматом подтянет pdns-server, sqlite3, а так же все что необходимо для запуска PowerDNS сервер с Sqlite v3, который используется хранения днс записей. Sqlite3 выбран так как не требует для себя много внимания, но ничто не мешает Вам выбрать другой вариант.

[skip]
creating database pdns.sqlite3: success.
verifying database pdns.sqlite3 exists: success.
populating database via sql...  done.
Processing triggers for pdns-server ...
[ ok ] Restarting PowerDNS Authoritative Name Server: pdns.


Итак у нас есть установленный PowerDNS сервер с базой Sqlite3 в дистрибутивах отличных от Debian возможно придется вручную настроить базу. К сожалению в пакете ошибка и чтобы сервер увидел базу нужно закомментировать одну строчку.
В файле /etc/powerdns/pdns.d/pdns.simplebind нужно удалить или закомментировать строчку bind-config=/etc/powerdns/bindbackend.conf

Так же в конфиге нужно объявить сервер как вторичный:
/etc/powerdns/pdns.conf
slave=yes


Теперь нам можно прописать Master DNS в Sqlite базу:

cd /var/lib/powerdns
sqlite3 pdns.sqlite3
sqlite> INSERT INTO supermasters VALUES('10.0.0.1','ns.server.net','master');
.quit


На этом настройка завершена, но это еще не все, теперь надо загрузить в sqlite базу, есть два способа это сделать.

Самый простой на мой взгляд это обновление Serial на мастере, чтобы он отправил слейву DNS NOTIFY и тем самым оповестил его о наших доменах, заставив его завести и забрать их.

На местере это выглядит так:

master named[12318]: reloading configuration succeeded
master named[12318]: reloading zones succeeded
master named[12318]: zone server.net/IN: loaded serial 1
master named[12318]: zone server.net/IN: sending notifies (serial 1)
master named[12318]: client 10.0.0.2#14310: transfer of 'server.net/IN': AXFR started
master named[12318]: client 10.0.0.2#14310: transfer of 'server.net/IN': AXFR ended


На вторичном:

slave pdns[21225]: Received NOTIFY for server.net from 10.0.0.1 for which we are not authoritative
slave pdns[21225]: Created new slave zone 'server.net' from supermaster 10.0.0.1, queued axfr
slave pdns[21225]: Initiating transfer of 'server.net' from remote '10.0.0.1'
slave pdns[21225]: gsqlite3: connection to '/var/lib/powerdns/pdns.sqlite3' successful
slave pdns[21225]: 1 slave domain needs checking, 0 queued for AXFR


Альтернативой могу предложить завести домены напрямую в sqlite:

INSERT INTO "domains" VALUES(1,'domain.ru','10.0.0.1',0,'SLAVE',NULL,'master');
INSERT INTO "domains" VALUES(2,'domain.su','10.0.0.1',0,'SLAVE',NULL,'master');
INSERT INTO "domains" VALUES(3,'domain.com','10.0.0.1',0,'SLAVE',NULL,'master');


Где 0 это сериал зоны, на мастере он явно будет больше и поэтому произойдет обновление.

slave pdns[21225]: Received serial number updates for 1 zones, had 0 timeouts
slave pdns[21225]: Domain server.net is stale, master serial 3, our serial 0
slave pdns[21225]: Initiating transfer of 'server.net' from remote '10.0.0.1'
slave pdns[21225]: AXFR started for 'server.net', transaction started


Надеюсь теперь вопрос автоматического создания доменов на вторичном сервере больше не будет Вас беспокоить.
Tags:dnspdnsdns slavenamedbindднссервер имен
Hubs: DNS
+18
25.1k 132
Comments 5
Popular right now
SEO-специалист
December 7, 202064,900 ₽Нетология
Профессия iOS-разработчик
December 7, 202090,000 ₽SkillFactory
iOS-разработчик с нуля
December 7, 202070,740 ₽Нетология
Курс по аналитике данных
December 7, 202064,200 ₽SkillFactory