bind多个view的主备同步

上一篇blog简单写了一下使用nsupdate动态更新DNS记录。今天再写一下在多个view的时候如何设置主备的自动同步。
多个view的主备同步主要是是主备之间每个view都使用共享key进行消息的签名。master的配置和之前的稍微有点小的改动

include "/opt/bind/etc/rndc.key";  
include "/opt/bind/etc/views.key";  
//  
controls {  
inet 127.0.0.1 port 953  
allow { 127.0.0.1; } keys { "rndc-key"; };  
};  
//  
acl test1 {  
10.201.0.0/16;  
};  
acl test2 {  
192.0.0.0/8;  
};  
acl slavedns {  
10.144.149.61;  
127.0.0.1;  
};  
options {  
listen-on port 53 { any; };  
listen-on-v6  { none; };  
directory      "/opt/bind/etc/";  
dump-file      "/opt/bind/var/named/data/cache_dump.db";  
statistics-file "/opt/bind/var/named/data/named_stats.txt";  
memstatistics-file "/opt/bind/var/named/data/named_mem_stats.txt";  
zone-statistics yes;  
allow-query     { any; };  
# recursion config  
recursion yes;  
max-ncache-ttl 60;  
recursive-clients 2000;  
# dnssec config  
dnssec-enable yes;  
dnssec-validation yes;  
dnssec-lookaside auto;  
# rrt config  
rate-limit {  
responses-per-second 20;  
qps-scale  1000;  
window 4;  
slip 2;  
ipv4-prefix-length 32;  
};  
# rpz config  
response-policy {  
zone "rpz.zone"  policy given;  
};  
# log query  
querylog yes;  
#define version  
version "GNUer's dns 2.0";  
## transfer config  
notify explicit;  
tcp-clients 2000;  
transfers-out 100;  
allow-transfer {  slavedns; 127.0.0.1;};  
also-notify { 10.144.149.61; };  
/* Path to ISC DLV key */  
#bindkeys-file "/opt/bind/etc/named.iscdlv.key";  
};  
  
logging {  
channel default_syslog { file "/opt/bind/var/log/named.syslog" versions 5 size 100m; severity dynamic; print-time yes;};  
channel default_debug { file "/opt/bind/var/log/named.run" versions 5 size 100m; severity dynamic; print-time yes;};  
channel default_stderr { stderr; severity info; };  
channel null { null; };  
channel general_debug { file "/opt/bind/var/log/named.general" versions 3 size 100m; severity dynamic; print-time yes;};  
channel database_debug { file "/opt/bind/var/log/named.database" versions 3 size 100m; severity dynamic; print-time yes;};  
channel query_log { file "/opt/bind/var/log/named.query" versions 3 size 100m; severity dynamic; print-time yes;print-severity yes; print-category yes;};  
channel resolver_log { file "/opt/bind/var/log/named.resolver" versions 3 size 100m; severity dynamic; print-time yes;};  
channel security_log { file "/opt/bind/var/log/named.security" versions 3 size 100m; severity dynamic; print-time yes;};  
channel notify_log { file "/opt/bind/var/log/named.notify" versions 3 size 100m; severity dynamic; print-time yes;};  
channel rrt_log { file "/opt/bind/var/log/named.rrt" versions 3 size 100m; severity dynamic; print-time yes;};  
channel rpz_log { file "/opt/bind/var/log/named.rpz" versions 3 size 100m; severity dynamic; print-time yes;};  
category default {null; };  
category queries { query_log; };  
category resolver { resolver_log; };  
category security { security_log; };  
category notify { notify_log; };  
category xfer-in { notify_log; };  
category xfer-out { notify_log; };  
category update { notify_log; };  
category unmatched {default_syslog; };  
category rate-limit {rrt_log;};  
category rpz {rpz_log;};  
};  
view "test1" {  
recursion yes;  
allow-query { any; };  
match-clients {test1; key test1;};  
allow-update { key test1; };  
server 10.144.149.61 {keys  test1;};  
//  also-notify { 10.144.149.61; };  
zone "test.org" {  
type master;  
file "master/test.org.view1";  
};  
zone "rpz.zone" {  
type master;  
file "master/rpz.zone";  
allow-update {none;};  
};  
zone "."{  
type hint;  
file "named.root";  
};  
};  
  
view "test2" {  
recursion yes;  
allow-query { any; };  
server 10.144.149.61 {keys  test2;};  
match-clients {test2; key test2;};  
allow-update { key test2; };  
// also-notify { 10.144.149.61; };  
zone "test.org" {  
type master;  
file "master/test.org.view2";  
};  
zone "rpz.zone" {  
type master;  
file "master/rpz.zone";  
allow-update {none;};  
};  
zone "."{  
type hint;  
file "named.root";  
};  
};  
view "default" {  
recursion yes;  
allow-query { any; };  
server 10.144.149.61 {keys  default;};  
match-clients {any;key default; };  
allow-update { key default; };  
// also-notify { 10.144.149.61; };  
zone "test.org" {  
type master;  
file "master/test.org.default";  
};  
zone "rpz.zone" {  
type master;  
file "master/rpz.zone";  
allow-update {none;};  
};  
zone "."{  
type hint;  
file "named.root";  
};  
};

