Apakah ada cara untuk menyinkronkan semua zona secara otomatis antara server BIND (9) sehingga saya tidak perlu menambahkan zona ke slave ketika saya menambahkannya ke master?
Apakah ada cara untuk menyinkronkan semua zona secara otomatis antara server BIND (9) sehingga saya tidak perlu menambahkan zona ke slave ketika saya menambahkannya ke master?
Jawaban:
Lihatlah BIND 9.7.2-P2 di mana Anda memiliki pernyataan "rndc addzone" dan "rndc delzone" yang memungkinkan Anda untuk "jarak jauh" menambah dan menghapus zona dari server yang sedang berjalan.
Saya memiliki makalah yang memberikan beberapa contoh yang saya berikan di NANOG bulan lalu.
ftp://ftp.isc.org/isc/pubs/pres/NANOG/50/DNSSEC-NANOG50.pdf
Meskipun ini tidak akan kembali dan membersihkan semua kekacauan yang Anda miliki saat ini, itu membuatnya sangat mudah untuk menyinkronkan mesin yang dapat Anda kelola menggunakan "rndc" di masa mendatang.
[ya, menanggapi posting yang agak lama, tetapi BIND 9.7.2-P2 cukup keren untuk menjaminnya]
Menambahkan pembaruan lain (bertahun-tahun setelah fakta, tetapi berharap itu membantu orang-orang yang menemukan ini di hasil pencarian), saya ingin merekomendasikan penggunaan zona Katalog.
Zona katalog, diperkenalkan di BIND 9.11 (2018) memungkinkan penyediaan zona secara otomatis (penambahan dan penghapusan) melalui zona khusus yang dibagi di antara server primer dan sekunder.
Untuk informasi lengkap, lihat: https://kb.isc.org/docs/aa-01401
Saya tidak tahu cara untuk melakukan ini secara asli ke bind9 jika Anda menggunakan backfile backend. Ada berbagai sistem yang didukung DB yang dapat membantu mengotomatiskannya. Atau Anda dapat menuliskannya:
Saya mengisi file teks dengan daftar zona dan IP NS utama untuk zona, dan menempelkannya pada situs web yang saya izinkan untuk diakses oleh budak saya. Budak mengambil file ini secara berkala, dan jika sudah diubah mereka menguraikannya menghasilkan names.conf, dan memberitahu bind untuk memuat ulang konfigurasi. Ini "otomatis" dalam arti bahwa saya tidak harus secara manual ssh ke sekunder saya dan memperbarui konfigurasi, tetapi itu masih eksternal untuk bind9.
Anda juga dapat menggunakan sistem manajemen konfigurasi tingkat tinggi seperti boneka , untuk mengelola seluruh infrastruktur DNS Anda. Itu sedikit lebih rumit.
Bind sendiri tidak bisa melakukannya. Lebih tepatnya, tidak diinginkan untuk melakukannya. Ada banyak situasi di mana hanya domain tertentu yang harus direplikasi dengan budak yang diberikan.
Menggunakan rsync pada seluruh pohon / var / named Anda berfungsi dengan baik jika Anda menulis zona Anda dengan benar dan pastikan named.conf tinggal di / var / named. Ini tidak akan bekerja dengan pembaruan dinamis, dan agak bertentangan dengan "bagaimana hal-hal harus dilakukan".
Saya juga bereksperimen dengan menjejalkan semua domain untuk disebarkan ke zona khusus, dan menggunakan skrip sederhana pada budak untuk membangun kembali names.conf berdasarkan apa yang mereka lihat di zona master. Pada dasarnya kesepakatan yang sama dengan file teks di atas, tetapi memberi makan dari DNS untuk menjaga semuanya tetap dalam-band. Saya mungkin harus menerbitkan skrip sebelum akhirnya kehilangan itu = /
Pada hari-hari semua orang dan ibu mereka memiliki domain sendiri, mengejutkan saya tidak ada solusi yang baik untuk ini terintegrasi dengan Bind sekarang = /
Saya kedua (atau ketiga) saran di atas untuk memeriksa Wayang atau CFEngine. Juga, Anda bisa melihat memeriksa file Anda masuk dan keluar dari CVS / SVN. Jika Anda tertarik dengan solusi scripting, inilah yang saya gunakan:
#!/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
kunci ssh sangat penting untuk pengaturan ini. Saya tidak mengklaim kekuatan scripting-fu yang luar biasa, jadi jangan ragu untuk mengkritik, tetapi bersikaplah lembut.
Pengalaman bagus, menyelesaikan ini. Saya dapat memposting skrip saya, jika ada yang menginginkannya.
Ini adalah beberapa kode php yang dapat dijalankan oleh server master untuk membuat daftar. Opsi kemudian dapat mengunggahnya ke DB atau server DNS lainnya dapat menariknya ke http / s.
Server master dapat menjalankan ini:
$dir = "/var/lib/bind";
$files = scandir($dir);
foreach($files as $file) {
$zoneparts = explode(".hosts", $file);
if(count($zoneparts) > 1){
echo $zoneparts[0] . "\r\n";
}
}
Server slave dapat menjalankan ini:
$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);
}}
}
Dir "zone" harus dapat ditulisi
Kemudian buat skrip bash seperti ini:
#!/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
Kemudian buat chronjob sebagai root (crontab -e):
*/10 * * * * /home/bob/dns_sync.sh