《DNS与BIND(第5版)》——10.3 DNS NOTIFY(区域变更通知)

10.3 DNS NOTIFY(区域变更通知)

习惯上,BIND中的slave通过轮询(polling)机制来决定何时需要进行区域传输。轮询间隔时间又被称为更新间隔时间(refresh interval)。而区域SOA记录中的其他参数,则可以用来配置轮询机制的其他参数。

但是使用这种轮询机制,在slave检测到并且从其master名称服务器传回新的区域数据,需要等待一段更新间隔时间。对使用动态更新的环境而言,这种延迟所带来的后果是灾难性的。当区域信息变更时,如果primary名称服务器能够主动通知slave服务器,岂不更好?毕竟,primary名称服务器能感知数据发生了改变:有人重载(reload)了数据,或其收到并处理了一条动态更新。因此,primary可以在处理完重载或更新之后立即发送通知,而不必等待更新间隔时间的到来1。

RFC 1996提出了一种机制,允许primary名称服务器通知slave,区域数据已经变更。BIND 8和9已实现了这一功能,并称之为DNS NOTIFY。

DNS NOTIFY的工作原理如下:当primary名称服务器注意到区域的序号已经改变时,便会给该区域所有slave服务器发送一条特殊的通告。primary名称服务器通过检索区域NS记录,排除出现在区域SOA记录MNAME字段中的名称服务器和本地主机域名,从而确定区域中所有的slave服务器。

名称服务器会在何时发送变更通知?重启primary名称服务器,会导致其通知所有slave当前全部区域的序号,因为primary无从得知其区域数据文件在启动之前是否被编辑过。以新的序号重载一个或多个区域,会导致名称服务器通知区域的slave。并且动态更新会使区域的序号增大,这也会导致名称服务器发送变更通知。

这个特殊的NOTIFY通告,可以通过检查DNS包头中的opcode来加以识别。一般查询要求的opcode多为QUERY。而NOTIFY消息,包括通告与应答,具有一个特殊的opcode,即NOTIFY。除此之外,NOTIFY消息看起来和对区域SOA记录所做查询的响应很像:因为两者都包含序号被改变的区域SOA记录,并且authoritative answer(权威应答,简称aa)位也被置位了。

当slave从它的master名称服务器收到区域的NOTIFY通告时,它会发送NOTIFY响应。该响应用来告知master,它已经收到NOTIFY通告,于是master就会停止向它发送该区域的NOTIFY通告。随后,就像该区域的更新间隔时间到期一样,slave会执行以下动作:向master名称服务器查询其声明有变动的区域SOA记录。如果发现序号更大,则slave就会执行区域数据传输。

为什么slave不直接相信master发送的区域变更消息呢?因为攻击者可能通过伪造NOTIFY通告来欺骗slave,目的在于制造许多不必要的区域数据传输,导致master瘫痪,从而实现对master名称服务器的拒绝服务攻击。

如果slave实际完成了区域数据传输,RFC 1996还提到:slave应该向该区域中的其他权威名称服务器发送自己的NOTIFY通告。这样做的原因是:只靠primary master可能无法通知到区域中所有的slave服务器,因为很可能某些slave无法直接和primary master通信(所以才会使用另一台slave作为它们的master)。虽然BIND 及其后续版本,以及所有BIND 9名称服务器都实现了该功能,但是BIND 8的早期版本并不支持该功能。对于旧版的BIND 8,除非有明确的配置,否则slave不会发送NOTIFY消息。

下面来看它实际是如何工作的。在网络上,toystory.movie.edu是区域movie.edu的primary名称服务器,而wormhole.movie.edu和zardoz.movie.edu则是slave,如图10-1所示。

https://yqfile.alicdn.com/7e533dcef25e5a482eb14a069bc2c299f1e3a7fc.png" >

当在toystory.movie.edu上编辑、重载或动态更新区域movie.edu时,toystory.movie.edu将给wormhole.movie.edu和zardoz.movie.edu发送NOTIFY通告。这两个slave都会向toystory.movie.edu发送应答,表示已经收到通知。它们接着检查区域movie.edu的序号是否增加,如果增加了,便会执行区域数据传输。如果wormhole.movie.edu和zardoz.movie.edu所运行的是BIND (或其后续版本)或者BIND 9的名称服务器,当传输完新的区域数据后,它们还会彼此发送NOTIFY通告,以便通知其他slave服务器区域数据已经改变。不过对区域movie.edu而言,wormhole.movie.edu并不是zardoz.movie.edu的master名称服务器,反之亦然,所以它们彼此都会忽略对方的NOTIFY通告。
BIND名称服务器会把与NOTIFY有关的信息记录在syslog中。下面是在重载区域movie.edu后,toystory.movie.edu的日志记录:

其中,第一条信息表示toystory.movie.edu发送NOTIFY通告,用来通知两个slave(2NS),区域movie.edu现在的序号是2000010958。另外两条信息表示这两个slave名称服务器已经确认收到了该通知。

