在 Linux 中,如何/etc/hosts
与 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
再次申请,以至于无法连接网站?
谢谢。
这是由 NSS(名称服务切换)配置(即
/etc/nsswitch.conf
文件hosts
指令)决定的。例如,在我的系统上:这里,
files
指的是/etc/hosts
文件,dns
指的是DNS系统。你可以想象先到者获胜。此外,请参阅
man 5 nsswitch.conf
了解更多关于此的想法。顺便说一句,要遵循 NSS 主机解析顺序,请使用
getent
withhosts
作为数据库,例如:仅回答您的最后一个问题:
/etc/hosts
不会立即再次申请,因为firefox
正在缓存它获得的最后一个主机名google.com
;如果您希望它始终再次获取它,则必须设置network.dnsCacheExpiration
为0
inabout: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-only
gethostbyname()
,它自古以来就被弃用了。文件
/etc/hosts
和 DNS 不能一起工作。它们提供独立的名称解析(网络名称)。链接它们的胶水在linux 系统内部
/etc/nsswitch.conf
。在/etc/netsvc.conf
AIX 服务器中,在Windows系统中,在 MacOS 系统中可以使用lookupd -configuration
(搜索 LookupOrder,类似于:)列出。Cache FF DNS NI DS
实际顺序变得复杂并且通常令人费解,因为每个名称解析服务都可以(并且很多时候)查看其他级别的解析。像(通常位于或(或两者)
dnsmasq
的轻型 DNS 服务器)通常读取并包含文件内容。或者 like (一个基本的解析器,应该只解析不带点的名称 like )在某些情况下直接调用带点名称的 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
):请注意,非常旧的(glibc 2.4 和更早版本)
order
条目设置/etc/host.conf
为:仅适用于文件(file
/etc/hosts
)名称服务。与 NIS 和 LDAP 相关的(linux)客户端计算机上的影响(通常)由使用的 DNS 服务器控制(绑定、未绑定等)。
所以:
没有任何。
如果主机名可以在 中解析
/etc/hosts
,DNS
则不适用(如果文件在 DNS 之前)。解析的 IP 地址也不被视为“主机名”。
它只是:解析的地址。
浏览器
浏览器可以使用任何方法来解析名称(在它检查了已解析名称的缓存之后)。只有当它使用系统提供的方法时,上面给出的顺序才适用。与任何程序一样,浏览器可以选择直接联系任何 DNS 服务器。
如果系统顺序有
/etc/hosts
beforeDNS
,则表示该文件中的条目将优先于DNS
解析服务。所以:
是(如果浏览器使用系统提供的分辨率)。
只有在清除该特定名称的浏览器内部缓存(或超时)之前,才会再次在浏览器外部搜索该名称。
如果浏览器在其缓存中解析了名称,则浏览器会再次使用它。
使用它来清除缓存。
或者干脆关闭(等待一段时间)并重新启动浏览器。