bind主从同步

 

http://blog.sina.com.cn/s/blog_4b427acf0101dng7.html

假设两台dns系统都安装了bind9.6,其中主dns为192.168.3.124,有分view配置,从dns为192.168.3.123,则配置如下;

主dns配置:

options {
 directory "/var/named";
 dump-file "/var/named/data/cache_dump.db";
 statistics-file "/var/named/data/named_stats.txt";
 allow-transfer {192.168.3.123;};
};

logging {
 channel "named_log" {
  file "/var/log/named/named.log" versions 10 size 20m;
  severity info;
  print-category yes;
  print-severity yes;
  print-time yes;
 };
 category default { named_log; };
};

controls {
 inet 127.0.0.1 allow { localhost; } keys { rndckey; };
};

include "/etc/rndc.key";

key "tel" {
 algorithm hmac-md5;
 secret "YylFWUQsflthT0nhexv3sQ==";
};

key "cnc" {
 algorithm hmac-md5;
 secret "YSP6cJNR3nwsVn2O0/79zA==";
};

view "cnc" {
 match-clients {key "cnc"; 192.168.3.112;};
 server 192.168.3.123 { keys "cnc"; };

 zone "." IN {
  type hint;
  file "/var/named/named.root";
 };

 zone "com" {
  type master;
  also-notify {192.168.3.123;};
  file "cnc_com.hosts";
 };
};

view "tel" {
 match-clients {key "tel"; 192.168.3.115; };
 server 192.168.3.123 { keys "tel"; };

 zone "." IN {
  type hint;
  file "/var/named/named.root";
 };

 zone "com" {
  type master;
  also-notify {192.168.3.123;};
  file "tel_com.hosts";
 };
};

从dns配置:

key "tel" {
 algorithm hmac-md5;
 secret "YylFWUQsflthT0nhexv3sQ==";
};

key "cnc" {
 algorithm hmac-md5;
 secret "YSP6cJNR3nwsVn2O0/79zA==";
};

options {
 directory "/var/named";
 dump-file "/var/named/data/cache_dump.db";
 statistics-file "/var/named/data/named_stats.txt";
 max-refresh-time 10;
};

logging {
 channel "named_log" {
  file "/var/log/named/named.log" versions 10 size 20m;
  severity info;
  print-category yes;
  print-severity yes;
  print-time yes;
 };
 category default { named_log; };
};

controls {
 inet 127.0.0.1 allow { localhost; } keys { rndckey; };
};

include "/etc/rndc.key";


view "cnc" {
 match-clients { key "cnc";192.168.3.112;};
 server 192.168.3.124 { keys "cnc"; };
 zone "." IN {
  type hint;
  file "/var/named/named.root";
 };

 zone "com"{
  type slave;
  file "cnc_com.hosts";
  masters{ 192.168.3.124; };
 };
};

view "tel" {
 match-clients {key "tel"; 192.168.3.115; };
 server 192.168.3.124 { keys "tel"; };

 zone "." IN {
  type hint;
  file "/var/named/named.root";
 };

 zone "com"{
  type slave;
  file "tel_com.hosts";
  masters{ 192.168.3.124; };
 };
};

说明:当主dns加载配置的时候,会主动发送notify给从dns,从dns发现主dns配置比较新的话,就会下载配置文件;同时,从dns也会根据zone设置的soa的刷新时间来定时向主服务器进行查询,以便进行更新。
        如果主dns不设置server语句的话,则主服务器主动发送给从dns的notify会被拒绝;如果从服务器不设置server语句的话,则不能实现分view同步的功能;如果主从服务器时间不同步的话,则会导致验证失败;如果从dns的ip匹配到主dns的view,则会导致只同步这个view的数据下来,即使配置了key。

 

Linux主辅dns数据不同步故障排除

      在互联网中,我们知道任何一台提供应用服务的主机(例如:HTTPFTP等)都有它一个便于记忆Domain Name,这些名称给用户带来了许多便利。但是,有些时候这些服务却对我们这些维护人员显得有些不“厚道”。本文将介绍DNS主辅配置过程中常遇到的配置问题以及排除方法。
      我们有必要了解一下主辅DNS区域复制原理:如下图3所示主辅DNS服务器数据同步的过程,首先master DNS服务器每次修改完成并重启服务后,将传送notify给所有的slave DNS服务器。slave DNS服务器将查询master服务器的SOA记录,master DNS服务器收到请求后将SOA记录发送给Slave DNS服务器,Slave DNS服务器收到后同时对比查询结果中的serial值,如果serial值不大于本机的话将结束数据同步过程;但是如果serial值大于本机的话,slave DNS将发送zone transfer请求要求(AXFR/IXFR)。Master响应zone transfer请求并传送结果,直到整个slave更新完成。
  
整体的同步过程如上所述,但是如何将这些原理体现在相关的配置文件中,这里以创建域名[url]www.qiuri.com[/url]记录为例:
测试平台:RedHat Enterprise Linux 5 Server update 2
所需软件包列表:
软件包名称
作用
bind-libs
包含DNS的库文件
Bind-9
DNS服务器软件,安装此软件前需要安装libs
caching-nameserver
配置文件模板
bind-utils
DNS查询工具软件
bind-chroot
使DNSchroot模式下运行,增强安全性(选择性安装)
根据你使用的安装包安装相应的软件,这里我使用系统自带的rpm包,配置yum本地更新源后,使用命令yum install bind*进行安装。使用yum安装的好处是能够自动处理安装过程中包的连带性,但是有时候也安装了一些不必要的程序到你的系统。
安装完成后第一件需要注意的事情是“查看你是否安装了bind-chroot这个包”这个程序的主要功能是:将DNS服务器在chroot模式下运行,在这种模式下运行的话,它会将所有和DNS相关的文件都锁定到/var/named/chroot目录下,就是说bind的访问范围仅仅定位于这个目录中,无法进一步提升到系统中的其它目录。这样可以提高系统的安全性。这样听起来很美,但是配置起来会出现许多的问题,建议不要使用。如果你使用了的话,所有配置修改需要到/var/named/chroot下,例如配置文件在/var/named/chroot/etc/named.conf
[root@master ~]#rpm –q bind-chroot
由于RedHat AS 5安装后默认的配置文件名称named.caching-nameserver.conf/etc/named. caching .zones组成。修改配置文件名称:
[root@master ~]#mv /etc/named.caching-nameserver.conf /etc/named.conf
[root@master ~]#mv /etc/named. caching .zones /etc/named. zones
修改主DNS服务器上的配置文件,修改结果如下:
[root@master~ ]# vi /etc/named.conf
//
// named.caching-nameserver.conf
省略若干注释
options {
        listen-on port 53 { 10.1.1.1; };
        listen-on-v6 port 53 { ::1; };
        directory       "/var/named";
        dump-file       "/var/named/data/cache_dump.db";
        statistics-file "/var/named/data/named_stats.txt";
        memstatistics-file "/var/named/data/named_mem_stats.txt";
        query-source    port 53;
        query-source-v6 port 53;
        allow-query     { any; };
};
include "/etc/named.zones";
[root@master ~]#
修改/etc/named.zones文件,添加相关字段创建正向区域,添加内容如下:
[root@master~]# vi /etc/named.zones
// named.rfc1912.zones:
省略若干注释和若干默认区域
zone "qiuri.com" IN {
        type master;
        file "qiuri.com";
        allow-transfer { 10.1.1.2; };
        allow-update { none; };
};
[root@master~]#
 
在/var/named创建相关区域文件qiuri.com内容如下所示:
[root@master~ ]# cat /var/named/qiuri.com
$TTL    86400
@       IN      SOA     master.qiuri.com. root.master.qiuri.com.  (
                                      2008111305 ; Serial
                                      28800      ; Refresh
                                      14400      ; Retry
                                      3600000    ; Expire
                                      86400 )    ; Minimum
        IN      NS      master.qiuri.com.
        IN      NS      slaves.qiuri.com.
www     IN      A       10.1.1.1
ftp     IN      A    3   10.1.1.1
 