BIND 9名称服务器仅会记录:

再来看一个更复杂的例子。在图10-2中,a是区域的primary master名称服务器,也是b的master服务器,而b是c的master服务器,并且b有两个网络接口。

在这个例子中,区域数据更新后,a会通知b和c。随后b会向a查询区域的序号是否增加,如果增加则启动区域数据传输。然而,c会忽略a的NOTIFY通告,因为a不是c所配置的master名称服务器(b才是)。如果b运行的是BIND (及其后续版本)或者BIND 9,或者明确配置成通知c,那么在b完成区域数据传输后,它还会给c发送NOTIFY通告,这会提醒c去检查b所持有的区域序号。如果c运行的也是BIND 8.2.3(及其后续版本)或者BIND 9,它也会在完成区域数据传输后,给b发送NOTIFY通告,当然,b会把它忽略掉。

同时请注意,如果c有可能会从b的另外一个网络接口收到NOTIFY通告,c就必须把b的两个网络接口的IP地址,都配置到其zone语句的masters子语句中,否则c会忽略来自另一个未知接口的NOTIFY通告。

https://yqfile.alicdn.com/720d904b29fd267ea7edbd130053f14f5505770b.png" >

至于BIND 4版本的slave名称服务器,以及其他不支持NOTIFY功能的名称服务器,则会回应NOTIMP(Not Implemented,不支持指定的操作)的错误信息。请注意,Microsoft的DNS服务器支持DNS NOTIFY功能。

在BIND 8和9中,虽然DNS NOTIFY是默认开启的,但是可以用如下子语句从全局上完全关闭该功能:

https://yqfile.alicdn.com/8e30b8e7829fcaaf55de1c20887c452e5418ef4e.png" >

你还可以针对特定的区域开启或关闭NOTIFY功能。例如,如果知道区域fx.movie.edu中所有的slave名称服务器都使用BIND 4版本,因此它们都不能识别NOTIFY通告,那么zone语句可以配置为:

这样就可以避免给fx.movie.edu中的slave发送无用的NOTIFY通告。针对特定区域的NOTIFY配置,将会覆盖针对全局的配置。可惜BIND 8和9都不允许针对特定的服务器关闭NOTIFY功能。

除了区域的NS记录中指定的服务器,BIND 8和9甚至允许将其他服务器增加到“NOTIFY列表”中。例如,可能存在一个或多个未注册的slave名称服务器(本书第8章介绍过),不过又想让它们尽快取得区域数据更新。或者可能存在一个运行较旧版本的BIND 8名称服务器,它虽然是区域的slave,但同时又是另一个slave的master服务器,同样需要传送NOTIFY消息给该slave。

要将服务器加入NOTIFY列表,可在zone语句中使用also-notify子语句:

在BIND 及其后续版本的名称服务器中,还可以把also-notify作为options的子语句。当NOTIFY功能开启时,该处所做的配置将会应用到所有区域上(只要它们没有配置自己的also-notify子语句)。

从BIND 和9.1.0开始,配置notify子语句时可以同时指定explicit这个参数;这将禁止把NOTIFY消息转发给所有名称服务器,除非在also-notify列表中另有指定。例如,下面两条子语句将名称服务器配置为只给IP地址为192.249.249.20的slave发送NOTIFY消息:

https://yqfile.alicdn.com/9bfe715f9be9c0330d8fc2efe4a4859916854a0d.png" >

还可以使用allow-notify子语句告诉名称服务器,可以接受来自区域中master以外的其他名称服务器发送的NOTIFY消息:

https://yqfile.alicdn.com/766d5be66687d30596295fcee72b2f327a5c3955.png" >

如果作为options的子语句,则allow-notify的配置会影响所有slave区域。如果作为特定zone的子语句,则allow-notify的配置会覆盖掉该区域所有全局allow-notify配置。

时间: 2024-08-26 07:53:18

《DNS与BIND(第5版)》——10.3 DNS NOTIFY(区域变更通知)的相关文章

《DNS与BIND(第5版)》——10.12 系统优化

10.12 系统优化 对于大多数名称服务器来说,在BIND的默认配置下就能工作得很好,然而可能其中某个还需要进一步调优.本节将讨论可以用来优化名称服务器的所有配置项. 10.12.1 区域传输区域传输会给名称服务器带来沉重的负担.所以BIND提供一些机制,可以限制slave名称服务器给master服务器带来的区域传输负载. 1.限制请求单个名称服务器传输的区域数量 在slave名称服务器上,可以限制其一次能够向单个master名称服务器请求传输的区域数量.这样master名称服务器的管理员应该会

《DNS与BIND(第5版)》——10.5 转发机制

