为什么即使有hosts文件条目,我的名称解析仍然会命中DNS?

我正在使用 Ubuntu 10.04.2 LTS 桌面版。作为一名网页开发者,我在我的 /etc/hosts 文件中创建了一个名为 "me.com" 的条目。不幸的是,我的名称解析在首先检查本地 hosts 条目之前就会查询 DNS,并且我无法弄清楚原因。

最终结果是,如果我的 /etc/resolv.conf 文件中首先包含 nameserver 127.0.0.1,那么我在网页浏览器中从 me.com(本地)接收到的响应时间不到一秒。但如果没有这个条目,当我的 ISP 速度较慢时,响应时间可能长达 5 秒。

这个问题非常麻烦,以至于我实际上不得不在这里提问(有人解决了它)如何自动将该条目插入到 /etc/resolv.conf 中。但这里的一个用户(@shellholic)强烈推荐(并与我进行了讨论)我应该提出这个问题。

你知道为什么我的工作站的名称解析必须先访问DNS服务器,然后才能访问我的/etc/hosts文件条目吗?目前,我正在使用resolv.conf的技巧。

1你可以尝试查看/etc/nsswitch.conf文件。在我的系统上,这些条目可能有点不明显,但你可以尝试只使用files选项进行查询,并查看是否有所不同。 - belacqua
好的,你能给我们提供cat /etc/nsswitch.confcat /etc/host.conf的输出吗?另外,请问你是通过ping、浏览器还是数据包嗅探等方式进行测试的? - arrange
为了完成@arrange的版本,你能附上time getent hosts me.com; hostname --fqdn; grep 'me.com' /etc/hosts; grep hosts /etc/nsswitch.conf; netstat -uln | grep ':53'; cat /etc/host.conf; wc -l /etc/hosts的结果吗?不要犹豫地混淆合理性。 - shellholic
1@shellholic ^理性^理性地? 嘿。 - belacqua
@jgbelacqua: 确实 - shellholic
我的host.conf文件显示“order hosts,bind”。我的nsswitch.conf文件显示“hosts:files mdns4_minimal [NOTFOUND=return] dns mdns4”。我还需要按照@shellholic的要求进行时间测试。今天时间有点紧张。 - Volomike
1个回答

文件/etc/nsswitch.conf可以让您重新配置名称解析的顺序。默认情况下,主机文件是第一个,然后是配置的DNS。还可能有更多选项。
文件/etc/hosts只列出IP地址和主机名(如果需要,可以为一个IP列出多个名称)。
文件/etc/resolv.conf将列出默认搜索域,并按顺序列出要使用的名称服务器。

5请记住,一旦应用程序或服务在您的Linux系统上解析了一个名称,它将在缓存中保留一段时间,这段时间被称为TTL(生存时间)。因此,如果您切换解析顺序,最好重新启动系统或清除任何缓存。 - jfmessier
如何清除“缓存”? - Eric Johnson
我不确定,但是使用ifup和ifdown命令重新启动网络连接可能会解决问题。当然,重新启动可以清除缓存,但我们正在使用Linux,对吧? - jfmessier
nscd可以缓存名称解析查询,但不遵守ttl(因此默认情况下禁用主机缓存)。systemd-resolved也会缓存条目。如果没有配置这些,Linux主机不会缓存DNS响应。(浏览器可能在应用层面上进行缓存) - Gert van den Berg