[root@master~ ]#
由于是测试我这里就不建立许多的区域了,在辅助DNS上的配置几乎一样,只需要将named.conf配置文件中的listen-on port 53 中的IP地址字段修改为辅助DNS服务器即可。
[root@ slave~ ]# vi /etc/named.conf
//
// named.caching-nameserver.conf
省略若干注释
options {
        listen-on port 53 { 10.1.1.2; };
省略其它和主DNS服务器相同字段
        include "/etc/named.zones";
[root@ slave~ ]#
/etc/named.zones配置文件中将区域类型修改为slave,并指定主DNS服务器IP即可:
[root@ slave~]# vi /etc/named.zones
// named.rfc1912.zones:
省略若干字段。。。。。。
zone "qiuri.com" IN {
        type slave;
        file "slaves/qiuri.com";
        masters { 10.1.1.1; };
        allow-update { none; };
};
[root@ slave~]#
注意:修改每台DNS服务器自己为DNS服务器,相关配置文件为/etc/resolv.conf。
将所有配置完成后我们分别在主辅DNS上执行命令service named start启动服务。
   故障一:
DNS上使用ping命令测试,发现了第一个故障:启动服务过程中没有任何的错误提示,ping域名的时候却显示没有这个域名。
故障分析:通过ping域名的时候,我们得知没有这个域名的回应值,这表明这个区域没有生效,但是到底是什么原因导致区域没有生效呢?这个时候不要茫然,去看看日志吧!
[root@master~]# tail /var/log/messages
省略若干… …
Nov 21 20:55:57 localhost named[7113]: zone qiuri.com/IN: loading master file qiuri.com: permission denied
Nov 21 20:55:57 localhost named[7113]: zone localdomain/IN: loaded serial 42
Nov 21 20:55:57 localhost named[7113]: zone localhost/IN: loaded serial 42
Nov 21 20:55:57 localhost named[7113]: running
[root@master~]#
黎明前的黑暗终于度过,一行行的日志终于看完,发现在加载qiuri.com的时候出现了permission denied的提示,就是说加载文件时被拒绝了。为什么会拒绝呢?我们先查看一下这个文件的属性吧?
[root@master~]# ll /var/named/qiuri.com
-rw-r----- 1 root root 436 11-21 20:54 /var/named/qiuri.com
[root@master~]#
发现这个文件的所有者是root,属组也是root,但是由于DNS服务使用named这个用户启动服务,难怪会拒绝了呢。那修改一下吧!
[root@master~]#chown named.named /var/named/qiuri.com
修改完成后重启dns服务,使配置生效。
[root@master~]#service named restart
再次查看日志,发现已经成功加载。
[root@master~]# tail -5 /var/log/messages
省略若干... ...
Nov 21 21:11:46 localhost named[7217]: zone qiuri.com/IN: loaded serial 2008111305
Nov 21 21:11:46 localhost named[7217]: zone localdomain/IN: loaded serial 42
Nov 21 21:11:46 localhost named[7217]: zone localhost/IN: loaded serial 42
Nov 21 21:11:46 localhost named[7217]: running
[root@master~]#
总结:这个问题出现的原因是由于我们创建这个文件的时候,没有考虑文件权限,导致出现这个问题。如果有的朋友不是手工编辑的这个文件,而是直接复制/var/named/named.local这个文件后再修改的,建议复制过程中使用-p参数。这样就避免了cp后再修改权限的步骤。
接着迫不及待的去启动了辅助DNS的服务,之后去查看/var/named/slaves中是否存在qiuri.com这个区域文件。发现成功复制过来。
[root@ slave ]# ls /var/named/slaves/
qiuri.com
[root@ slave ]#
到这个时候我们的测试还没有结束,继续进行中,首先我们再次回到主DNS服务器上编辑qiuri.com区域文件,增加主机记录,修改serial值。
[root@master ]# cat /var/named/qiuri.com
$TTL    86400
@       IN      SOA     master.qiuri.com. root.master.qiuri.com.  (
                                      2008111306 ; Serial
                                      28800      ; Refresh
                                      14400      ; Retry
                                      3600000    ; Expire
                                      86400 )    ; Minimum
        IN      NS      master.qiuri.com.
        IN      NS      slaves.qiuri.com.
www     IN      A       10.1.1.1
ftp     IN      A       10.1.1.1
down    IN      A       10.1.1.1
[root@master~]#
修改完成后,使用service named reload重新加载配置文件,到辅助dns上验证我们添加的记录是否同步过来。但是再次失望了,故障又发生了。
故障二:
主DNS服务器修改记录或添加区域辅助DNS同步不过去,或者需要很长时间。这样如果在现实生活中,会造成各地访问的结果不同。我们有必要研究一下主DNS服务器上修改完成后如何快速的同步给其它辅助的DNS。
故障分析:
为了查清故障的原因,这个时候我分别在各个DNS服务器上开启两个终端,在第一个终端输入命令tail -f /var/log/messages动态监控日志;另一个终端中重启DNS服务。发现没有产生任何日志。这个时候,思考了一下主辅DNS的工作原理,每次主DNS修改完成后重启服务会传送notify值,但是这里却没有传送。再次回到配置文件中检查相关字段发现没有定义。这个字段可以在named.conf中options字段中声明。也可以在单个区域文件中声明。
这里在qiuri.com的zone中添加also-notify { 10.1.1.2; };值。
[root@master~]#
zone "qiuri.com" IN {
        type master;
        file "qiuri.com";
           notify yes;
        also-notify { 10.1.1.2; };
        allow-transfer { 10.1.1.2; };
        allow-update { none; };
};
[root@master~]#
注意:如果要在options中声明,可以使用notify yes;即可。
再次加载服务,发现监控的日志开始有相应的请求和发送的字段出现。主DNS服务器的日志如下:
[root@master ~]#tail -f /var/log/messages
Nov 13 16:17:38 master named[3159]: zone qiuri.com/IN: sending notifies (serial 2008111306)
Nov 13 16:18:57 master named[3159]: client 10.1.1.2#45757: transfer of 'qiuri.com/IN': AXFR-style IXFR started
Nov 13 16:18:57 master named[3159]: client 10.1.1.2#45757: transfer of 'qiuri.com/IN': AXFR-style IXFR ended
[root@master ~]#
辅助DNS服务器上日志显示如下:
[root@ slave~ ]#tail -f /var/log/messages
Nov 14 08:12:55 ns named[6014]: running
Nov 14 08:12:55 ns named[6014]: zone qiuri.com/IN: sending notifies (serial 2008111306)
Nov 14 08:15:10 ns named[6014]: client 10.1.1.1#1106: received notify for zone 'qiuri.com'
Nov 14 08:15:10 ns named[6014]: zone qiuri.com/IN: Transfer started.
[root@ slave~ ]#
这个时候问题解决,其实还有配置主辅DNS服务器的时候还会见到类似failed while receiving responses: REFUSED错误提示,一般是由于主DNS服务器上未授权或者是相关的目录没有权限造成。只要耐心查看日志和思考问题,相信问题均可解决。
相关原理:
在解决问题的过程中有的朋友说将SOA中的Refresh值修改小一点,没错!但是这个值什么时候生效呢?当我们主DNS服务器上修改完成后重启服务,会主动传送notify值,如果辅助DNS服务器没有收到才参考Refresh,Refresh 不成功,则参考Retry ,Retry 一直不成功, 则参考 Expire,如果Expire也不成功,则选择放弃zone transfer的过程。
5. 注意事项
A.从主DNS复制过来的区域文件存放目录的权限。
B.主配置文件named.conf的";"不能少。

named.conf 的理解
目录说明
/var/named/chroot/etc                          #存放named.conf
/var/named/chroot/var/named               #存放zone&arpa文件
/var/log/messages                                #查看配置过程中出错信息
[root@46 etc]# pwd
/var/named/chroot/etc
[root@46 etc]# cp -p named.caching-nameserver.conf named.conf #书上说找不到named.conf会自动启用named.caching-nameserver.conf,不过没试过
[root@46 etc]# ls
localtime  named.caching-nameserver.conf  named.conf  named.rfc1912.zones  rndc.key
[root@46 etc]# vi named.conf
//参照《linux 系统与网络服务管理技术大全》第11 章,注释有的是大力自己理解的,不一定正确。
//
// named.caching-nameserver.conf
//
// named.caching-nameserver.conf
//
// provided by red hat caching-nameserver package to configure the
// isc bind named(8) dns server as a caching only nameserver 
// (as a localhost dns resolver only). 
//
// see /usr/share/doc/bind*/sample/ for example named configuration files.
//
// do not edit this file - use system-config-bind or an editor
// to create named.conf - edits to this file will be lost on 
// caching-nameserver package upgrade.
//
options { //服务器的全局配置选项及一些默认设置
        listen-on port 53 { any; }; //监听端口,也可写为 { 127.0.0.1; 192.168.139.46; }
        listen-on-v6 port 53 { ::1; }; //对ip6支持
        directory       "/var/named";  //区域文件存储目录
        dump-file       "/var/named/data/cache_dump.db"; //dump cach的目录directory
        statistics-file "/var/named/data/named_stats.txt";
        memstatistics-file "/var/named/data/named_mem_stats.txt";
        pid-file        "/var/run/named/named.pid"; //存着named的pid
        forwarders     { 168.95.1.1; 139.175.10.20; }; // 如果域名服务器无法解析时,将请求交由168.95.1.1; 139.175.10.20来解析
        allow-query    { any; };   //指定允许进行查询的主机,当然是要所有的电脑都可以查啦
        allow-transfer { none; }; //指定允许接受区域传送请求的主机,说明白一点就是辅dns定义,比如辅dns的ip是192.168.139.5,那么可以这样定义{ 192.168.139.5; },要不然主辅dns不能同步,当然,{}里的也可以用下面提到的acl。
        // those options should be used carefully because they disable port
        // randomization
        // query-source    port 53;     
        // query-source-v6 port 53;
};
logging { //指定服务器日志记录的内容和日志信息来源
        channel default_debug {
                file "data/named.run";
                severity dynamic;
        };
};
// 这里定义一个acl列表
acl "acl1" {
        192.168.139.0/200; 192.168.1.0/200 
};
view localhost_resolver { //定义一个视图
        match-clients      { any; }; //查询者的源地址,any表示localhost_resolver视图对任何主机开放,如果写成{ acl1; },那么就只有acl1表里的ip可以递归查询了
        match-destinations { any; }; //查询者的目标地址,这里也可以写成{ localhost; acl1; }
        recursion yes;  //设置进行递归查询
        include "/etc/named.rfc1912.zones"; //包含文件,这里也就是载入/etc/named.rfc1912.zones
};
 
http://lsscto.blog.51cto.com/779396/158892
1      主辅DNS服务器同步原理
        主辅DNS服务器数据同步的过程,首先master DNS服务器每次修改完成并重启服务后,将传送notify给所有的slave DNS服务器。slave DNS服务器将查询master服务器的SOA记录,master DNS服务器收到请求后将SOA记录发送给Slave DNS服务器,Slave DNS服务器收到后同时对比查询结果中的serial值,如果serial值不大于本机的话将结束数据同步过程;但是如果serial值大于本机的话,slave DNS将发送zone transfer请求要求(AXFR/IXFR)。Master响应zone transfer请求并传送结果,直到整个slave更新完成。
 
 
2      主辅DNS服务器安装配置
        这里主服务器的IP为192.168.2.164,从服务器IP为192.168.2.163
        安装配置我前面文章已经配置过,这里就不安装配置了,我贴出相关的配置文件。
 
主服务器:
named.conf:
[root@localhost etc]# more named.conf 
// named.rfc1912.zones:
//
// Provided by Red Hat caching-nameserver package
//
// ISC BIND named zone configuration for zones recommended by
// RFC 1912 section 4.1 : localhost TLDs and address zones
//
// See /usr/share/doc/bind*/sample/ for example named configuration files.
//
options {
directory     "/var/named";
};
zone "." IN {
        type hint;
        file "named.ca";
};
zone "localdomain" IN {
        type master;
        file "localdomain.zone";
        allow-update { none; };
};
zone "localhost" IN {
        type master;
        file "localhost.zone";
        allow-update { none; };
};
zone "0.0.127.in-addr.arpa" IN {
        type master;
        file "named.local";
        allow-update { none; };
};
zone "0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa" IN {
        type master;
        file "named.ip6.local";
        allow-update { none; };
};
zone "255.in-addr.arpa" IN {
        type master;
        file "named.broadcast";
        allow-update { none; };
};
zone "0.in-addr.arpa" IN {
        type master;
        file "named.zero";
        allow-update { none; };
};
zone "2.168.192.in-addr.arpa" IN {
        type master;
        file "2.168.192.zone";
       allow-transfer { 192.168.2.163; };
        notify yes;
        also-notify{ 192.168.2.163;}
};
zone "test.com" IN {
        type master;
        file "test.com";
        allow-transfer { 192.168.2.163;};
        notify yes;
        also-notify{ 192.168.2.163;};
};
 
test.com:
[root@localhost named]# more test.com 
$TTL    86400
@ IN SOA ns.test.com.       root.test.com. (
                                        42              ; serial (d. adams)
                                        3H              ; refresh
                                        15M             ; retry
                                        1W              ; expiry
                                        1D )            ; minimum
                  IN NS           ns.test.com.
                  IN A            192.168.2.164
ns               IN A            192.168.2.164
www            IN A            192.168.2.164
 
2.168.192.zone:
[root@localhost named]# more .2.168.192.zone
$TTL    86400
2 .168.192.in-addr.arpa. IN  SOA  ns.test.com. root.localhost.  (
                                      1997022700 ; Serial
                                      28800      ; Refresh
                                      14400      ; Retry
                                      3600000    ; Expire
                                      86400 )    ; Minimum
@        IN      NS       ns.test.com.
8          IN      PTR     ns.test.com.
 
从服务器:
从服务器的安装很简单只需要配置named.conf文件即可,区域文件无须手动建立:
[root@localhost etc]# vi named.conf
// named.rfc1912.zones:
//
// Provided by Red Hat caching-nameserver package
//
// ISC BIND named zone configuration for zones recommended by
// RFC 1912 section 4.1 : localhost TLDs and address zones
//
// See /usr/share/doc/bind*/sample/ for example named configuration files.
//
options {
directory     "/var/named";
};
zone "." IN {
        type hint;
        file "named.ca";
};
zone "localdomain" IN {
        type master;
        file "localdomain.zone";
        allow-update { none; };
};
zone "localhost" IN {
        type master;
        file "localhost.zone";
        allow-update { none; };
};
zone "0.0.127.in-addr.arpa" IN {
        type master;
        file "named.local";
        allow-update { none; };
};
zone "0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa" IN {
        type master;
        file "named.ip6.local";
        allow-update { none; };
};
zone "255.in-addr.arpa" IN {
        type master;
        file "named.broadcast";
        allow-update { none; };
};
zone "0.in-addr.arpa" IN {
        type master;
        file "named.zero";
        allow-update { none; };
};
zone "2.168.192.in-addr.arpa" IN {
        type slave;
        file "slaveslave.zone";
        masters{192.168.2.164;};
};
zone "test.com" IN {
        type slave;
        file "slaves/test.salve";
  masters{192.168.2.164;};
};
 
上述配置后,分别启动主从的DNS服务器后,从服务器会在slaves/下生成test.salve区域文件,这样主从服务器即建好了。
 
3     故障排除
出现错误我们一般通过日志来排查故障:tail  /var/log/message
1>  发现从服务器未同步主服务器域信息,从日志中发现如下错误:
 zone test.com/IN: loading master file test.com: permission denied
这个错误一般是因为从服务器的区域文件的权限问题:
[root@localhost named] ll slaves/test.salve
-rw-r----- 1 root root 436 05-17 20:54 slaves/test.salve
     
从这里可以看出所有者和所有组都为root,而从主服务器传送区域文件是named用户,所以我们需要修改下文件权限:
[root@localhost named] chown  named.named  slaves/test.salve
[root@localhost named] service named restart
     这个问题出现的原因是由于我们创建这个文件的时候,没有考虑文件权限,导致出现这个问题。直接复制/var/named/named.local这个文件后再修改的,建议复制过程中使用-p参数。这样就避免了cp后再修改权限的步骤。
 
2>  主DNS服务器修改记录或添加区域辅助DNS同步不过去,或者需要很长时间。
       这样如果在现实生活中,会造成各地访问的结果不同。所以有必要研究一下主DNS服务器上修改完成后如何快速的同步给其它辅助的DNS。
       为了查清故障的原因,这个时候我分别在各个DNS服务器上开启两个终端,在第一个终端输入命令tail -f /var/log/messages动态监控日志;另一个终端中重启DNS服务。发现没有产生任何日志。这个时候,思考了一下主辅DNS的工作原理,每次主DNS修改完成后重启服务会传送notify值,但是这里却没有传送。再次回到配置文件中检查相关字段发现没有定义。这个字段可以在named.conf中options字段中声明。也可以在单个区域文件中声明。
       notify yes;
        also-notify{ 192.168.2.163;}
 
3>  主服务器更新区域文件后从服务器并能更新,但依旧无法解析
       主服务器上更新区域后,但是从服务器却没有更新,但是删除从服务器上区域文件后,重新启动服务器才行,说明丛服务器是可以更新区域文件过来的,但是为什么却无法解析呢?查看日志:
 client 192.168.2.164#53319: received notify for zone '2.168.192.in-addr.arpa'
May 15 18:30:37 localhost named[15926]: zone 2.168.192.in-addr.arpa/IN: notify from 192.168.2.164#53319: zone is up to date
May 15 18:30:38 localhost named[15926]: client 192.168.2.164#53319: received notify for zone 'test.com'
May 15 18:30:38 localhost named[15926]: zone test.com/IN: notify from 192.168.2.164#53319: zone is up to date
从日志可以看出,更新是可以的,但是每次更新却提示说zone是最新的,但是我明明是修改过区域文件的啊,所以这里需要了解下更新传输的过程,Slave DNS服务器是在对比查询结果中的serial值,如果serial值不大于本机的话将结束数据同步过程,
Serial﹕其格式通常會是“年月日+修改次序”     所以在更新区域文件请同时修改Serial,我们修改后,再查日志:
May 15 18:46:04 localhost named[4820]: client 192.168.2.163#47796: transfer of 'test.com/IN': AXFR-style IXFR started
May 15 18:46:04 localhost named[4820]: client 192.168.2.163#47796: transfer of 'test.com/IN': AXFR-style IXFR ended
      
         在解决问题的过程中有的朋友说将SOA中的Refresh值修改小一点,没错!但是这个值什么时候生效呢?当我们主DNS服务器上修改完成后重启服务,会主动传送notify值,如果辅助DNS服务器没有收到才参考Refresh,Refresh 不成功,则参考Retry ,Retry 一直不成功, 则参考 Expire,如果Expire也不成功,则选择放弃zone transfer的过程。
 

本文出自 “流星 ” 博客,请务必保留此出处http://lsscto.blog.51cto.com/779396/158892

 

 

 

http://wubinary.blog.51cto.com/8570032/1376390

一、bind简介

   Linux中通常使用bind来实现DNS服务器的架设,bind软件由isc(www.isc.org)维护。在yum仓库中可以找到软件,配置好yum源,直接使用命令yum install bind就可以安装。当前bind的稳定版本为bind9,bind的服务名称为named,监听的端口为53号端口。bind的主要配置文件为/etc/named.conf,此文件主要用于配置区域,并指定区域数据库文件名称。区域数据库文件通常保存于/var/named/目录下,用于定义区域的资源类型。

 

二、使用bind架设DNS服务器

实例操作:以域名wubinary.com为例配置一个DNS服务器,实现正向解析与反向解析。

 

1、使用setup命令配置DNS服务器的IP地址,我们以192.168.0.70这个IP地址为例,在本地架设一个DNS服务器。

wKiom1MhK6Tw2HWjAAEbY8_qch8244.jpg

 

2、bind配置文件为/etc/named.conf,此文件用于定义区域。每个区域的数据文件保存在/var/named目录下。

named.conf各参数项说明:

 

1
2
3
4
5
6
7
8
9
options {
//全局选项
}
zone "ZONE name"{
//定义区域
}
logging{
//定义日志系统
}

 

 

named.conf文件内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
options {
    listen-on port 53 { 127.0.0.1; }; #定义监听端口及IP地址
    listen-on-v6 port 53 { ::1; }; #定义监听的IPv6地址
    directory   "/var/named"#全局目录
    dump-file   "/var/named/data/cache_dump.db";
        statistics-file "/var/named/data/named_stats.txt";
        memstatistics-file "/var/named/data/named_mem_stats.txt";
    allow-query     { localhost; };#允许查询的IP地址
    recursion yes#是否允许递归查询
    dnssec-enable yes;
    dnssec-validation yes;
    dnssec-lookaside auto;
    /* Path to ISC DLV key */
    bindkeys-file "/etc/named.iscdlv.key";
    managed-keys-directory "/var/named/dynamic";
};
logging {
        channel default_debug {
                file "data/named.run";
                severity dynamic;
        };
};
zone "." IN {
    type hint;
    file "named.ca";
};
include "/etc/named.rfc1912.zones";
include "/etc/named.root.key";

注意:bind的配置文件/etc/named.conf里必须要定义的三个区域是:根、127.0.0.1和127.0.0.1的反解。

以上options选项中有许多是我们用不到,我们先把它们注释掉。结果如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
options {
//  listen-on port 53 { 127.0.0.1; };
//  listen-on-v6 port 53 { ::1; };
    directory   "/var/named";
    dump-file   "/var/named/data/cache_dump.db";
    statistics-file "/var/named/data/named_stats.txt";
    memstatistics-file "/var/named/data/named_mem_stats.txt";
//  allow-query     { localhost; };
//  recursion yes;
//  dnssec-enable yes;
//  dnssec-validation yes;
//  dnssec-lookaside auto;
    /* Path to ISC DLV key */
//  bindkeys-file "/etc/named.iscdlv.key";
//  managed-keys-directory "/var/named/dynamic";
};

 

3、打开/etc/named.rfc1912.zones文件,添加一个区域。

wKiom1MhoOXRXddjAABW4Lo8ADY328.jpg

type: 用于定义区域类型,此时只有一个DNS服务器,所以为master,type可选值为:hint(根的)|master(主的)|slave(辅助的)|forward(转发)

file:用于定义区域数据文件路径,默认该文件保存在/var/named/目录。

区域添加好后,使用命令:named-checkconf 或 service named configtest测试配置文件语法格式。

wKioL1MhpBziRlrDAABgaEdyQkw314.jpg

出错了!原来少了一个分号,配置文件的格式是每行后面都必须加分号结束,并且有花括号的地方,花括号两边必须要有空格。

 

wKioL1MhpLviJaXMAAA6rOO9Lrc905.jpg

没有提示则表示文件语法正常。

 

4、新建数据库文件/var/named/wubinary.com.zone,并添加资源记录。

1
2
3
资源记录的格式:
         name        [ttl]      IN      RRtype      Value
        资源记录名  有效时间    IN       类型    资源记录的值

 

1
2
3
SOA: 只能有一个,而且必须是第一个
         name: 只能是区域名称,通常可以简写为@
         value: 主DNS服务器的FQDN
1
2
3
NS: 可以有多条
         name: 区域名称,通常可以简写为@
         value: DNS服务器的FQDN(可以使用相对名称)
1
2
3
A: 只能定义在正向区域文件中
         name: FQDN(可以使用相对名称)
         value: IP
1
2
3
4
MX: 可以有多个
        name: 区域名称,用于标识smtp服务器
        value: 包含优先级和FQDN
                    优先级:0-99,数字越小,级别越高;
1
2
3
CNAME:
          name: FQDN
          value: FQDN

 

1
2
3
PTR: IP --> FQDN, 只能定义在反向区域数据文件中,反向区域名称为逆向网络地址加.in-addr.arpa.后缀组成
        name: IP, 逆向的主机地址,主机地址反过来写加上.in-addr.arpa.
        value: FQDN

wKiom1MibDbhZKddAADj-E2v8hg789.jpg

$TTL为定义的宏,表示下面资源记录ttl的值都为600秒。

@符号可代表区域文件/etc/named.conf里面定义的区域名称,即:"wubinary.com."。

每个区域的资源记录第一条必须是SOA,SOA后面接DNS服务器的域名和电子邮箱地址,此处电子邮箱地址里的@因为有特殊用途,所以此处要用点号代替。SOA后面小括号里的各值所代表的意义如下所示:

1
2
3
4
5
6
@   IN  SOA dns.wubinary.com dnsadmin.wubinary.com (
    2014031201 ;标识序列号,十进制数字,不能超过10位,通常使用日期
    2H ;刷新时间,即每隔多久到主服务器检查一次,此处为2小时
    4M ;重试时间,应该小于刷新时间,此处为4分钟
    1D ;过期时间,此处为1
    2D ;主服务器挂后,从服务器至多工作的时间,此处为2天)

区域数据文件配置好后,可以使用命令named-checkzone检查语法错误。

命令格式:

1
named-checkzone "zone_name" zone_file_name

 

wKiom1MhrRbxPX5bAAB1NYPSWeQ386.jpg

 

5、两个文件都配置好后,记得查看一下文件的所属组。因为bind程序的服务名称为named,bind默认是使用named组的身份操作文件,所以我们新建的文件所属组都要改为named,并且为了安全起见不能让别人有修改的权限,权限最好改为640。

wKiom1MhrlaTuQcTAADhrvFXTrk034.jpg

 

6、设置妥当当后我们就可以开启服务了。

wKioL1MhrqqBSYafAABlHfQch9Y353.jpg

 

7、使用dig命令测试DNS。

命令格式:

1
dig [-t type] [-x addr] [name] [@server]

-t: 指定资源类型,用于正解

-x: 指定IP地址,用于反解

 

wKioL1Mhrzzg-7wbAALAthGQJCs025.jpg

测试成功!

 

8、以上配置的是DNS服务器的正向解析,接着再配置一下反向解析。编辑配置文件/etc/named.rfc1912.zones,添加一个反解区域。

wKiom1MhtvKTGGS5AABlUmR3vpE311.jpg

 

因为反向解是和正向解析相反的,所以配置文件192.168.0.70.zone直接可以复制wubinary.com.zone修改。反向解析数据文件里面只有SOA、NS、PTR资源记录,所有A记录都要改为PTR记录,名称为IP地址,IP地址可以写全也可以简写,如果写全则是IP地址反写加上.in-addr.arpa.例如:70.0.168.192.in-addr.arpa. PTR资源记录的值为域名。

wKiom1MhuJ6zfXZKAADKbiLgAj8147.jpg

 

9、检查配置文件语法。

wKioL1MhuUnB1WuQAADSyFro1sg754.jpg

 

修改权限

wKioL1MhuY7QFhA3AACKuo6tvHI097.jpg

 

10、重新载入配置文件,并测试反向解析。

wKioL1MhuevDXAr_AABW69LugbQ320.jpg

 

使用dig -x 测试反向解析。

wKioL1MhulXzxrX4AALMMIdnwTM862.jpg

 

反向解析配置成功!

注意:通常在应用中,DNS的反向解析并不是很重要,可以不配置,当服务器中有域名作为邮件服务器时,此时可以配置反向解析,因为邮件中过滤垃圾邮件的技术通常是解析邮箱地址,如果IP地址不能反解成一个域名则视为垃圾邮件。

 

三、使用bind架设辅助DNS服务器,实现主从数据同步

   DNS从服务器也叫辅服DNS服务器,如果网络上某个节点只有一台DNS服务器的话,首先服务器的抗压能力是有限的,当压力达到一定的程度,服务器就会宕机罢工,其次如果这台服务器出现了硬件故障那么服务器管理的区域的域名将无法访问。为了解决这些问题,最好的办法就是使用多个DNS服务器同时工作,并实现数据的同步,这样两台服务器就都可以实现域名解析操作。

   主DNS服务器架设好后,辅助的DNS服务器的架设就相对简单多了。架设主从DNS服务器有两个前提条件,一是两台主机可以不一定处在同一网段,但是两台主机之间必须要实现网络通信;二,辅助DNS服务器必须要有主DNS服务器的授权,才可以正常操作。此时,我们以IP地址192.168.0.80作为我们辅助的DNS服务器的IP地址;

1、设置IP地址;

wKiom1MhwEHTmJ2RAAEJU20xoJE039.jpg

 

2、打开辅助DNS服务器的/etc/named.rfc1912.zones文件,添加两个区域记录,这两个记录是主DNS服务器配置文件里已经存在的记录,一个是正向解析记录,一个是反向解析记录。

wKiom1MhxcuyEk8OAADbHcz0azY904.jpg

type: slave,表示此时DNS服务器为辅助DNS服务器,于是下面一行就要定义主DNS服务器的IP地址,辅助DNS服务器才知道去哪里同步数据。辅助DNS服务器的资源类型数据文件通常保存在slaves目录,只需定义一个名称,文件内容通常是自动生成。

配置好后,直接开启DNS服务,然后再回到主DNS服务器上。

 

3、修改主DNS服务器的数据文件,添加一条辅助DNS服务器记录,给辅助DNS服务器授权。

修改正向解析文件/var/named/wubinary.com.zone。

wKioL1MibIyCvM4OAAEKLvDDY9I387.jpg

添加了一条NS记录,值为,ns2.wubinary.com.,对应的A记录也要增加一条,把IP地址指向对应的辅助DNS服务器的IP地址。修改完成后,记得要把序列号的值加1,用于通知辅助DNS服务器自动更新数据文件。

 

修改反向解析文件/var/named/192.168.0.70.zone。

wKiom1MhxJSjpfBDAAEJKuymzok519.jpg

同样的也增加了两条记录,一条辅助DNS服务器的NS记录和对应的PTR记录。修改完成后记得所序列号的值加1,用于通知辅助DNS服务器自动更新数据文件。

 

4、重新加载主DNS服务器的配置文件,这时再到回辅助DNS服务器,在/var/named/slaves/目录下会多了两个文件。

wKioL1MicCeSfVWZAABbAbnRv7w986.jpg

 

查看文件内容,可以看到该文件和主DNS服务器上的文件内容是一样的。

wKiom1MicXuBJ4UPAAIFeZJY_Bc444.jpg

 

wKioL1MicWKg6KvjAAHT6shTY_Y949.jpg

 

5、测试辅助DNS服务器。

wKioL1MiceORwrbiAAMRSAwgBlE719.jpg

 

wKiom1MichXiCUcuAAM34GOgPm4141.jpg

 

在辅助DNS服务器上正向解析和反向解析都能测试成功!

 

四、主从同步数据的安全性

   DNS服务器的数据同步默认是没有限定主机的,也就是说,网络上只要有一台DNS服务器向你的DNS服务器请求数据,都能实现数据同步,那么这样就相当的不安全了。我们可以使用一个选项allow-transfer,指定可以同步数据的主机IP。主DNS服务器的数据可以给别的服务器同步,相对的,辅助DNS服务器的数据也是可以给其它辅助DNS服务器同步,于是,所有的主从DNS服务器都要设置该参数。

 

1、指定可以从主DNS服务器上同步数据的主机。

修改/etc/named.rfc1912.zones文件:

wKioL1MidHiA318MAAD2Yf-wgA4538.jpg

在每块区域上添加参数allow-transfer,花括号内填写可以同步的主机IP,一般填写辅助DNS服务器的IP地址。可以使用dig命令测试,区域同步:

1
dig -t axfr ZONE_NAME @DNS_SERVCER_IP

 

wKioL1MidXGBxazoAANaus8FrkI351.jpg

指定IP可以同步数据。

 

wKioL1MidYrRC02cAACt55kEn3c155.jpg

非指定IP不可以同步数据。

 

2、指定可以从辅助DNS服务器上同步数据的主机。

修改/etc/named.rfc1912.zones文件:

wKioL1MidfvxVfTDAAEPadV8Pjg491.jpg

我们只有一台辅助DNS服务器,所以根本不会有主机从这台机器同步数据,所以我们设置成不允许任何人同步。

 

五、测试DNS解析的其它命令

   测试DNS解析的命令不只是dig可以实现,还有两个命令也可以实现相同的效果。

1、host命令

host命令格式:

1
# host [-t type] {name} [server]

 

wKiom1MiduaTyZdJAABl1tINhTE881.jpg

 

2、nslookup命令

这个命令很神奇,在windows的dos里面也可以使用:

1
2
3
4
nslookup>
    server DNS_SERVER_IP
    set q=TYPE
    {name}

 

wKiom1Mid2Kh6zIbAADufII1MeQ300.jpg

 

 

http://blog.csdn.net/huithe/article/details/5767632

Master 配置 好了测试也正常了   

 

 

Slave 第一次也能生成 Zone 正反向文件 .但就是奇怪.

 

在  Master 端修改了加大了 Serial number ,但   Slave 就是不同步.

 

最后才发现原来是这个问题:

 

 

[c-sharp] view plaincopy
 
  1. zone "mydomain.com" {   
  2.         type master;   
  3.         file "mydomain.com.zone";   
  4.         notify yes;   
  5.         allow-transfer { slave_servers; };   
  6.         also-notify { slave_servers; };   
  7. };[/code:1:11bf6b342c]   
  8.   
  9. 6.2.14.1   
  10. notify   
  11. If yes (the default), DNS NOTIFY messages are sent when a zone the server is authoritative for   
  12. changes, see Section 3.3. The messages are sent to the servers listed in the zone’s NS records   
  13. (except the master server identified in the SOA MNAME field), and to any servers listed in the   
  14. also-notify option.   
  15. If explicit, notifies are sent only to servers explicitly listed using also-notify. If no, no notifies   
  16. are sent.   
  17. The notify option may also be specified in the zone statement, in which case it overrides the options   
  18. notify statement. It would only be necessary to turn off this option if it caused slaves to crash.   
  19.   
  20. 6.2.14.6   
  21. also-notify   
  22. Defines a global list of IP addresses of name servers that are also sent NOTIFY messages whenever   
  23. a fresh copy of the zone is loaded, in addition to the servers listed in the zone’s NS records. This   
  24. helps to ensure that copies of the zones will quickly converge on stealth servers. If an also-notify   
  25. list is given in a zone statement, it will override the options also-notify statement. When a zone   
  26. notify statement is set to no, the IP addresses in the global also-notify list will not be sent NOTIFY   
  27. messages for that zone. The default is the empty list (no global notification list).   
  28.   
  29. 使用notify指令会自动通知所有这个域的所有在ns记录上的机器,also-notify指令可以用来通知所有不在ns记录上的dns服务器。   
  30. 还是好好看文档吧,里面还有很多有趣的功能呢。  

 

 

 

 

最后修改了下Master 的 Zone 文件

 

 

[c-sharp] view plaincopy
 
  1. [root@ye810 /]# vi /var/named/named.baidu.com  
  2. $TTL 3600  
  3. @ IN SOA baidu.com. huithe.163.com. (  
  4.         445 ; Serial  
  5.         28800 ; Refresh  
  6.         14400 ; Retry  
  7.         3600000 ; Expire  
  8.         86400 ) ; Minimum  
  9. @ IN NS linux.baidu.com.;         
  10. @ IN NS window.baidu.com.;  
  11. linux IN A 192.168.1.200;  
  12. window IN A 192.168.1.201;  
  13.   
  14. yehuiming IN A 111.111.111.111;  
  15. mytxt IN TXT "fuck you";  
  16. wenwen IN CNAME yehuiming;  
  17. love IN CNAME yehuiming;  
  18. xxoo IN CNAME yehuiming;  
  19. ooo IN CNAME yehuiming;  
  20. yindang IN CNAME yehuiming;  
  21. 51 IN CNAME yehuiming;  
  22. 56 IN CNAME linux;  
  23. 55 IN CNAME window;  

 

 

添加了 Master 和  Slave 的 NS 记录..  为啥要ns记录.看上上面的官方解释

 

 

http://linuxfun.me/?p=1094

在上一篇智能DNS的设定,已经能实现智能解析,但一台始终是不安全的,所以做了一个主从。当然主的服务器也做了一些修改,具体如下啦。假设你有两个view:liantong和dianxin,你修改了liantong的sheriy.com的view,现在/etc/int.d/named reload lt.sheriy.com ,这是会遇到以下问题:

1.从服务器不知道该更新哪个一个view,是电信还是联通呢?

2.假设从服务器按照SOA的refresh值去查主从的serial值 这时候该查主服务哪个view哪个值呢?

3.修改了主服务器记录之后 ,reload是哪一个view下面的值呢?

有问题肯定就有解决办法,还记得TSIG key 么?为什么它可以用来简化 view 的设置呢?

因为一旦使用 TSIG ,则两台 server 之间的通信都会用指定的 key 进行标识;通信双方必须具有一样的 key ,如果 key 不一致,则另一方会拒绝请求。

是否可以从这点推广到 view 的配置呢?

答案是可以的。

先介绍一下环境:

主服务器:公网IP:58.40.26.21;私网IP:192.168.1.2

从服务器:公网IP:22.26.14.163;私网IP:192.168.1.3

下面以具体的配置为例说明 :(注意,只列出部分语句而已 !!)

主服务器方面:

view “view_liantong” //定义一个名字叫view_liantong的视图
{
match-clients { key liantong-key;LT; };//匹配那些用liantong-key加密的请求和联通的IP,这个设置在上个博客有说明
recursion no;// 禁止处理来自 liantong 的主机的递归请求
allow-transfer {key liantong-key;};// 只允许用 liantong-key 加密过的 zone transfer 请求
server 192.168.1.3 {keys liantong-key;}; // 向从服务器发送消息时,用 liantong-key 加密

zone “.” IN {
type hint;
file “named.ca”;
};

zone “localhost” IN {
type master;
file “localhost.zone”;
allow-update { none; };
};

zone “0.0.127.in-addr.arpa” IN {
type master;
file “named.local”;
allow-update { none; };
};

zone “sheriy.com” {
type master;
file “184/lt.sheriy.com.db”;
also-notify { 192.168.1.3; };
notify YES;
};

};
};
view “view_dianxin”//定义一个名字叫view_dianxin的视图
{
match-clients { key dianxin-key ;DX; };//匹配那些用dianxin-key加密的请求和联通的IP,这个设置在上个博客有说明
recursion no;//禁止处理来自 liantong 的主机的递归请求
allow-transfer {key dianxin-key;};//只允许用 liantong-key 加密过的 zone transfer 请求
server 192.168.1.3 {keys dianxin-key;}; // 向从服务器发送消息时,用 dianxin-key 加密
zone “.” IN {
type hint;
file “named.ca”;
};

zone “localhost” IN {
type master;
file “localhost.zone”;
allow-update { none; };
};

zone “0.0.127.in-addr.arpa” IN {
type master;
file “named.local”;
allow-update { none; };
};

zone “sheriy.com” {
type master;
file “184/dx.sheriy.com.db”;
also-notify { 192.168.1.3; };
notify YES;
};

};

