Есть ли способ автоматически синхронизировать все зоны между серверами BIND (9), чтобы мне не приходилось добавлять зоны к подчиненному, когда я добавляю их к главному?
Посмотрите на BIND 9.7.2-P2, в котором есть операторы «rndc addzone» и «rndc delzone», которые позволяют «удаленно» добавлять и удалять зоны с работающего сервера.
У меня есть статья, в которой приводятся некоторые примеры, которые я приводил на NANOG в прошлом месяце.
ftp://ftp.isc.org/isc/pubs/pres/NANOG/50/DNSSEC-NANOG50.pdf
Хотя это не приведет к возврату и устранению любого беспорядка, который у вас есть в настоящее время, это действительно упрощает синхронизацию машин, которыми вы можете управлять с помощью «rndc» в будущем.
[да, отвечаю на довольно старый пост, но BIND 9.7.2-P2 достаточно крут, чтобы это оправдать]
Добавляя еще одно обновление (спустя годы, но надеясь, что оно поможет людям, которые сталкиваются с этим в результатах поиска), я хотел бы порекомендовать использовать зоны каталога.
Зоны каталога, представленные в BIND 9.11 (2018), позволяют автоматически инициализировать зоны (добавление и удаление) через специальную зону, которая является общей для первичного и вторичного серверов.
Для получения полной информации см .: https://kb.isc.org/docs/aa-01401
Я не знаю, как сделать это изначально для bind9, если вы используете бэкэнд с плоскими файлами. Существуют различные системы на базе БД, которые могут помочь автоматизировать это. Или вы можете написать сценарий:
Я заполняю текстовый файл списком зон и первичным IP-адресом NS для зоны и прикрепляю его к веб-сайту, к которому я разрешаю доступ своим ведомым устройствам. Подчиненные устройства периодически получают этот файл, и если он изменился, они анализируют его, генерируют named.conf и сообщают bind перезагрузить конфигурации. Он «автоматический» в том смысле, что мне не нужно вручную подключать ssh ко второстепенным серверам и обновлять конфигурации, но он по-прежнему является внешним для bind9.
Вы также можете использовать систему управления конфигурацией более высокого уровня, такую как кукольный, чтобы управлять всей вашей инфраструктурой DNS. Однако это немного сложнее.
Возможно, вы ищете систему управления конфигурацией, например Кукольный или CFEngine? Здесь задействована дополнительная инфраструктура, но они могут справиться с распределением большого количества конфигурационного материала и легко могут включить это.
Сам Bind не может этого сделать. Более того, было бы нежелательно, чтобы это происходило. Есть много ситуаций, когда только определенные домены должны быть реплицированы с любым данным ведомым устройством.
Использование rsync для всего вашего дерева / var / named работает очень хорошо, если вы правильно напишете свои зоны и убедитесь, что named.conf находится в / var / named. Однако он не будет работать с динамическими обновлениями и в некотором роде противоречит принципам «как все должно быть сделано».
Я также экспериментировал с заполнением всех доменов для распространения в специальную зону и использовал простой скрипт на подчиненных устройствах для восстановления named.conf на основе того, что они видят в главной зоне. В основном то же самое, что и в текстовом файле выше, но с подачей его из DNS, чтобы все оставалось в полосе. Мне, наверное, стоит опубликовать сценарий, прежде чем я его потеряю = /
Во времена, когда у всех и у их мамы были собственные домены, меня удивляет, что на данный момент нет хорошего решения для этого, интегрированного с Bind = /
Я второй (или третий) вышеупомянутые предложения, чтобы проверить Puppet или CFEngine. Кроме того, вы можете проверить свои файлы в CVS / SVN и обратно. Если вас интересует решение для написания сценариев, вот что я использую:
#!/bin/bash
DATE=`date +%Y-%m-%d`
archive='/root/dns'
cd $archive
[ $1 ] && DEBUG=$1
if [ "$DEBUG" == "-debug" ]; then
echo "Debugging activated..."
else
unset DEBUG
fi
for server in dnsm02 dnsm03 dnsm51 dnsm52; do
for file in named.conf named.cfx.conf named.external.conf named.internal.conf named.logging.conf named.options.conf; do
PATCHDIR="$archive/$server/$DATE/patch" && [ $DEBUG ] && echo "PATCHDIR = $PATCHDIR"
SRVDIR="$archive/$server/$DATE" && [ $DEBUG ] && echo "SRVDIR = $SRVDIR"
## Fetch bind config files from $server, put them in date stamped $archive/$server
[ ! -d $PATCHDIR ] && mkdir -p $PATCHDIR && [ $DEBUG ] && echo "Created archive directory"
scp -q user@$server:/etc/bind/$file $archive/$server/$DATE/$file && [ $DEBUG ] && echo "Copied remote $file from $server..."
## diff fetched file against template file and create a patch
[ $DEBUG ] && echo "Creating patch file..."
diff -u $SRVDIR/$file $archive/$server/$file > $PATCHDIR/patch.$file
[ ! -s $PATCHDIR/patch.$file ] && rm -f $PATCHDIR/patch.$file && [ $DEBUG ] && echo "no differences , no patch created for $server $file"
[ -s $PATCHDIR/patch.$file ] && patch $SRVDIR/$file $PATCHDIR/patch.$file && ssh user@$server "sudo scp user@dnsm01:$SRVDIR/$file /etc/bind/$file" && [ $DEBUG ] && echo "$file patched and uploaded"
done
[ $DEBUG ] && echo "Checking whether patch directory is empty..."
[ $(ls -1A $PATCHDIR | wc -l) -eq 0 ] && rmdir $PATCHDIR && [ $DEBUG ] && echo "$PATCHDIR empty, removing..."
ssh user@$server "sudo rndc reload"
done
ssh-ключи очень важны для этой настройки. Я не претендую на выдающиеся способности скриптинга, поэтому не стесняйтесь критиковать, но будьте осторожны.
При таком количестве зон, которое у меня есть, синхронизация вручную оказалась проще, чем заставить работать любое другое решение. Если бы у меня было намного больше зон, я бы посмотрел на предлагаемые решения.
Хороший опыт, работая над этим. Могу выложить свои скрипты, если они кому-то нужны.
Это некоторый PHP-код, который главный сервер может запустить для создания списка. Тогда варианты могут заключаться в том, чтобы загрузить его в БД, или другие DNS-серверы могут вытащить его через http / s.
Мастер-сервер может запустить это:
$dir = "/var/lib/bind";
$files = scandir($dir);
foreach($files as $file) {
$zoneparts = explode(".hosts", $file);
if(count($zoneparts) > 1){
echo $zoneparts[0] . "\r\n";
}
}
Подчиненный сервер может запустить это:
$zones = file(URL TO MASTER SERVER);
if($zones != ""){
$header = "// This is the primary configuration file for the BIND DNS server named.
//
// Please read /usr/share/doc/bind9/README.Debian.gz for information on the
// structure of BIND configuration files in Debian, *BEFORE* you customize
// this configuration file.
//
// If you are just adding zones, please do that in /etc/bind/named.conf.local
include "/etc/bind/named.conf.options";
include "/etc/bind/named.conf.local";
include "/etc/bind/named.conf.default-zones";
";
file_put_contents("/var/www/html/zone/zones.txt", $header);
foreach($zones as $zone){
if($zone != "") {
$zone = preg_replace('~[[:cntrl:]]~', '', $zone);
$config = 'zone "' . $zone.'" {
type slave;
masters {lemming; };
allow-transfer {none; };
file "/var/lib/bind/db.'.$zone.'";
};
';
file_put_contents('/var/www/html/zone/zones.txt', $config, FILE_APPEND);
}}
}
Каталог "зоны" должен быть доступен для записи.
Затем создайте сценарий bash следующим образом:
#!/bin/bash
php /var/www/html/index.php
cp /var/www/html/zone/zones.txt /etc/bind/named.conf
service bind9 restart
logger DNS Zones pulled from master and bind restarted /home/bob/dns_sync.sh
Затем создайте хронометраж с правами root (crontab -e):
*/10 * * * * /home/bob/dns_sync.sh