/etc/hosts
在Linux中, DNS如何协同工作将主机名解析为IP地址?
- 如果可以在 中解析主机名
/etc/hosts
,则 DNS 是否会在/etc/hosts
解析主机名后应用,或将解析的 IP 地址视为/etc/hosts
“主机名”以递归解析? 在我的浏览器(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 主机解析顺序,请使用getent
withhosts
作为数据库,例如:
getent hosts example.com
答案2
回答你的最后一个问题:/etc/hosts
不会立即再次应用,因为firefox
正在缓存它获得的最后一个主机名google.com
;如果你希望它总是再次获取它,你必须设置network.dnsCacheExpiration
在。0
about: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.conf
Linux系统内部。对于/etc/netsvc.conf
AIX 服务器,在系统中视窗在 MacOS 系统中可以使用lookupd -configuration
(搜索 LookupOrder,类似于:)列出。Cache FF DNS NI DS
实际的顺序变得复杂并且通常令人费解,因为每个名称解析服务都可以(而且很多时候)查看其他级别的解析。像(通常位于、或(或两者)dnsmasq
的轻型 DNS 服务器)通常读取并包含文件内容。或者像(一个基本解析器,应该只解析像 一样的非点名称)在某些情况下直接调用点名称( )的 DNS 解析。127.0.0.1:53
::1:53
/etc/hosts
systemd.resolver
mycomputer
mycomputer.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 服务器(绑定、未绑定等)控制。
所以:
- 如果主机名可以在/etc/hosts中解析,那么DNS是在/etc/hosts之后应用来解析主机名还是将/etc/hosts解析的IP地址视为“主机名”来递归解析?
没有任何。
如果主机名可以在 中解析/etc/hosts
,则不DNS
适用(如果文件位于 DNS 之前)。
也不是被视为“主机名”的已解析 IP 地址。
它只是:已解析的地址。
浏览器
浏览器可以使用任何方法来解析名称(在检查了已解析名称的缓存之后)。仅当它使用系统提供的方法时,上面给出的顺序才适用。浏览器与任何程序一样,可以选择直接联系任何 DNS 服务器。
如果系统顺序有/etc/hosts
before DNS
,则表示该文件中的条目将优先DNS
解析服务。
所以:
- ...这是否意味着 /etc/hosts 会覆盖 DNS 来解析主机名?
是(如果浏览器使用系统提供的分辨率)。
为什么不
/etc/hosts
重新申请,导致网站无法连接?
只有在该特定名称的浏览器内部缓存被清除(或超时)后,才会在浏览器外部再次搜索该名称。
如果浏览器在其缓存中解析了名称,则浏览器会再次使用它。
或者干脆关闭(稍等片刻)并重新启动浏览器。