/ etc / hosts和DNS如何一起工作以将主机名解析为IP地址?


10

在Linux中,/etc/hostsDNS 如何与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再次申请,以致我无法连接到该网站?

谢谢。


9
请注意,许多Web浏览器都实现了自己的DNS服务器和DNS缓存,并且不参考系统上已配置的任何名称查找机制。换句话说,某些Web浏览器会完全忽略/etc/hosts和本地定义的名称服务器。第一次见到实在令人困惑。(看着您,基于Chromium的浏览器!)
Christopher

@克里斯托弗,我来这里是说同样的话。相关unix.stackexchange.com/questions/363498/...
瑞˚F里贝罗

@Christopher将行重新添加到/ etc / hosts之后,即使刷新网页后,我仍然可以连接到网站。为什么/ etc / hosts不再适用,所以我无法连接到该网站?是因为Firefox的DNS缓存吗?
蒂姆(Tim)

@RuiFRibeiro这个Chromium构建似乎很尊重/etc/hosts和系统定义的DNS服务器:(github.com/Eloston/ungoogled-chromium)。使用Homebrew在macOS上安装:brew cask install eloston-chromium
Christopher

Answers:


21

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

hosts:    files mdns4_minimal [NOTFOUND=return] dns

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

另外,请参阅man 5 nsswitch.conf以了解更多信息。


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

getent hosts example.com

谢谢。在我的第2部分中,是否是因为Web浏览器的DNS服务器不起作用,而Web浏览器的DNS缓存起作用了?
蒂姆(Tim)

如何systemd.resolver影响分辨率?NIS和LDAP在哪里适合解析系统?MacOS系统或Windows系统遵循什么顺序?
艾萨克(Isaac)

@Tim是的,您的浏览器正在从缓存中获取数据。
heemayl

7

仅回答您的最后一个问题:/etc/hosts不会立即再次应用,因为firefox正在缓存它获得的最后一个主机名google.com;如果您希望它总是再次获取它,则必须设置network.dnsCacheExpiration0in about:config。更多信息(尽管有些过时)在这里。对不起,如果这是题外话。


附带说明,许多程序不使用标准解析器(getaddrinfo(3)getnameinfo(3)[1]),因为它很烂

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

其次,glibc(Linux中的标准C库)中的resolver实现非常糟糕,希望您允许它通过dlopen()背后将随机动态对象拉入地址空间,并且使其无法以任何方式包含它或以静态方式使用它链接的可执行文件。

由于许多程序不直接使用标准的解析器,他们也不用费心精确重现其行为,而忽略的部分或全部/etc/resolv.conf/etc/hosts/etc/nsswitch.conf/etc/gai.conf

[1]甚至不要提及非可重入的ipv4 only gethostbyname(),它从很久以来就已被弃用。


谢谢。你是什​​么意思“不可重入”?
蒂姆(Tim)

1
这意味着,如果您正在执行“ a”操作google = GHBN("google.com"); facebook = GHBN("facebook.com"),则可能会同时出现两者googlefacebook包含的地址facebook.com。当两个调用在不同的线程中完成时,它甚至更有趣:您可能会以半个google和半个facebook或完整的垃圾地址结尾。
比利叔叔

gethostbyname()现在取代了什么?
蒂姆(Tim)

1
getaddrinfo是该功能的标准功能,但正如我已经解释的那样,它本身就是烂摊子,因此浏览器或其他现实应用程序并未使用它。
比利叔叔

确实,例如,Firefox和Chrome使用了自己的解析器。感谢您的深刻见解。
Rui F Ribeiro

6

该文件/etc/hosts和DNS无法一起使用。它们提供名称(网络名称)的独立解析。

链接它们的粘合剂位于/etc/nsswitch.conflinux系统中。在/etc/netsvc.confAIX服务器中,在Windows系统中,可以在MacOS系统中用lookupd -configuration(搜索LookupOrder,类似于:)列出Cache FF DNS NI DS

实际顺序变得很复杂,并且通常很复杂,因为每个名称解析服务都可以(而且很多时候)可以在其他级别的解析中查看。就像dnsmasq(通常位于127.0.0.1:53::1:53(或同时位于)的light DNS服务器)通常读取并包含/etc/hosts文件内容。或类似systemd.resolver(基本解析器仅应解析未点缀的名称,如)在某些情况下mycomputer直接为点缀名称(mycomputer.here.dev.)调用DNS解析。

通常,服务是按顺序调用的,第一个不会失败的服务将获胜并被接受为正确的地址。通用基本顺序为:(/etc/hosts文件),mDNS(无点名),DNS,NIS,NIS +,LDAP。在某些linux系统中,服务中的计算机有不得已的解决方法hostnamemyhostname

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

hosts:          files mdns4_minimal [NOTFOUND=return] dns myhostname

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

order hosts,bind,nis

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

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

所以:

  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再次申请,以致我无法连接到该网站?

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

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

使用它来清除缓存

或者只是关闭(等待一会儿)然后重新启动浏览器。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.