BIND 9間ですべてのゾーンを自動的に同期


9

ゾーンをマスターに追加するときにゾーンをスレーブに追加する必要がないように、BIND(9)サーバー間ですべてのゾーンを自動的に同期する方法はありますか?


1
それらをnamed.confに手動で追加する以外は、私は他の方法を見ていません。それがあなたが尋ねたものなら
quaie

回答:


12

実行中のサーバーに対してゾーンを「リモート」で追加および削除できる「rndc addzone」および「rndc delzone」ステートメントがあるBIND 9.7.2-P2を見てください。

私は先月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を参照して ください。


関連付けられているソフトウェアを宣伝する際は、その事実についての言及も含めてください(ソフトウェアが無料であっても)。ありがとう、そしてサーバーフォールトへようこそ。
Chris S

うん、私はBINDとISC DHCPを管理しているISCで働いています。:)
Knobee 2010年

4

flatfileバックエンドを使用している場合、これをbind9にネイティブで行う方法は知りません。それを自動化するのを助けることができるさまざまなDB-backedシステムがあります。または、スクリプトで記述できます。

ゾーンのリストとゾーンのプライマリNS IPをテキストファイルに入力し、スレーブにアクセスを許可するWebサイトに貼り付けます。スレーブはこのファイルを定期的にフェッチし、変更されている場合は解析してnamed.confを生成し、bindに設定をリロードするように指示します。セカンダリに手動でsshして設定を更新する必要がないという意味では「自動」ですが、それでもbind9の外部にあります。

また、puppetなどの上位レベルの構成管理システムを使用して、DNSインフラストラクチャ全体を管理することもできます。しかし、それはもう少し複雑です。


1
+1-私自身も同様の(しかしおそらく効率が悪い)テクニックを使用しており、確実に機能するようです。新しい変更をスレーブにすばやく伝達するには、マスタードキュメントを頻繁にポーリングする必要があります(10分ごとに十分な頻度であることがわかりました)。
デビッドスピレット2009

AutomationとTinydnsの2つの宗教を取得する前に、マスターのゾーン構成リストを解析して、inetdを介して公開したゾーンのリストを取得するスクリプトと、任意の数のマスターIPをポーリングするスレーブのスクリプトがありましたアドレス(およびそのアドレスをスレーブ構成のマスターIPアドレスとして使用)夢をみた。
ウォンブル

4

たぶん、PuppetCFEngineなどの構成管理システムを探していますか?追加のインフラストラクチャが含まれていますが、それらは多くの構成要素の配布を処理でき、これも簡単に含めることができます。


2

バインド自体はそれを行うことができません。要するに、そうすることは望ましくありません。特定のドメインのみを特定のスレーブで複製する必要がある状況は数多くあります。


今ではBINDは明らかにできる、@ Knobeeの答えを見てください。
Volker Stolz

@mad_vs-おかげで、他の方法ではその答えを見ることはできなかったでしょう。
John

1

/ var / namedツリー全体でrsyncを使用することは、ゾーンを正しく記述し、named.confが/ var / namedに存在することを確認した場合、非常にうまく機能します。ただし、動的更新では機能せず、「どのように実行すべきか」という観点からは多少不利です。

また、すべてのドメインを詰め込んで特別なゾーンに伝播する実験を行い、スレーブでシンプルなスクリプトを使用して、マスターゾーンでの表示に基づいてnamed.confを再構築しました。基本的に上記のテキストファイルと同じ処理ですが、すべてをインバンドに保つためにDNSからフィードします。スクリプトを失う前に、私はおそらくスクリプトを公開する必要があります= /

みんなと自分のお母さんが自分のドメインを持っている時代に、これまでにBindと統合されたこれに対する良い解決策がないのには驚きです= /


0

上記の2番目(または3番目)の提案は、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キーは、このセットアップにかなり不可欠です。私は並外れたscripting-fuの力を主張していませんので、遠慮なく非難してください。


0

私が持っているゾーンの数では、手動での同期は他のソリューションを機能させるよりも簡単になりました。さらに多くのゾーンがある場合は、提案されたソリューションを調べます。


0
  1. マスターからすべてのゾーンファイル名をリッピングするスクリプトを作成します(ls -1はこれのほとんどを行います)。
  2. 入力としてゾーンファイルのリストを取得するスクリプトをスレーブに作成し、そのリストからnamed.conf.localを作成し(フォーマットは非常に簡単です)、既存のnamed.conf.localを置き換えます(別の名前を付け、安全に再生したい場合はそれをnamed.conf.localから含めます)
  3. スレーブで「rndc reload」用の単一コマンドのパスワードなしのsudoアクセスを作成します。
  4. マスターからゾーンのリストを送信できる使い捨てのsshキーを作成し、それをスレーブスクリプトにパイプして、「sudo rndc reload」を実行します。これで、ゾーンをマスターからスレーブにプッシュできます。
  5. (オプション)ゾーンを毎日、またはこれまでにプッシュするcronジョブを作成します。

良い経験です。誰かが望めば、スクリプトを投稿できます。


@ naught101、スクリプトを投稿していただけますか?

0

これは、マスターサーバーがリストを作成するために実行できるいくつかのphpコードです。次に、オプションをDBにアップロードするか、他の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としてchronjobを作成します(crontab -e)。

*/10 * * * * /home/bob/dns_sync.sh
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.