`/etc/hosts` 和 DNS 如何协同工作将主机名解析为 IP 地址?

`/etc/hosts` 和 DNS 如何协同工作将主机名解析为 IP 地址?

/etc/hosts在Linux中, DNS如何协同工作将主机名解析为IP地址?

  1. 如果可以在 中解析主机名/etc/hosts,则 DNS 是否会在/etc/hosts 解析主机名后应用,或将解析的 IP 地址视为 /etc/hosts“主机名”以递归解析?
  2. 在我的浏览器(firefox 和 google chrome)中,当我添加到 /etc/hosts

    127.0.0.1 google.com www.google.com
    

    在浏览器地址栏中输入 www.google.com 并按 Enter 键将无法连接到该网站。从 中删除该行后/etc/hosts,我可以连接到该网站。这是否意味着/etc/hosts会覆盖 DNS 来解析主机名?

    重新添加线路后/etc/hosts,即使刷新网页后,我仍然可以连接到该网站。为什么不 /etc/hosts重新申请,导致网站无法连接?

谢谢。

答案1

这是由 NSS(名称服务交换机)配置(即/etc/nsswitch.conf文件hosts指令)决定的。例如,在我的系统上:

hosts:    files mdns4_minimal [NOTFOUND=return] dns

这里,files指的是/etc/hosts文件,dns指的是DNS系统。正如你可以想象的那样以先到者为准

另外,请参阅man 5 nsswitch.conf以获取更多关于此的想法。


顺便说一句,要遵循 NSS 主机解析顺序,请使用getentwithhosts作为数据库,例如:

getent hosts example.com

答案2

回答你的最后一个问题:/etc/hosts不会立即再次应用,因为firefox正在缓存它获得的最后一个主机名google.com;如果你希望它总是再次获取它,你必须设置network.dnsCacheExpiration在。0about:config更多信息(虽然有点过时)这里。抱歉,如果这是题外话。


作为旁注,许多程序不使用标准解析器(getaddrinfo(3)getnameinfo(3)[1]),因为太糟糕了

首先,接口不是异步的;任何中等复杂的程序都必须生成一个单独的线程,只执行该操作getaddrinfo(),然后发明自己的协议来与其通信(我们甚至不进入getaddrinfo_a(),它正在发送一个信号完成后,情况更糟)。

其次,(linux中的标准C库)中的解析器实现glibc很糟糕,期望你让它在dlopen()你背后将随机动态对象拉入地址空间,并且不可能以任何方式包含它或静态使用它链接的可执行文件。

由于许多程序不直接使用标准解析器,因此它们也懒得精确复制其行为,并且忽略/etc/resolv.conf/etc/hosts/etc/nsswitch.conf的部分或全部/etc/gai.conf

[1] 甚至更不用说不可重入的、仅 ipv4 的了gethostbyname(),它多年来已被弃用。

答案3

该文件/etc/hosts和 DNS 不能一起工作。它们提供独立的名称解析(网络名称)。

连接它们的胶水是/etc/nsswitch.confLinux系统内部。对于/etc/netsvc.confAIX 服务器,在系统中视窗在 MacOS 系统中可以使用lookupd -configuration(搜索 LookupOrder,类似于:)列出。Cache FF DNS NI DS

实际的顺序变得复杂并且通常令人费解,因为每个名称解析服务都可以(而且很多时候)查看其他级别的解析。像(通常位于、或(或两者)dnsmasq的轻型 DNS 服务器)通常读取并包含文件内容。或者像(一个基本解析器,应该只解析像 一样的非点名称)在某些情况下直接调用点名称( )的 DNS 解析。127.0.0.1:53::1:53/etc/hostssystemd.resolvermycomputermycomputer.here.dev.

一般来说,服务是按顺序调用的,第一个没有失败的服务获胜并被接受为正确的地址。一般基本顺序是:(/etc/hosts文件)、mDNS(不带点的名称)、DNS、NIS、NIS+、LDAP。在某些 Linux 系统中,有最后的解决办法hostname服务中的计算机myhostname

例如,在这个系统中(来自cat /etc/nsswitch):

hosts:          files mdns4_minimal [NOTFOUND=return] dns myhostname

请注意,非常旧的(glibc 2.4 及更早版本)order条目设置在/etc/host.conf作为:

order hosts,bind,nis

仅适用于文件(file /etc/hosts)名称服务。

与 NIS 和 LDAP 相关的此 (Linux) 客户端计算机的影响(通常)由所使用的 DNS 服务器(绑定、未绑定等)控制。

所以:

  1. 如果主机名可以在/etc/hosts中解析,那么DNS是在/etc/hosts之后应用来解析主机名还是将/etc/hosts解析的IP地址视为“主机名”来递归解析?

没有任何。

如果主机名可以在 中解析/etc/hosts,则不DNS适用(如果文件位于 DNS 之前)。

也不是被视为“主机名”的已解析 IP 地址。

它只是:已解析的地址。

浏览器

浏览器可以使用任何方法来解析名称(在检查了已解析名称的缓存之后)。仅当它使用系统提供的方法时,上面给出的顺序才适用。浏览器与任何程序一样,可以选择直接联系任何 DNS 服务器。

如果系统顺序有/etc/hostsbefore DNS,则表示该文件中的条目将优先DNS解析服务。

所以:

  1. ...这是否意味着 /etc/hosts 会覆盖 DNS 来解析主机名?

是(如果浏览器使用系统提供的分辨率)。

为什么不/etc/hosts重新申请,导致网站无法连接?

只有在该特定名称的浏览器内部缓存被清除(或超时)后,才会在浏览器外部再次搜索该名称。

如果浏览器在其缓存中解析了名称,则浏览器会再次使用它。

用它来清除缓存

或者干脆关闭(稍等片刻)并重新启动浏览器。

相关内容