从服务器方面:

view “view_liantong”//定义一个名字叫view_liantong的视图
{
match-clients { key liantong-key ;LT; };//匹配那些用liantong-key加密的请求和联通的IP,这个设置在上个博客有说明
#allow-transfer {key liantong-key;};
recursion no;// 禁止处理来自 liantong 的主机的递归请求
allow-transfer {none;}; // 禁止任何人向从服务器请求 zone transfer
server 192.168.1.2 {keys liantong-key;}; // 向主服务器发送消息时,用liantong-key 加密
zone “.” IN {
type hint;
file “named.ca”;
};

zone “sheriy.com” {
type slave;
file “184/lt.sheriy.com.db”;
masters { 192.168.1.2;};

};

};
###############################This is for Dianxin’s IPS#######################################################
view “view_dianxin”
{
match-clients { key dianxin-key ;DX; };
#allow-transfer {key dianxin-key;};
recursion no;// 禁止处理来自 dianxin 的主机的递归请求
allow-transfer {none;}; // 禁止任何人向从服务器请求 zone transfer
server 192.168.1.2 {keys dianxin-key;}; // 向主服务器发送消息时,用 dianxin-key 加密
zone “.” IN {
type hint;
file “named.ca”;
};

# zone “localhost” IN {
# type slave;
# file “localhost.zone”;
# allow-update { none; };
# };

# zone “0.0.127.in-addr.arpa” IN {
# type slave;
# file “named.local”;
# allow-update { none; };
# };

zone “sheriy.com” {
type slave;
file “184/dx.sheriy.com.db”;
masters { 192.168.1.2;};

};

};

