Есть ли способ автоматически синхронизировать все зоны между серверами BIND (9), чтобы мне не нужно было добавлять зоны в ведомое устройство, когда я добавляю их в ведущее устройство?
Есть ли способ автоматически синхронизировать все зоны между серверами 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, если вы используете flatfile backend. Существуют различные системы с поддержкой БД, которые могут помочь автоматизировать это. Или вы можете написать это:
Я заполняю текстовый файл списком зон и первичным IP-адресом NS для зоны и помещаю его на веб-сайт, к которому я разрешаю доступ своим подчиненным. Ведомые устройства периодически извлекают этот файл, и если он изменился, они анализируют его, генерируют named.conf и сообщают bind для перезагрузки конфигураций. Он «автоматический» в том смысле, что мне не нужно вручную подключать ssh к своим вторичным серверам и обновлять конфиги, но он по-прежнему не связан с bind9.
Вы также можете использовать систему управления конфигурацией более высокого уровня, такую как puppet , для управления всей инфраструктурой DNS. Это немного сложнее, хотя.
Привязать себя не могу. Более того, было бы нежелательно делать это. Есть много ситуаций, когда только определенные домены должны быть реплицированы с любым данным ведомым устройством.
Использование 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);
}}
}
Директория "zone" должна быть доступна для записи
Затем создайте скрипт 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
Затем создайте chronjob от имени пользователя root (crontab -e):
*/10 * * * * /home/bob/dns_sync.sh