Краткая памятка для настройки superslave в pdns

Краткая памятка для настройки superslave в powerdns.

Указываем следующие опции в файле /etc/powerdns/pdns.conf:
superslave=yes
launch=gmysql
gmysql-host=localhost
gmysql-user=pdns
gmysql-dbname=pdns
gmysql-password=123456


Создаём базу данных, пользователя и даём ему права на эту БД:
create database pdns DEFAULT CHARACTER SET = utf8 DEFAULT COLLATE = utf8_unicode_ci;
create user pdns@localhost IDENTIFIED BY '123456';
grant all on pdns.* to pdns@localhost;
flush privileges;


Создаём таблицы в БД из файла, который должен был быть установлен в комплекте с pdns:
mysql -u pdns -p pdns < /usr/share/pdns-backend-mysql/schema/schema.mysql.sql


Добавить первичные ДНС-серверы для ваших доменов в таблицу supermasters (один раз, а не для каждого домена):
INSERT INTO `supermasters` VALUES ('10.1.1.1','ns1.domain.tld','internal');
INSERT INTO `supermasters` VALUES ('10.1.1.2','ns2.domain.tld','internal');


На этих серверах должен быть разрешён трансфер доменов для вашего superslave-сервера. Проверить можно как-то так:
dig -t axfr @ns1.domain.tld domain2.tld


Superslave-сервер откачает домен после получения notify — уведомления про изменения в домене, так что первичный сервер должен отправлять эти самые уведомления. Обычно, это надо настроить явным образом, т.к. по-умолчанию ДНС-сервер отправляет уведомления только серверам, указанным как авторитетные серверы для этого домена. В bind указать кому ещё отправлять уведомления можно при помощи опции also-notify.
На сервере с bind можно вручную, не производя изменения в домене, отправить уведомления командой rndc:
rndc notify domain2.tld


Если доменов много, то можно отправить уведомления однострочным скриптом типа такого:
grep "^zone " bind-zones-file.conf | sed -e's/zone "//' -e's/" {//' | while read i;do echo $i;rndc notify $i;sleep 2;done


Это работает если домены в файле bind-zones-file.conf описаны как-то вот так:
zone "domain2.tld" {
...
};


К сожалению, логи pdns указывают на причину проблемы не прямо, а какими-то намёками. Например, вот это, если не ошибаюсь, говорит о том, что нет прав на трансфер домена с мастера:
pdns_server[282496]: Error resolving SOA or NS for domain2.tld at: 10.1.1.1: Query to '10.1.1.1' for SOA of 'domain2.tld' produced a NS record


А вот это говорит о том, что нет подходящего мастера в таблице supermasters:
pdns_server[284836]: Unable to find backend willing to host domain2.tld for potential supermaster 10.1.1.1. Remote nameservers:
pdns_server[284836]: ns1.domain.tld
pdns_server[284836]: ns2.domain.tld