Назад | Перейти на главную страницу

Автоматическая синхронизация всех зон между 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, если вы используете бэкэнд с плоскими файлами. Существуют различные системы на базе БД, которые могут помочь автоматизировать это. Или вы можете написать сценарий:

Я заполняю текстовый файл списком зон и первичным 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-ключи очень важны для этой настройки. Я не претендую на выдающиеся способности скриптинга, поэтому не стесняйтесь критиковать, но будьте осторожны.

При таком количестве зон, которое у меня есть, синхронизация вручную оказалась проще, чем заставить работать любое другое решение. Если бы у меня было намного больше зон, я бы посмотрел на предлагаемые решения.

  1. Создайте скрипт для копирования всех имен файлов зон из главного (ls -1 сделает большую часть этого).
  2. Создайте сценарий на ведомом устройстве, который будет принимать список файлов зоны в качестве входных данных и создавать из этого списка named.conf.local (форматирование довольно простое) и заменять существующий named.conf.local (вы можете использовать другой name и включите его из named.conf.local, если хотите перестраховаться)
  3. создать однокомандный беспарольный доступ sudo для "rndc reload" на ведомом устройстве.
  4. Создайте одноразовый ключ ssh, который позволит вам отправить список зон с главного сервера и передать его в подчиненный скрипт, а затем запустить sudo rndc reload. Теперь вы можете переместить зоны с ведущего на ведомое.
  5. (необязательно) создайте задание cron для ежедневного обновления зон или чего-то еще.

Хороший опыт, работая над этим. Могу выложить свои скрипты, если они кому-то нужны.

Это некоторый 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