10.5 转发机制 某些网络连接不希望发送过多的流量到外界去,可能是因为对外的连接速率低.延迟高:例如,远程办公室通过卫星连接到公司的网络.在这些情况下,可能需要将对外的DNS流量限制到最低.BIND提供了一种解决此问题的机制:转发器(forwarder). 如果需要将名称解析分流至特定的名称服务器,那么转发器也是很有用的.例如,如果网络中只有一台主机连接到Internet,并且该主机是名称服务器,则可以将其配置为其他名称服务器的转发器,这样它们就可以查询Internet上的域名了.(本书第11

《DNS与BIND(第5版)》——10.2 DNS动态更新

10.2 DNS动态更新 Internet(即通常使用TCP/IP协议的网络)如今变得愈加动态化.许多大型企业使用DHCP动态分配IP地址.几乎所有的ISP都使用DHCP为其拨号及使用线缆调制解调器(cable modem)的用户分配IP地址.为适应这种变化,DNS需要提供动态增加和删除记录的功能.RFC 2136描述了这种机制,称为DNS动态更新. BIND 8和9支持RFC 2136提出的动态更新功能.此功能允许经过授权的更新者(updater),在区域中的权威名称服务器上增加和删除资源记录

《DNS与BIND(第5版)》——10.11 回避伪装的名称服务器

10.11 回避伪装的名称服务器 作为名称服务器的管理员,可能会发现某些远程名称服务器用有害的信息作为应答,这些信息可能是过时的.不正确的.格式错误的,甚至是故意欺骗的.可以尝试通知对方的管理员来修复该问题.或者通过配置,让名称服务器不再查询该服务器,BIND 8和BIND 及其后续版本支持这个功能.下面是配置文件中的语句: 当然,需要填入正确的IP地址. 如果名称服务器停止查询的服务器,是一个区域唯一的服务器,那么不要指望能够查询到位于该区域的名称了.但愿,还存在其他服务器可以提供关于该区域的

《DNS与BIND(第5版)》——10.9 优先选择特定网络上的名称服务器

10.9 优先选择特定网络上的名称服务器 BIND 8的拓扑(topology)功能与sortlist有些相似,不过它仅用于选择名称服务器.(BIND 9直到版仍不支持拓扑功能.)本章前面曾介绍过,BIND会从同一区域的各权威名称服务器中,选择出往返时间(round-trip time,简称RTT)最短的名称服务器.事实上并非如此.BIND 8在比较RTT时,实际上会把远程名称服务器分配到以64毫秒为单位划分的多个时段中.第一时段其实只有32毫秒宽,从0到32毫秒.下一时段从33到96毫秒,依次

《DNS与BIND(第5版)》——第10章 高级功能10.1 地址匹配列表和ACL

第10章 高级功能 蚊子问道:"如果你叫它们的名字,它们却不答应,那要名字又有什么用呢?" 最新版本(本书英文版撰写时为和9.3.2)的BIND名称服务器,提供了许多新功能.其中最值得介绍的包括支持动态更新.异步区域变更通知(简称NOTIFY),以及增量区域传输.在其余部分中,与安全相关的功能也很重要:允许配置名称服务器可以响应谁的请求,给谁提供区域传输,以及允许谁进行动态更新.在企业内部网络中,虽然许多安全功能不是必需的,但是有些机制对于任何名称服务器的管理员而言,都是有所帮助的.

《DNS与BIND(第5版)》——4.2 建立区域数据

4.2 建立区域数据 建立电影大学名称服务器的第一步,是将主机表转换成等效的DNS区域数据.该数据的DNS版本有多个文件.一个文件将所有主机名映射成地址.其他文件将地址映射回主机名.名称到地址(name-to-address)的查询有时被称作正向解析(forward mapping),而地址到名称(address-to-name)的查询则被称作逆向解析(reverse mapping).每个网络都拥有自己的逆向解析数据文件. 作为本书的一个约定,将主机名映射到地址的文件称作db.DOMAIN.例

《DNS与BIND(第5版)》——1.4 BIND的历史

1.4 BIND的历史 Paul Mockapetris亲自创建了第一个域名系统,名叫JEEVES.在此之后被实现的域名系统是BIND(Berkeley Internet Name Domain的缩写),它是由Kevin Dunlap为伯克利的4.3版BSD UNIX系统所编写.BIND现在由Internet Systems Consortium负责维护1. BIND就是本书所讨论的DNS的实现,也是迄今为止普及最广的DNS实现.它不仅被移植到各个版本的UNIX上,成为大多数UNIX系统的标准配

《DNS与BIND(第5版)》——7.2 更新区域数据文件

7.2 更新区域数据文件 网络总是在不断变化的--新的工作站加入,老的被淘汰或卖掉,或者将主机移至另一个网络.每次改变都意味着区域数据文件必须跟着修改.应该手动修改这些文件还是应该使用工具协助修改呢? 本节将首先讨论如何手动修改区域数据文件.然后再介绍一个协助修改的工具:h2n.事实上,本书推荐使用工具来创建区域数据文件:或者至少使用工具来增加序号.区域数据文件的语法很容易导致错误.因为它无法保证存放在不同文件中的地址和指针记录,能够保持彼此之间的一致性.不过,就算是使用工具,也还是必须知道更新