master中的注意事项是:

  1. also-notify 可以不用每个view都写一遍,在options里把slave都写全也行(也得跟进实际的安全需求来)
  2. 每个view内用allow-update设置只允许响应的key进行更新。
  3. 需要使用server来指定和对端机器通信的共享密钥。

slave的配置

include "/opt/bind/etc/rndc.key";  
include "/opt/bind/etc/views.key";  
//  
controls {  
inet 127.0.0.1 port 953  
allow { 127.0.0.1; } keys { "rndc-key"; };  
};  
//  
acl test1 {  
10.161.65.8;  
};  
acl test2 {  
192.0.0.0/8;  
};  
  
options {  
listen-on port 53 { any; };  
listen-on-v6  { none; };  
directory      "/opt/bind/etc/";  
dump-file      "/opt/bind/var/named/data/cache_dump.db";  
statistics-file "/opt/bind/var/named/data/named_stats.txt";  
memstatistics-file "/opt/bind/var/named/data/named_mem_stats.txt";  
masterfile-format text;  
zone-statistics yes;  
allow-query     { any; };  
# recursion config  
recursion yes;  
max-ncache-ttl 60;  
recursive-clients 2000;  
# dnssec config  
dnssec-enable yes;  
dnssec-validation yes;  
dnssec-lookaside auto;  
# rrt config  
rate-limit {  
responses-per-second 20;  
qps-scale  1000;  
window 4;  
slip 2;  
ipv4-prefix-length 32;  
};  
# rpz config  
response-policy {  
zone "rpz.zone"  policy given;  
};  
# log query  
querylog yes;  
#define version  
version "GNUer's dns 2.0";  
## transfer config  
notify explicit;  
tcp-clients 2000;  
transfers-out 100;  
  
/* Path to ISC DLV key */  
#bindkeys-file "/opt/bind/etc/named.iscdlv.key";  
};  
  
logging {  
channel default_syslog { file "/opt/bind/var/log/named.syslog" versions 5 size 100m; severity dynamic; print-time yes;};  
channel default_debug { file "/opt/bind/var/log/named.run" versions 5 size 100m; severity dynamic; print-time yes;};  
channel default_stderr { stderr; severity info; };  
channel null { null; };  
channel general_debug { file "/opt/bind/var/log/named.general" versions 3 size 100m; severity dynamic; print-time yes;};  
channel database_debug { file "/opt/bind/var/log/named.database" versions 3 size 100m; severity dynamic; print-time yes;};  
channel query_log { file "/opt/bind/var/log/named.query" versions 3 size 100m; severity dynamic; print-time yes;print-severity yes; print-category yes;};  
channel resolver_log { file "/opt/bind/var/log/named.resolver" versions 3 size 100m; severity dynamic; print-time yes;};  
channel security_log { file "/opt/bind/var/log/named.security" versions 3 size 100m; severity dynamic; print-time yes;};  
channel notify_log { file "/opt/bind/var/log/named.notify" versions 3 size 100m; severity dynamic; print-time yes;};  
channel rrt_log { file "/opt/bind/var/log/named.rrt" versions 3 size 100m; severity dynamic; print-time yes;};  
channel rpz_log { file "/opt/bind/var/log/named.rpz" versions 3 size 100m; severity dynamic; print-time yes;};  
category default {null; };  
category queries { query_log; };  
category resolver { resolver_log; };  
category security { security_log; };  
category notify { notify_log; };  
category xfer-in { notify_log; };  
category xfer-out { notify_log; };  
category update { notify_log; };  
category unmatched {default_syslog; };  
category rate-limit {rrt_log;};  
category rpz {rpz_log;};  
};  
view "test1" {  
recursion yes;  
server 10.161.64.97 {keys test1; };  
allow-query { any; };  
match-clients {test1; key test1;};  
allow-update { key test1; };  
zone "test.org" {  
type slave;  
file "master/test.org.view1";  
masters { 10.161.64.97; } ;  
};  
zone "rpz.zone" {  
type master;  
file "master/rpz.zone";  
allow-update {none;};  
};  
zone "."{  
type hint;  
file "named.root";  
};  
};  
  
view "test2" {  
recursion yes;  
allow-query { any; };  
match-clients {test2; key test2;};  
server 10.161.64.97 {keys test2; };  
allow-update { key test2; };  
zone "test.org" {  
type slave;  
file "master/test.org.view2";  
masters { 10.161.64.97; } ;  
};  
zone "rpz.zone" {  
type master;  
file "master/rpz.zone";  
allow-update {none;};  
};  
zone "."{  
type hint;  
file "named.root";  
};  
};  
view "default" {  
recursion yes;  
allow-query { any; };  
server 10.161.64.97 {keys default; };  
match-clients {any;key default; };  
allow-update { key default; };  
zone "test.org" {  
type slave;  
file "master/test.org.default";  
masters { 10.161.64.97; } ;  
};  
zone "rpz.zone" {  
type master;  
file "master/rpz.zone";  
allow-update {none;};  
};  
zone "."{  
type hint;  
file "named.root";  
};  
};

slave的配置注意项也是每个view要使用server定义master通信时使用的key,然后限制特定的key才能更新。另外需要注意的是slave和master的IP不要在任何的acl里。