过程分解:

1.修改了dianxin视图中的sheriy.com解析的zone,正确的reload方法是:/etc/init.d/named reload dx.sheriy.com.db IN view_dianxin,记得后面加上IN view_dianxin

2)主服务器将向从服务器发送一个 notify 消息,这个消息是用 dianxin-key 标识过的。

(主–>从 notify)

3.当从服务器收到这个 notify 消息时,会根据消息尾部的 TSIG 部分找出 key 的名称 :dianxin-key 。

4.从服务器对比每个 view 的 match-clients ,发现匹配 view_dianxin 这个 view 的设定 

5.从服务器返回一个 notify response 消息,根据 view-dianxin  的 server 语句,用 dianxin-key 加密并发给主服务器。

    (从→主 :notify response.)

6.接着从服务器就会启动 soa query,同样该 query 也是用 dianxin-key 加密的。(从→主 :soa query)

7.主服务器收到这个 soa query 后,发现是用 dianxin-key加密的 ,返回 view_dianxin 的 dx.sheriy.com. SOA 记录,
并用 dianxin-key 进行表示(主→从 :soa query response.)

8.从服务器在收到来自主服务器的 response 后,和它自己 view_dianxin的 dx.sheriy.com zone 的 serial 比较,发现的确是
增大了

9.从服务器向主服务器发送 tcp 消息,请求 zone transfer (从→主 :zone transfer 请求)

