非终端DNS名重定向 1. 介绍 本文会介绍一种新的DNS资源称为"DNAME",它可以使DNS名字空间的一个子树映射到另一个域中,它与CNAME不同,CNAME只能将树中的一个结点遇到另一域中。 2. 背景 它是为了处理网络重编号时的产生的问题而产生的。在没有DNAME时,如果要进行重新编号,用于地址名字映射的DNS服务器需要重新配置,工作量可是不小,有了DNAME之后,可以建立一个区(zone),这样不用进行什么修改就可以了。当然在别的方面DNAME也有其它用途。 3. DNAME资源记录(RR) DNAME RR拥有类型代码39,它的格式如下: <owner> <ttl> <class> DNAME <target> 格式不分级,所有域都需要,RDATA域<target>是<domain-name>。 DNAME的作用是代替记录的<target>,对于区文件中的DNAME来说,有一个无后代(no-descendant)限制: 如果N结点有DNAME RR,可以在N中有数据,但N的子孙(后代)中不能有数据,这条限制应该于与DNAME相同class的记录中。 当DNAME被缓冲时,此限制保证不会产生不可预料的结果。在认证数据加载时一定要注意这一条。和其它限制一起,我们可以知道DNAME和NS记录只能共存于只有一个结点的区的顶结点中。不要对DNAME的RDATA部分进行压缩,除非发送服务器知道接收方可以识别这一格式。对这种压缩的理解属于DNS扩展的一部分。命名环(Naming loop)可以通过DNAME记录或DNAME和CNAME的组合创建。不要把这种环的长度弄得过长。 4. 查询 为了利用DNAME机制,必须对服务器和resolver的算法作一些修改。我们把这个修改称为DNAME替换。 4.1.服务器方 对于DNS中非循环查询中的3.c和4第四步,应该在检查wildcard("*")前检查DNAME,并从区数据和缓冲中返回包括DNAME记录。 DNS客户发送扩展DNS请求,或非扩展请求,在非扩展请求假设不能理解DNAME的语义,所以实现DNAME的服务器在接收到非扩展请求时,应该对每个DNAME加上碰到的CNAME,帮助客户找到正确的DNS数据。如果客户和服务器能够理解扩展请求,传输的版本号大于0。如果提供了一起的CNAME RR,它必须有:
修改后的算法如下:
注意:除非区数据违反上面所说的无后代限制,DNAME至多有一个祖先。算法具体实现时,可以利用这一限制在3c或第4步碰到DNAME时停止。 4.2. Resolver 对resolver算法的修改是在原来算法的基础上将4.d变为4.e并加入新的4.d,完整的算法如下:
5. 例子 5.1. 有组织的重命名 如果FROBOZZ.EXAMPLE变为ACME.EXAMPLE的一部分,可能通过加入下面的语句完成: frobozz.example. DNAME frobozz-division.acme.example. MX 10 mailhub.acme.example. 对于www.frobozz.example的扩展循环查询的响应将包括相应的DNAME记录。 5.2. 短前缀无级推荐(delegation) 使用DNAME时,对于in-addr.arpa的推荐机制,它可以被扩展至前缀小于24位。例如前缀192.0.8.0/22可以被表示以下面的记录: $ORIGIN 0.192.in-addr.arpa. 8/22 NS ns.slash-22-holder.example. 8 DNAME 8.8/22 9 DNAME 9.8/22 10 DNAME 10.8/22 11 DNAME 11.8/22 对一些以192.0.9.33为地址的主机的反向区的通常入口如下: $ORIGIN 8/22.0.192.in-addr.arpa. 33.9 PTR somehost.slash-22-holder.example. 5.3. 网络重编号支持 如果网络支持重编号,可以使用DNAME代替NS记录进行推荐。 $ORIGIN new-style.in-addr.arpa. $ORIGIN in-addr.example.net. $ORIGIN in-addr.customer.example. ; 等 这将使190.189.0.0/16这一段地址空间分配到ISP"example.net",如果要改变它时,也不用改变描述ISP和其它用户使用的区文件。对于IPv4网络进行重编号目前是个十分艰苦的工作,处理DNS只是其中的一小部分,所以在整个重编号中本机制的作用可是不大。我们希望在IPv6网络中,DNAME机制可以发挥更大的作用。 |