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

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

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

$ ping foobar.mycompany.local
ping foobar.mycompany.local: Name or service not known

但如果我把它放在dns列表/etc/nsswitch.conf的开头,它就会起作用:

# hosts:          files mdns4_minimal [NOTFOUND=return] dns
hosts:          dns files mdns4_minimal [NOTFOUND=return]

我想了解原因。

答案1

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

(不幸的是,在企业内部网中,虚构一个不存在的域名或IP地址范围并希望它永远不存在......)


逐一检查已配置的模块:

hosts: files mdns4_minimal [NOTFOUND=return] dns
  1. “文件”模块搜索 /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

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

hosts: files dns mdns_minimal

相关内容