10.主服务器检查 view_dianxin 的 allow-transfer ,发现该请求是以 dianxin-key 加密的,则允许进行 zone transfer 

11.主服务器返回 view_dianxin 的 sheriy.com 这个 zone 的数据(来自文件 dx.sheriy.com.db.

      (主→从 :zone transfer 开始)

12.zone transfer 完成,主从服务器关闭 TCP  连接 (zone transfer 完成.)

需要注意的:

1.两台服务器key要一样

2.两台服务器时间要一致,超过5分钟误差就无法同步了
参考:http://www.chinaunix.net/jh/16/870609.html

 

 

http://www.haiyun.me/archives/bind-intelligen-dns.html

BIND可根据请求查询的源IP分配到不同的域规则,即智能DNS服务器
下载运营商IP地址库,定义ACL,由于条目太多,可分别存为独立文件调用。
示例主DNS为:1.1.1.1,从DNS为2.2.2.2。

1
2
3
4
acl liantong{
    112.96.0.0/15;
};

生成key,用于同步时验证并解决不能全部同步的问题,

1
2
3
dnssec-keygen -a hmac-md5 -b 128 -n HOST one
dnssec-keygen -a hmac-md5 -b 128 -n HOST two
dnssec-keygen -a hmac-md5 -b 128 -n HOST three

主DNS配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
key one
{
       algorithm hmac-md5;
       secret "hxCQkylFHbhzbPYo+CRWLA==";
};
key two
{
       algorithm hmac-md5;
       secret "T4Gf+E0+3Y+5uL3ylkQBSA==";
};
 
key three
{
       algorithm hmac-md5;
       secret "8q22D8M1c9QQKJLteC2bQQ==";
};
view "dianxin" {
server  2.2.2.2 {
        keys { one; };
};
match-clients { dianxin; key one; !key two; !key three};
zone "." IN {
        type hint;
        file "named.ca";
};
zone "www.haiyun.me" IN {
        type master;
        file "dianxin.www.haiyun.me";
        allow-query { any; };
        notify yes;
        allow-transfer { key one; };
        };
};
 
view "liantong" {
server  2.2.2.2 {
        keys { two; };
};
match-clients { liantong; key two; !key one; !key three; };
zone "." IN {
        type hint;
        file "named.ca";
};
zone "www.haiyun.me" IN {
        type master;
        file "liantong.www.haiyun.me";
        allow-query { any; };
        notify yes;
        allow-transfer { key two; };
        };
};
 
view "other" {
server  2.2.2.2 {
        keys { three; };
};
match-clients { any; key three; !key one; !key two; };
zone "." IN {
        type hint;
        file "named.ca";
};
zone "www.haiyun.me" IN {
        type master;
        file "other.www.haiyun.me";
        allow-query { any; };
        notify yes;
        allow-transfer { key three; };
        };
};
include "/var/named/dianxin.acl";
include "/var/named/liantong.acl";

从DNS配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
key one
{
       algorithm hmac-md5;
       secret "hxCQkylFHbhzbPYo+CRWLA==";
};
key two
{
       algorithm hmac-md5;
       secret "T4Gf+E0+3Y+5uL3ylkQBSA==";
};
 
key three
{
       algorithm hmac-md5;
       secret "8q22D8M1c9QQKJLteC2bQQ==";
};
view "dianxin" {
server  1.1.1.1 {
        keys { one; };
};
match-clients { dianxin; key one; !key two; !key three; };
zone "." IN {
        type hint;
        file "named.ca";
};
zone "www.haiyun.me" IN {
        type master;
        file "dianxin.www.haiyun.me";
        allow-query { any; };
        masters {1.1.1.1;};
        };
};
 
view "liantong" {
server  1.1.1.1 {
        keys { two; };
};
match-clients { liantong; key two; !key one; !key three; };
zone "." IN {
        type hint;
        file "named.ca";
};
zone "www.haiyun.me" IN {
        type master;
        file "liantong.www.haiyun.me";
        allow-query { any; };
        masters {1.1.1.1;};
        };
};
 
view "other" {
server  1.1.1.1 {
        keys { three; };
};
match-clients { any; key three; !key one; !key two; };
zone "." IN {
        type hint;
        file "named.ca";
};
zone "www.haiyun.me" IN {
        type master;
        file "other.www.haiyun.me";
        allow-query { any; };
        masters {1.1.1.1;};
        };
};
include "/var/named/dianxin.acl";
include "/var/named/liantong.acl";

定义多个域规则,分别转向不同的IP:

1
2
3
4
5
6
7
8
9
10
$TTL 600
@                       IN SOA   ns1.www.haiyun.me. domain.mail.www.haiyun.me. (
                        2012070401;
                        3H;
                        10M;
                        1W;
                        1H );
@   IN  NS  ns1.www.haiyun.me.
ns1     IN  A   184.164.141.188
www     IN  A   184.164.141.188
 
 
 
 
 
 
 
http://www.edu.cn/wgjq_8179/20091022/t20091022_414762.shtml
为了保证更好地进行域名解析服务,一般在网络中设置主、从两台DNS服务器。由于当前各ISP间的桥接存在带宽瓶颈,为了使不同ISP的用户快速访问高校内部网站,很多学校在配置域名服务器时都采用了BIND 9的VIEW功能。其实现原理如下:对于发出域名解析请求的不同源IP地址,针对同一域名解析到不同的目的IP地址,即用户通过最短路径到达欲访问的网站。举例来说,对于校内同一台服务器,教育网用户发出的访问请求解析到的域名IP地址是位于教育网上的服务器地址,网通用户解析到的域名IP地址是网通上的服务器地址,这样使用户能够访问到最快的服务器。

  主域名服务器使用的VIEW分界,按照不同查询来源地址来回应不同的答案,这对于一般的查询工作是非常高效的。但是当从服务器进行SOA查询或者做Transfer时,如果主服务器看到客户端请求,只能回应该客户端所在的VIEW,而不能顺利完成其他VIEW的同步。保证主从域名服务器的数据同步,就是为域名服务正常工作提供保障。因此,如何保证域名系统的主从服务器的数据同步性,就显得极为重要。本文分别利用BIND 9的TRANSFER-SOURCE功能和TSIGKEY功能,阐述了这一问题的两种不同的解决方案。

  触发同步的过程

  首先介绍主从服务器的同步过程。触发同步过程的原因有4种:1.从域名服务器刚刚启动;2.主域名服务器的Serial值增大;3.执行了rndc reload命令;4.到了主从服务器的同步更新时间。

  主从域名服务器开始同步(见图1):

  1. 主服务器向从服务器发送notify消息

  2. 从服务器收到主服务器发送notify消息,向主服务器返回一个notify response消息。

  3. 从服务器向主服务器发送SOA query消息。

  4. 主服务器向从服务器返回SOA response消息。

  5. 从服务器收到SOA response消息后,比对自身的Serial值,如果发现主服务器的Serial值大于自身的Serial值,那么就发送Zone transfer request消息。

  6. 主服务器返回Zone transfer response消息。

  7. 主服务器执行Zone transfer。

  两种主从服务器的数据同步法

  根据主从服务器的同步步骤,要解决域名服务器的同步问题,主要问题是如何标识主服务器的notify消息,即notify消息隶属于哪个VIEW、从服务器如何识别notify消息。同样,notify response消息、SOA query、SOA response消息、Zone transfer request消息、Zone transfer response消息、Zone transfer的数据也存在类似的问题。Bind 9提供了两种标识此类信息的方法:1.利用TRANSFER-SOURCE功能,从服务器需要设置和VIEW一一对应的IP地址;2.利用TSIGKEY功能对消息进行加密。

  利用TRANSFER-SOURCE功能

  环境假定:授权domain是test.lcu.edu.cn;

  主DNS的IP地址是210.44.112.66(DNS包含Internet和Cernet两个VIEW);

  从DNS的IP地址是210.44.112.67(对应Cernet View)和210.44.112.68(对应Internet View)。

  1. 对主DNS的配置

  include “/etc/cernet.cfg”; //指定教育网地址文件,可以根据自己的配置来进行灵活配置。

  view “cernet” { //定义了一个Cernet view

  match-clients {!210.44.112.68;cernet; }; //cernet是cernet.cfg定义的教育网ACL

  zone "." IN {

  type hint;

  file "named.root";

  };

  zone “test.lcu.edu.cn” {

  type master;

  file “cernet.zone” ;

  allow-transfer { 210.44.112.67; };//使用210.44.112.67作Cernet zone transfer

  };

  };

  view "internet" {

   match-clients {!210.44.112.67; any; };

   recursion no;

  zone "." IN {

  type hint;

  file "named.root";

  };

  zone "test.lcu.edu.cn" IN {

  type master;

  file "internet.zone";

  allow-transfer { 210.44.112.68; }; //使用210.44.112.68作Internet zone transfer

  };

  };

  2.对从服务器的配置

  include “/etc/cernet.cfg”; //指定教育网地址文件,可以根据自己的配置来进行灵活配置。

  view “cernet” {

  match-clients {cernet; }; //cernet是cernet.cfg定义的教育网ACL

  zone "." IN {

  type hint;

  file "named.root";

  };

  zone “test.lcu.edu.cn” {

  type slave;

  file “slave.cernet.zone” ;

  masters { 210.44.112.66; };

  allow-source { 210.44.112.67; };//和主DNS配置对应

  };

  };

  view "internet" {

  match-clients {any; };

  recursion no;

  zone "." IN {

  type hint;

  file "named.root";

  };

  zone "test.lcu.edu.cn" IN {

  type slave;

  file "slave.internet.zone";

  masters { 210.44.112.66; };

  allow-source { 210.44.112.68; }; //和主DNS配置对应

  };

  };

  3.配置分析

  在主服务器端配置VIEW中的match-client和allow-transfer标示信息,在从服务器端配置VIEW中的masters和allow-source标识信息,这样做可以解决主从服务器同步问题。

  利用TSIGKEY功能

  环境假定:授权域domain是test.lcu.edu.cn;

  主DNS的IP地址是210.44.112.66(DNS包含Internet和Cernet两个VIEW);

  从DNS的IP地址是210.44.112.67。

  1.对主服务器的配置

  include “/etc/cernet.cfg”; //指定教育网地址文件,可以根据自己的配置来进行灵活配置。

  view “cernet” { //定义了一个Cernet view

  match-clients { key cernetkey; cernet; }; //范围是匹配这些用 cernetkey 加密 的以及 cernet地址(?)

  allow-transfer { key cernetkey; };

  //只允许用 cernetkey 加密过的 zone transfer 请求

  server 210.44.112.67 { keys cernetkey; }; // 向从服务器发送消息时,用 cernetkey 加密

  zone "." IN {

  type hint;

  file "named.root";

  };

  zone “test.lcu.edu.cn” {

  type master;

  file “cernet.zone” ;

  };

  };

  view "internet" {

  match-clients {key internetkey; any; };

  recursion no;

  allow-transfer { key internetkey; }; // 只允许用 internetkey 加密过的 zone transfer 请求

  server 210.44.112.67 { keys internetkey; }; // 向从服务器发送消息时,用 internetkey 加密

  zone "." IN {

  type hint;

  file "named.root";

  };

  zone "test.lcu.edu.cn" IN {

  type master;

  file "internet.zone";

  };

  };

  2.对从服务器的配置

  include “/etc/cernet.cfg”; //指定教育网地址文件,可以根据自己的配置来进行灵活配置。

  view “cernet” { //定义了一个Cernet view

  match-clients { key cernetkey ;cernet; }; //范围是匹配这些用 cernetkey 加密的,以及 cernet地址

  allow-transfer {none };

  // 禁止任何 zone transfer 请求

  server 210.44.112.66 { keys cernetkey; };

  // 向主服务器发送消息时,用 cernetkey 加密

  zone "." IN {

  type hint;

  file "named.root";

  };

  zone “test.lcu.edu.cn” {

  type slave;

  masters {210.44.112.66;};

  file “cernet.zone” ;

  };

  };

  view "internet" {

  match-clients {key internetkey; any; };

  recursion no;

  allow-transfer { none}; // 禁止任何 zone transfer 请求

  server 210.44.112.66 { keys internetkey; };

  // 向主服务器发送消息时,用 internetkey 加密

  zone "." IN {

  type hint;

  file "named.root";

  };

  zone "test.lcu.edu.cn" IN {

  type slave;

  masters {210.44.112.66;};

  file "internet.zone";

  };

  };

  使用dnssec-keygen命令生成 TSIG key。具体命令如下:

  /usr/sbin/dnssec-keygen -a alg -b bits [-n type] [options] name

  3.配置分析

  使用TSIG对主从DNS配置,VIEW和KEY一一对应,从而解决了主从服务器间的消息标示问题。

  两方法的优缺点

  两种方法比较而言,使用TRANSFER-SOURCE功能,需要多设置几个IP地址,配置相对简单,原理容易理解,但是造成一定的IP地址浪费。使用TSIG KEY方法,要准备KEY文件,并且KEY文件和VIEW要一一对应,做起来比较繁琐。

  配置技巧

  配置过程中的技巧及常见问题:

  1.在配置文件中使用include语句,增加文件的可读性。像各种ACL,KEY文件都可以使用include语句,在很大程度上减小了主配置文件的大小。

  例:include ”/etc/cernet.cfg”;

  2.开始配置服务器时,关掉Linux的SElinux功能,因为SElinux功能会带来意想不到的麻烦。

  3.遇到问题时,多使用tail –f /var/log/messages查看日志。

  4.BIND工作不正常时,如果发现日志中有permission denied的字样,可以把所有的配置文件权限改大,规避问题。

  5.使用rndc reload test.lcu.edu.cn. IN cernet重载cernet View下的test.lcu.edu.cn。修改ZONE文件之后,一定要记得将Serial值改大,然后执行rndc reload,才能实现数据同步。

  6.如果有部分外部域名解析不正常的情况,又没有充分的排错时间,可以使用forward语句规避问题。如

  options {

  …

  forwarders {202.102.128.68; //连通的两个DNS服务器

  202.102.152.3;

  };

  …

  }.

  7.主从服务器的时区和时钟要一致,使用ntpdate同步时间。

  (作者单位为聊城大学网络信息中心)

  来源:《中国教育网络》2009年08月刊

 

 

 

https://www.centos.bz/2011/07/centos-install-bind-dns-server/

 

BIND是一种开源的DNS(Domain Name System)协议的实现,包含对域名的查询和响应所需的所有软件。它是互联网上最广泛使用的一种DNS服务器,对于类UNIX系统来说,已经成为事实上的标准。下面我们主要学习利用BIND来实现主从dns,高速缓存DNS下次学习。

BIND安装

软件下载地址:http://www.isc.org/software/bind,目前最新版本是BIND 9.8.1-P1。
安装依赖:

  1. yum -y install gcc openssl-devel

开始安装bind.

  1. wget ftp://ftp.isc.org/isc/bind9/9.8.1-P1/bind-9.8.1-P1.tar.gz
  2. tar xzf bind-9.8.1-P1.tar.gz
  3. cd bind-9.8.1-P1
  4. ./configure --prefix=/usr/local/bind
  5. make && make install

执行完成后,bind已经安装到了/usr/local/bind目录。

配置主dns服务器

配置bind主要是两种文件,一是主配置文件named.conf,二是区域文件zone(包括正解析,反解析)。
在下面的配置中,我们的主dns服务器是ns1.qbtop.com 23.19.81.191,从dns服务器是ns2.qbtop.com 23.19.81.194(这两个dns都已经在godaddy注册好了)。
下面操作仅在主dns服务器23.19.81.191执行。

主配置文件named.conf

首先执行rndc-confgen -a生成/etc/rndc.key密钥文件。

  1. /usr/local/bind/sbin/rndc-confgen -a
  1. vi /usr/local/bind/etc/named.conf

写入如下内容:

  1. include "/usr/local/bind/etc/rndc.key";
  2. controls { inet 127.0.0.1 port 953 allow { 127.0.0.1; } keys { "rndckey"; }; };
  3. logging {
  4. channel default_syslog { syslog local2; severity notice; };
  5. channel audit_log { file "/var/log/bind.log"; severity notice; print-time yes; };
  6. category default { default_syslog; };
  7. category general { default_syslog; };
  8. category security { audit_log; default_syslog; };
  9. category config { default_syslog; };
  10. category resolver { audit_log; };
  11. category xfer-in { audit_log; };
  12. category xfer-out { audit_log; };
  13. category notify { audit_log; };
  14. category client { audit_log; };
  15. category network { audit_log; };
  16. category update { audit_log; };
  17. category queries { audit_log; };
  18. category lame-servers { audit_log; };
  19. };
  20. options {
  21.     directory "/usr/local/bind/etc";
  22. pid-file "/usr/local/bind/var/run/bind.pid";
  23. transfer-format many-answers;
  24. interface-interval 0;
  25. allow-query { any; };
  26. };
  27. zone "qbtop.com" {
  28. type master;
  29. file "qbtop.com.zone";
  30. allow-transfer { 23.19.81.194; };
  31. };
  32. zone "81.19.23.in-addr.arpa" {
  33. type master;
  34. file "81.19.23.in-addr.arpa";
  35. allow-transfer { 23.19.81.194; };
  36. };

named.conf文件说明:
上面的named.conf文件包括三部分:key,controls,logging,options,zone。

logging:设置日志服务器和日志信息的发送地。
options:控制服务器的全局配置选项和为其它语句设置默认值
zone:定义一个域,比如正解析域和反解析域。
logging是定义日志的,不需要深究,主要是options和zone。
在options中:
directory "/usr/local/bind/etc":定义bind的工作目录为/usr/local/bind/etc,配置文件中所有使用的相对路径,指的都是在这里配置的目录下。
pid-file "/usr/local/bind/var/run/bind.pid":把bind程序运行的pid写入文件bind.pid。
transfer-format many-answers:使用更加有效的域传输格式many-answers。
allow-query { any; }:允许所有用户查询dns。
在zone中:
这里定义了两个zone,一个是正解析zone qbtop.com,一个是反解析zone 81.19.23.in-addr.arpa。
他们的参数基本相同:
type master:定义dns服务器为主dns。
file "qbtop.com.zone":定义此zone的文件名。
allow-transfer { 23.19.81.194; }:允许向从dns 23.19.81.194传输dns数据。
唯一不同的是zone名称的定义,正解析zone名称的定义是受权的域名,可以是顶级域名,也可以是二级域名,或多级。反解析zone名称定义规定前部分ip倒着写。如ip 192.168.1.2,名称定义为1.168.192.in-addr.arpa。

正解析qbtop.com.zone

  1. vi /usr/local/bind/etc/qbtop.com.zone

写入如下内容:

  1. $TTL 3600
  2. @ IN SOA ns1.qbtop.com. hostmaster.qbtop.com. (
  3. 2012022301  ; Serial
  4. 3600 ; Refresh
  5. 900 ; Retry
  6. 3600000 ; Expire
  7. 3600 ) ; Minimum
  8. @ IN NS ns1.qbtop.com.
  9. @ IN NS ns2.qbtop.com.
  10. ns1 IN A 23.19.81.191
  11. ns2 IN A 23.19.81.194
  12. aaa IN A 23.19.81.191
  13. bbb IN A 23.19.81.191

文件说明:
$TTL 3600:指示为每个没有特殊TTL设置的RR给出了一个默认的TTL。
@ IN SOA ns1.qbtop.com. hostmaster.qbtop.com. (
2012022301 ; Serial
3600 ; Refresh
900 ; Retry
3600000 ; Expire
3600 ) ; Minimum

定义SOA记录,包括Zone的名字,一个技术联系人和各种不同的超时值。
@ IN NS ns1.qbtop.com.
@ IN NS ns2.qbtop.com.
设置两个ns记录ns1.qbtop.com和ns2.qbtop.com。
ns1 IN A 23.19.81.191
ns2 IN A 23.19.81.194
aaa IN A 23.19.81.191
bbb IN A 23.19.81.191
设置主机为ns1,ns2,aaa和bbb的A记录。

反解析文件81.19.23.in-addr.arpa

反解析zone可以不设置。

  1. vi /usr/local/bind/etc/81.19.23.in-addr.arpa

写入如下内容:

  1. $TTL 3600
  2. @ IN SOA ns1.qbtop.com. hostmaster.qbtop.com. (
  3. 2012022301  ; Serial
  4. 3600 ; Refresh
  5. 900 ; Retry
  6. 3600000 ; Expire
  7. 3600 ) ; Minimum
  8. @       IN      NS      ns1.qbtop.com.
  9. @       IN      NS      ns2.qbtop.com.
  10. 191 IN PTR ns1.qbtop.com.
  11. 194 IN PTR ns2.qbtop.com.

说明:
上部分是定义SOA记录,下部分是设置IP反解析。
如设置IP 23.19.81.191反解析成ns1.qbtop.com,23.19.81.194反解析成ns2.qbtop.com。

配置从DNS服务器

下面我们来配置从DNS服务器。配置从DNS服务器只需要配置主配置文件named.conf,zone文件不需配置,因为这是从主DNS服务器获取的。
首先建立目录slaves用来存放从主dns获取的zone文件。

  1. mkdir /usr/local/bind/etc/slaves

写入如下内容:

  1. logging {
  2. channel default_syslog { syslog local2; severity notice; };
  3. channel audit_log { file "/var/log/bind.log"; severity notice; print-time yes; };
  4. category default { default_syslog; };
  5. category general { default_syslog; };
  6. category security { audit_log; default_syslog; };
  7. category config { default_syslog; };
  8. category resolver { audit_log; };
  9. category xfer-in { audit_log; };
  10. category xfer-out { audit_log; };
  11. category notify { audit_log; };
  12. category client { audit_log; };
  13. category network { audit_log; };
  14. category update { audit_log; };
  15. category queries { audit_log; };
  16. category lame-servers { audit_log; };
  17. };
  18. options {
  19.     directory "/usr/local/bind/etc";
  20. pid-file "/usr/local/bind/var/run/bind.pid";
  21. transfer-format many-answers;
  22. interface-interval 0;
  23. allow-query { any; };
  24. };
  25. zone "qbtop.com" {
  26. type slave;
  27. file "slaves/qbtop.com.zone";
  28. masters { 23.19.81.191; };
  29. };
  30. zone "81.19.23.in-addr.arpa" {
  31. type slave;
  32. file "slaves/81.19.23.in-addr.arpa";
  33. masters { 23.19.81.191; };
  34. };

文件说明:
从dns跟主dns主要的区别是zone的定义,type slave定义此dns服务器为从dns,masters { 23.19.81.191; }定义主dns的IP。

启动BIND

1、在启动BIND之前,我们需要执行/usr/local/bind/sbin/named-checkconf检查named.conf配置文件,和执行/usr/local/bind/sbin/named-checkzone zone名称 zone文件名,如/usr/local/bind/sbin/named-checkzone qbtop.com /usr/local/bind/etc/qbtop.com.zone。
然后调试模式启动bind,/usr/local/bind/sbin/named -g,g参数的意思是前台执行bind,这会输出启动的信息,发现没有严重的错误后,再把g参数删除重新以/usr/local/bind/sbin/named方式后台启动bind。
2、设置开机启动,在/etc/rc.d/rc.local中加入/usr/local/bind/sbin/named。

手动添加记录

1、直接添加删除或修改zone文件里的记录
2、执行rndc reload zone名称重载,如rndc reload qbtop.com

注意

1、主从同步的两台机器要在同一个时区,时间相差不要太大。
2、主的dns服务器在修改了正向解析文件跟反向分解析文件时,要修改相应的 serial(通常是加数值,这个值必须主的要大于从的,要不同步不了)
配置文件参考:http://www.bind.com/?path=dns
BIND9中文手册:http://www.centos.bz/manual/BIND9-CHS.pdf

 

转载请标明文章来源:《https://www.centos.bz/2011/07/centos-install-bind-dns-server/

 

 

 

 

 

 

 

 

 

 

====================================================

 

posted @ 2014-12-04 18:54  陳聽溪  阅读(2416)  评论(0)    收藏  举报