为什么我需要更改 nsswitch.conf 中的主机顺序?

now*_*wox 11 dns ubuntu

在我的公司中,当我安装 Ubuntu 时,我无法 ping 任何本地机器:

$ ping foobar.mycompany.local
ping foobar.mycompany.local: Name or service not known
Run Code Online (Sandbox Code Playgroud)

但是,如果我把dns/etc/nsswitch.conf位于列表的开始,那么它的工作原理:

# hosts:          files mdns4_minimal [NOTFOUND=return] dns
hosts:          dns files mdns4_minimal [NOTFOUND=return]
Run Code Online (Sandbox Code Playgroud)

我想了解为什么。

use*_*686 15

您的公司使用以 结尾的 DNS 域.local,它实际上是一个特殊用途的后缀,由 IETF 保留用于多播 DNS。因此,因为您安装了 mDNS 客户端 (mdns4_minimal),它被配置为优先处理所有*.local名称。

(不幸的是,在企业内部网中仍然普遍的做法是仅组成一个不存在的域名或IP 地址范围,并希望它永远不存在......)


一一浏览您配置的模块:

hosts: files mdns4_minimal [NOTFOUND=return] dns
Run Code Online (Sandbox Code Playgroud)
  1. 'files' 模块搜索 /etc/hosts,然后返回“未找到”。
  2. 处理继续到下一个模块。
  3. 'mdns4_minimal' 模块使用多播 DNS (mDNS) 搜索本地 LAN 子网,然后返回“未找到”。
  4. [NOTFOUND=return]表示在此错误后不应继续处理;即“未找到”应立即返回给程序。
  5. 'dns' 模块永远不会到达。

为什么额外的“[NOTFOUND=return]”?根据各种消息来源,它可以加速不成功的查询并防止信息泄漏,并减少公共 DNS 服务器的负载。

假设某人的网络实际上使用了mDNS(这在 Linux/macOS 上很常见)。如果用户尝试解析“MyLittleLaptop.local”但没有找到,系统将继续尝试下一个模块('dns'),并将查询发送到公共 DNS(例如,发送到学校的 DNS 服务器,或咖啡店的路由器)。

但是 - 根据 IETF 的保留 -*.local名称不可能存在于公共 DNS 中,因此这样的查询将毫无用处,它所做的只是向网络管理员透露您的个人信息。因此添加了 [NOTFOUND=return] 标签以阻止它完全到达 DNS。


如果您的公司网络使用.local内部 DNS 并且您相当确定它永远不会使用 mDNS,您可以删除整个模块 – 结果:

hosts: files dns
Run Code Online (Sandbox Code Playgroud)

如果您想优先考虑 DNS,但保留使用 mDNS 的可能性,请将其移至最后:

hosts: files dns mdns_minimal
Run Code Online (Sandbox Code Playgroud)