2011年11月4日星期五

resolv.conf 的配置和dns解析的关系

本文为笔记,部分地方不准确。目的:resolv.conf 中配置了 search 选项和 domain 选项后,检查系统查询域名的步骤和行为。

0 若不存在 resolv.conf,则将本机做为dns服务器,然后取主机名的domain,然后附加到域名中进行查询。查询时首先查询AAAA记录,再查询A记录。以下均为查询nxyi-dns2.hst.xyi.cn.xdc.net时,得到的不同结果。

1 若没有search(最长为6个)和domain选项,则取主机名的domain,然后附加到域名中进行查询:

17-Oct-2011 23:35:17.536 queries: client 172.22.41.176#44119: query: nxyi-dns2.hst.xyi.cn.xdc.net IN AAAA +
17-Oct-2011 23:35:17.536 queries: client 172.22.41.176#56562: query: nxyi-dns2.hst.xyi.cn.xdc.net.hst.xyi.cn.xdc.net IN AAAA +
17-Oct-2011 23:35:17.536 queries: client 172.22.41.176#53616: query: nxyi-dns2.hst.xyi.cn.xdc.net IN A +

2 如有domain,(domain xdc.net)则,附加domain到域名中进行查询:

17-Oct-2011 23:38:02.031 queries: client 172.22.41.176#43411: query: nxyi-dns2.hst.xyi.cn.xdc.net IN AAAA +
17-Oct-2011 23:38:02.031 queries: client 172.22.41.176#41697: query: nxyi-dns2.hst.xyi.cn.xdc.net.xdc.net IN AAAA +
17-Oct-2011 23:38:02.031 queries: client 172.22.41.176#35978: query: nxyi-dns2.hst.xyi.cn.xdc.net IN A +

3 若有多个search (search hst.xyi.cn.xdc.net hst.dsl.crm.xdc.net hst.x.dw.xdc.net) 则依次附加,然后查询,顺序依然首先查询AAAA记录,再查A记录:

17-Oct-2011 23:39:25.272 queries: client 172.22.41.176#49875: query: nxyi-dns2.hst.xyi.cn.xdc.net IN AAAA +
17-Oct-2011 23:39:25.272 queries: client 172.22.41.176#36371: query: nxyi-dns2.hst.xyi.cn.xdc.net.hst.xyi.cn.xdc.net IN AAAA +
17-Oct-2011 23:39:25.272 queries: client 172.22.41.176#33367: query: nxyi-dns2.hst.xyi.cn.xdc.net.hst.dsl.crm.xdc.net IN AAAA +
17-Oct-2011 23:39:25.272 queries: client 172.22.41.176#42772: query: nxyi-dns2.hst.xyi.cn.xdc.net.hst.x.dw.xdc.net IN AAAA +
17-Oct-2011 23:39:25.273 queries: client 172.22.41.176#45355: query: nxyi-dns2.hst.xyi.cn.xdc.net.xdc.net IN AAAA +
17-Oct-2011 23:39:25.273 queries: client 172.22.41.176#35669: query: nxyi-dns2.hst.xyi.cn.xdc.net IN A +

4 若nxyi-dns5.hst.xyi.cn.xdc.net没有找到,则附加search进行查询A记录:

17-Oct-2011 23:52:21.527 queries: client 172.22.41.176#56298: query: nxyi-dns5.hst.xyi.cn.xdc.net IN AAAA +
17-Oct-2011 23:52:21.528 queries: client 172.22.41.176#40880: query: nxyi-dns5.hst.xyi.cn.xdc.net.xyi.cn.xdc.net IN AAAA +
17-Oct-2011 23:52:21.528 queries: client 172.22.41.176#40359: query: nxyi-dns5.hst.xyi.cn.xdc.net IN A +
17-Oct-2011 23:52:21.528 queries: client 172.22.41.176#36129: query: nxyi-dns5.hst.xyi.cn.xdc.net.xyi.cn.xdc.net IN A +

5 若存在ndots:6,则由于域名仅仅包含了5个点,则顺序改变,首先附加search查找,然后再查找域名本身。默认为ndots值为1,即域名只要包含一个点,就不会首先附加search:

17-Oct-2011 23:53:04.260 queries: client 172.22.41.176#50630: query: nxyi-dns5.hst.xyi.cn.xdc.net.xyi.cn.xdc.net IN AAAA +
17-Oct-2011 23:53:04.260 queries: client 172.22.41.176#38081: query: nxyi-dns5.hst.xyi.cn.xdc.net IN AAAA +
17-Oct-2011 23:53:04.260 queries: client 172.22.41.176#36043: query: nxyi-dns5.hst.xyi.cn.xdc.net.xyi.cn.xdc.net IN A +
17-Oct-2011 23:53:04.260 queries: client 172.22.41.176#58401: query: nxyi-dns5.hst.xyi.cn.xdc.net IN A +

总结:
系统查询域名主要使用 gethostbyname(过时) 和 getaddrinfo 两个函数,二者接收的参数和返回的数据类型都不相同。其中 gethostbyname 实际调用 gethostbyname2,根据传递的参数可以查询AAAA或者A记录。getaddrinfo 功能更强大,可以控制是查询AAAA,A,或者先AAAA后A记录。详细可见glibc中 resolv/gethnamaddr.c 和 sysdeps/posix/getaddrinfo.c 中的实现。

没有评论:

发表评论