Tự động đồng bộ hóa tất cả các vùng giữa BIND 9


9

Có cách nào để tự động đồng bộ hóa tất cả các vùng giữa các máy chủ BIND (9) để tôi không phải thêm vùng vào nô lệ khi tôi thêm chúng vào máy chủ không?


1
ngoài việc thêm chúng theo cách thủ công vào tên.conf, tôi không thấy cách nào khác; nếu đó là những gì bạn đã hỏi
quaie

Câu trả lời:


12

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


Khi quảng cáo phần mềm mà bạn liên kết, vui lòng bao gồm một số tham chiếu đến thực tế đó (ngay cả khi phần mềm miễn phí). Cảm ơn và chào mừng đến với Server Fault.
Chris S

Đúng, tôi làm việc cho ISC, những người duy trì BIND và ISC DHCP. :)
Knobee

4

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ù.


1
+1 - Bản thân tôi sử dụng một kỹ thuật tương tự (nhưng có lẽ kém hiệu quả hơn) và nó dường như hoạt động đáng tin cậy. Để có được sự truyền bá nhanh chóng đến những nô lệ của những thay đổi mới, họ cần phải thăm dò tài liệu chính thường xuyên (tôi đã tìm thấy cứ sau mười phút là quá đủ thường xuyên).
David Spillett

Quay trở lại trước khi tôi nhận được hai tôn giáo Tự động hóa và Tinydns, tôi đã có một tập lệnh phân tích danh sách cấu hình vùng chính để lấy danh sách các vùng mà tôi đã hiển thị qua inetd và sau đó là tập lệnh trên các nô lệ đã thăm dò bất kỳ số lượng IP chính nào địa chỉ (và được sử dụng địa chỉ đó làm địa chỉ IP chính trong cấu hình nô lệ của chúng). Làm việc trong mơ.
womble

4

Có lẽ bạn đang tìm kiếm một hệ thống quản lý cấu hình như Puppet hoặc CFEngine? Có thêm cơ sở hạ tầng liên quan, nhưng họ có thể xử lý việc phân phối nhiều thứ cấu hình và cũng có thể dễ dàng bao gồm điều này.


2

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.


Bây giờ BIND rõ ràng có thể, xem câu trả lời của @ Knobee.
Volker Stolz

@mad_vs - Cảm ơn, tôi sẽ không thấy câu trả lời khác.
John Gardeniers

1

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


0

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.


0

Đối với số lượng vùng tôi có, đồng bộ hóa thủ công kết thúc dễ dàng hơn bất kỳ giải pháp nào khác để làm việc. Nếu tôi có nhiều khu vực hơn, tôi sẽ xem xét các giải pháp được đề xuất.


0
  1. Tạo một tập lệnh để trích xuất tất cả các tên tệp vùng từ bản gốc (ls -1 sẽ thực hiện hầu hết điều này).
  2. Tạo một tập lệnh trên Slave sẽ lấy danh sách các tệp vùng làm đầu vào và tạo một tên.conf.local từ danh sách đó (định dạng khá đơn giản) và thay thế tên có sẵn.conf.local (bạn có thể sử dụng tệp khác tên và bao gồm nó từ tên.conf.local nếu bạn muốn chơi nó an toàn)
  3. tạo một truy cập sudo không mật khẩu một lệnh cho "rndc tải lại" trên nô lệ.
  4. Tạo khóa ssh sử dụng một lần cho phép bạn gửi danh sách các vùng từ bản gốc và chuyển nó vào tập lệnh nô lệ và sau đó chạy "sudo rndc tải lại". Bây giờ bạn có thể đẩy các khu vực từ chủ đến nô lệ.
  5. (tùy chọn) tạo một công việc định kỳ để đẩy các vùng hàng ngày, hoặc những gì đã từ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.


@ naught101, bạn có thể gửi các kịch bản không?

0

Đâ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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.