Câu trả lời:
Nhìn vào BIND 9.7.2-P2 trong đó bạn có các câu lệnh "rndc addzone" và "rndc delzone" cho phép bạn "từ xa" thêm và xóa các vùng khỏi máy chủ đang chạy.
Tôi có một bài viết cung cấp một số ví dụ mà tôi đã đưa ra tại NANOG vào tháng trước.
ftp://ftp.isc.org/isc/pub/pres/NANOG/50/DNSSEC-NANOG50.pdf
Mặc dù điều này sẽ không quay trở lại và dọn sạch bất kỳ mớ hỗn độn nào mà bạn hiện có, nhưng nó thực sự dễ dàng đồng bộ hóa các máy mà bạn có thể quản lý bằng cách sử dụng "rndc" trong tương lai.
[có, trả lời một bài viết khá cũ, nhưng BIND 9.7.2-P2 đủ tuyệt vời để đảm bảo nó]
Thêm một bản cập nhật khác (nhiều năm sau thực tế, nhưng hy vọng rằng nó sẽ giúp mọi người chạy qua điều này trong kết quả tìm kiếm), tôi muốn giới thiệu việc sử dụng các Danh mục.
Các khu vực danh mục, được giới thiệu trong BIND 9.11 (2018) cho phép cung cấp tự động các khu vực (bổ sung và xóa) thông qua một khu vực đặc biệt được chia sẻ giữa các máy chủ chính và phụ.
Để biết thông tin đầy đủ, xem: https://kb.isc.org/docs/aa-01401
Tôi không biết cách nào để thực hiện điều này một cách tự nhiên để ràng buộc9 nếu bạn đang sử dụng chương trình phụ trợ phẳng. Có nhiều hệ thống được DB hỗ trợ có thể giúp tự động hóa nó. Hoặc bạn có thể viết kịch bản:
Tôi điền một tệp văn bản với một danh sách các vùng và IP NS chính cho vùng đó và dán nó vào một trang web mà tôi cho phép nô lệ của mình truy cập. Các nô lệ tìm nạp tệp này theo định kỳ và nếu nó đã thay đổi, họ phân tích cú pháp, nó sẽ tạo ra một tên.conf và thông báo liên kết để tải lại cấu hình. Đó là "tự động" theo nghĩa là tôi không phải tự ssh sang phần phụ của mình và cập nhật cấu hình, nhưng nó vẫn ở bên ngoài để ràng buộc9.
Bạn cũng có thể sử dụng hệ thống quản lý cấu hình cấp cao hơn như con rối để quản lý toàn bộ cơ sở hạ tầng DNS của mình. Điều đó phức tạp hơn một chút mặc dù.
Bind chính nó không thể làm điều đó. Hơn nữa, sẽ là không mong muốn nếu có nó làm như vậy. Có nhiều tình huống chỉ có một số miền nhất định được sao chép với bất kỳ nô lệ nào.
Sử dụng rsync trên toàn bộ / var / cây có tên của bạn hoạt động khá tốt nếu bạn viết chính xác các vùng của mình và đảm bảo tên.conf sống trong / var / được đặt tên. Mặc dù vậy, nó sẽ không hoạt động với các bản cập nhật động và là một phần của "cách mọi thứ nên được thực hiện".
Tôi cũng đã thử nghiệm nhồi nhét tất cả các miền để truyền vào một khu vực đặc biệt và sử dụng một tập lệnh đơn giản trên các nô lệ để xây dựng lại tên.conf dựa trên những gì họ thấy trong khu vực chính. Về cơ bản xử lý tương tự như tệp văn bản ở trên, nhưng cung cấp nó từ DNS để giữ mọi thứ trong băng tần. Tôi có lẽ nên xuất bản tập lệnh trước khi tôi mất nó = /
Vào thời của mọi người và mẹ của họ có tên miền riêng, điều đó làm tôi ngạc nhiên, hiện tại không có giải pháp nào tốt cho việc này được tích hợp với Bind = /
Tôi thứ hai (hoặc thứ ba) các đề xuất trên để kiểm tra Puppet hoặc CFEngine. Ngoài ra, bạn có thể xem xét việc kiểm tra các tệp của mình vào và ra khỏi CVS / SVN. Nếu bạn quan tâm đến một giải pháp kịch bản, đây là những gì tôi sử dụng:
#!/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
Phím ssh là khá cần thiết cho thiết lập này. Tôi không yêu cầu quyền hạn kịch bản phi thường, vì vậy hãy thoải mái chỉ trích, nhưng hãy nhẹ nhàng.
Kinh nghiệm tốt, làm việc này ra. Tôi có thể đăng kịch bản của mình, nếu có ai muốn.
Đây là một số mã php mà máy chủ chính có thể chạy để tạo danh sách. Các tùy chọn sau đó có thể là tải nó lên DB hoặc các máy chủ DNS khác có thể kéo nó qua http / s.
Máy chủ chính có thể chạy này:
$dir = "/var/lib/bind";
$files = scandir($dir);
foreach($files as $file) {
$zoneparts = explode(".hosts", $file);
if(count($zoneparts) > 1){
echo $zoneparts[0] . "\r\n";
}
}
Máy chủ nô lệ có thể chạy này:
$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);
}}
}
Các dir "khu vực" sẽ cần phải được ghi
Sau đó tạo một tập lệnh bash như thế này:
#!/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
Sau đó tạo một chronjob làm gốc (crontab -e):
*/10 * * * * /home/bob/dns_sync.sh