在我的公司,当我安装 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
- “文件”模块搜索 /etc/hosts,然后返回“未找到”。
- 处理继续至下一个模块。
- “mdns4_minimal”模块使用多播 DNS (mDNS) 搜索本地 LAN 子网,然后返回“未找到”。
[NOTFOUND=return]
表示在此错误之后不应继续处理;即应立即向程序返回“未找到”。- '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