使用dynamicIP地址时,使用/ etc / hosts绕过DNS服务器查找

根据我的理解,如果通常访问的名称存在于/ etc / hosts中,则可以减less为外部DNS服务器查询常用名称的需求。

现在,我有一个具有dynamicIP地址的embedded式Linux框的情况。 假设这个dynamicIP地址目前是206.190.36.105。

这里是我的/ etc / hosts文件的内容:

[root@zop]# cat /etc/hosts 127.0.0.1 localhost 192.168.0.1 mydevice 173.194.33.18 somesite.com 

但是,当我运行tcpdump和ping somesite.com,我仍然看到somesite.com正在通过DNS查找解决。

 17:28:48.330535 IP 206.190.36.105 > somesite.com: ICMP echo request, id 14880, seq 0, length 64 17:28:48.333465 IP 206.190.36.105.57201 > resolver1.opendns.com.domain: 2+ PTR? 204.220.167.10.in-addr.arpa. (45) 17:28:49.312286 IP somesite.com > 206.190.36.105: ICMP echo reply, id 14880, seq 0, length 64 17:28:49.335601 IP 206.190.36.105 > somesite.com: ICMP echo request, id 14880, seq 1, length 64 17:28:49.366973 IP resolver1.opendns.com.domain > 206.190.36.105.57201: 2* 0/1/0 (104) 17:28:49.368286 IP 206.190.36.105.59381 > resolver1.opendns.com.domain: 3+ PTR? 204.220.167.10.in-addr.arpa. (45) 17:28:49.664215 IP somesite.com > 206.190.36.105: ICMP echo reply, id 14880, seq 1, length 64 17:28:49.742004 IP resolver1.opendns.com.domain > 206.190.36.105.59381: 3* 0/1/0 (104) 17:28:49.743194 IP 206.190.36.105.57388 > resolver1.opendns.com.domain: 4+ PTR? 204.220.167.10.in-addr.arpa. (45) 17:28:50.038848 IP resolver1.opendns.com.domain > 206.190.36.105.57388: 4* 0/1/0 (104) 17:28:50.040069 IP 206.190.36.105.53513 > resolver1.opendns.com.domain: 5+ PTR? 204.220.167.10.in-addr.arpa. (45) 17:28:50.335815 IP resolver1.opendns.com.domain > 206.190.36.105.53513: 5* 0/1/0 (104) 17:28:50.337036 IP 206.190.36.105.54248 > resolver1.opendns.com.domain: 6+ PTR? 204.220.167.10.in-addr.arpa. (45) 

如果我在/ etc / hosts中为Linux框的当前IP地址创build一个条目,如下所示:

 [root@zop]# cat /etc/hosts 127.0.0.1 localhost 192.168.0.101 mydevice 173.194.33.18 somesite.com 206.190.36.105 whatismyip 

然后tcpdump与ping到somesite.com显示DNS查找现在绕过

 17:15:35.795013 IP whatismyip > somesite.com: ICMP echo request, id 61212, seq 0, length 64 17:15:36.648193 IP somesite.com > whatismyip: ICMP echo reply, id 61212, seq 0, length 64 17:15:36.809234 IP whatismyip > somesite.com: ICMP echo request, id 61212, seq 1, length 64 17:15:37.164276 IP somesite.com > whatismyip: ICMP echo reply, id 61212, seq 1, length 64 17:15:37.819915 IP whatismyip > somesite.com: ICMP echo request, id 61212, seq 2, length 64 17:15:38.148193 IP somesite.com > whatismyip: ICMP echo reply, id 61212, seq 2, length 64 17:15:38.827728 IP whatismyip > somesite.com: ICMP echo request, id 61212, seq 3, length 64 

我有兴趣了解这一观察到的行为的基本原理。 embedded式Linux供应商声称,这种行为是正常的和预期的行为 – 但合理的,如果只有目的IP地址不在/ etc / hosts文件中,不应该绕过DNS查找?

我认为你用反向DNS查找混淆了DNS查询。

正向DNS查询从名称到IP地址。 如果你看第一个tcpdump中的DNS数据包,你会看到PTR? (指针请求),这是将IP转换为名称的请求。

zyxwin-addr.arpa是以反向查找符号请求的IP。 如果你反转这个命令,你会得到wxyz,这是它试图查找的IP地址。

我怀疑tcpdump是反向查询请求的来源,而不是ping ,因为它不需要对您的IP执行反向查找。 将IP添加到/etc/hoststcpdump不再需要对IP执行反向查找,因为parsing器库可以在不执行DNS查询的情况下find它。

使用-n选项运行tcpdump通常是个好主意,以避免这些查找。 他们通常没有必要。

查找顺序通常由/etc/nsswitch 。 请注意,如果您在/etc/hosts有条目并且是第一次查找,则不会发生DNS查找。 确保条目都是静态的和正确的。

如果dns是第一个,只有当dns查找失败时才会使用/etc/hosts 。 如果files是第一个,只有在/etc/hosts失败时才使用dns。

如果找不到名称,则/etc/resolv.confsearchdomain行可能会导致尝试进行其他查找。 ndots选项可用于指示在search禁止使用searchdomain所需的点数。

您可以使用绑定到search第一个条目的/etc/hosts别名,以防止使用其他search域进行查找。

您看到的DNS请求是将IP映射到域名的反向请求:

 PTR 204.220.167.10.in-addr.arpa. 

Ping要求的名字是10.167.220.204(推测是你客户的IP?)。 在tcpdump输出中,我没有看到任何转发请求(将somesite.comparsing为IP地址)。

现在回到你原来的意图 – 我认为是减lessnetworkingstream量。 如果运行nscd (名称服务caching守护程序),通常只会看到每个主机名的一个DNS请求,而nscd守护程序将会为您caching。 这比保持/etc/hosts更新networking更改和重新编号要好得多。