Sinkronkan semua zona secara otomatis antara BIND 9


9

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?


1
selain menambahkannya secara manual ke named.conf, saya tidak melihat cara lain; Jika itu yang Anda minta
quaie

Jawaban:


12

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


Saat mempromosikan perangkat lunak yang terkait dengan Anda, sertakan beberapa referensi untuk fakta itu (bahkan jika perangkat lunaknya gratis). Terima kasih dan selamat datang di Server Fault.
Chris S

Yap, saya bekerja untuk ISC, orang-orang yang memelihara BIND dan DHCP ISC. :)
Knobee

4

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.


1
+1 - Saya menggunakan teknik serupa (tapi mungkin kurang efisien) sendiri dan sepertinya berfungsi dengan baik. Untuk mendapatkan propagasi cepat ke budak perubahan baru, mereka perlu sering polling dokumen master (saya telah menemukan setiap sepuluh menit lebih dari cukup sering).
David Spillett

Kembali sebelum saya mendapatkan dua agama Automation dan Tinydns, saya memiliki sebuah skrip yang menguraikan daftar konfigurasi zona master untuk mendapatkan daftar zona, yang saya paparkan melalui inetd, dan kemudian sebuah skrip pada para budak yang mensurvei sejumlah IP master mana pun. alamat (dan menggunakan alamat itu sebagai alamat IP master dalam konfigurasi budak mereka). Mimpi berhasil.
womble

4

Mungkin Anda sedang mencari sistem manajemen konfigurasi seperti Puppet atau CFEngine? Ada infrastruktur tambahan yang terlibat, tetapi mereka dapat menangani mendistribusikan banyak hal konfigurasi, dan dapat dengan mudah memasukkan ini juga.


2

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.


Sekarang BIND ternyata bisa, lihat jawaban @ Knobee.
Volker Stolz

@mad_vs - Terima kasih, saya tidak akan melihat jawaban itu sebaliknya.
John Gardeniers

1

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 = /


0

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.


0

Untuk jumlah zona yang saya miliki, sinkronisasi secara manual ternyata lebih mudah daripada membuat solusi lain bekerja. Jika saya memiliki lebih banyak zona, saya akan mencari solusi yang diusulkan.


0
  1. Buat skrip untuk menyalin semua nama file zona dari master (ls -1 akan melakukan sebagian besar ini).
  2. Buat skrip pada slave yang akan mengambil daftar file zona sebagai input, dan membuat named.conf.local dari daftar itu (pemformatannya cukup sederhana), dan ganti named.conf.local yang ada (Anda dapat menggunakan yang lain nama, dan sertakan dari named.conf.local jika Anda ingin memainkannya dengan aman)
  3. buat akses sudo passwordless perintah tunggal untuk "rndc reload" pada slave.
  4. Buat kunci ssh sekali pakai yang memungkinkan Anda untuk mengirim daftar zona dari master, dan pipa itu ke skrip slave dan kemudian jalankan "sudo rndc reload". Anda sekarang dapat mendorong zona dari master ke slave.
  5. (opsional) buat pekerjaan cron untuk mendorong zona setiap hari, atau apa pun.

Pengalaman bagus, menyelesaikan ini. Saya dapat memposting skrip saya, jika ada yang menginginkannya.


@ naught101, bisakah Anda memposting skrip?

0

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.