无法解析我办公室局域网内部的 .local 域

TPP*_*PPZ 14 dns debian mdns

在 Linux Debian 9 上,我能够解析特定的本地域,例如my.sample-domain.local使用诸如nslookup或 之类的命令host,但不能使用诸如ping或 Postgres 客户端之类的其他命令psql

我认为像网络管理器这样的东西已经正确设置了我的 DNS 解析器(内容/etc/resolv.conf),所以我不确定为什么会发生这种情况?

我与一位使用 Windows 10 的同事进行了核实,他们的主机文件中没有任何自定义条目,尽管在他们的情况下,Windows 版本ping和 Postgres 的数据库 UI 可以按预期工作,将域解析为 IP 地址。

请参阅以下内容:

$ ping my.sample-domain.local
ping: my.sample-domain.local: Name or service not known

$ host my.sample-domain.local
my.sample-domain.local has address <THE_IP_REPRESENTING_THE_LOCAL_DOMAIN>

$ ping -c 5 <THE_IP_REPRESENTING_THE_LOCAL_DOMAIN>
PING <THE_IP_REPRESENTING_THE_LOCAL_DOMAIN> (<THE_IP_REPRESENTING_THE_LOCAL_DOMAIN>) 56(84) bytes of data.
64 bytes from <THE_IP_REPRESENTING_THE_LOCAL_DOMAIN>: icmp_seq=1 ttl=128 time=1.16 ms
64 bytes from <THE_IP_REPRESENTING_THE_LOCAL_DOMAIN>: icmp_seq=2 ttl=128 time=0.644 ms
64 bytes from <THE_IP_REPRESENTING_THE_LOCAL_DOMAIN>: icmp_seq=3 ttl=128 time=0.758 ms
64 bytes from <THE_IP_REPRESENTING_THE_LOCAL_DOMAIN>: icmp_seq=4 ttl=128 time=0.684 ms
64 bytes from <THE_IP_REPRESENTING_THE_LOCAL_DOMAIN>: icmp_seq=5 ttl=128 time=0.794 ms

--- <THE_IP_REPRESENTING_THE_LOCAL_DOMAIN> ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4056ms
rtt min/avg/max/mdev = 0.644/0.808/1.160/0.183 ms

$ nslookup my.sample-domain.local
Server:        <THE_IP_REPRESENTING_THE_NAMESERVER>
Address:    <THE_IP_REPRESENTING_THE_NAMESERVER>#53

Non-authoritative answer:
Name:    my.sample-domain.local
Address: <THE_IP_REPRESENTING_THE_LOCAL_DOMAIN>


$ cat /etc/resolv.conf
domain <AN_INTERNAL_DOMAIN>
search <AN_INTERNAL_DOMAIN>
nameserver <THE_IP_REPRESENTING_THE_NAMESERVER>
nameserver <ANOTHER_IP_REPRESENTING_THE_NAMESERVER>
Run Code Online (Sandbox Code Playgroud)

编辑:

同时我意识到在同一个办公室局域网中有一个 Ubuntu 16 虚拟机,所以我登录它并尝试在ping那里工作的命令。

此外,Ubuntu VM 中没有任何特定的自定义设置/etc/hosts(与我的 Debian 9 笔记本电脑相同,没有定制/etc/hosts)。

两者/etc/resolv.conf看起来相似(一些共享域/IP,同一域的一些其他 IP)。

然而,文件/etc/nsswitch.conf是不同的,所以我认为这mdsn4_minimal和主机解析的顺序有关系,就像mdsn4_minimal之前一样dns

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

在 Ubuntu 上:

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

编辑2:

Ubuntu 16 VM 和我的 Debian 9 笔记本电脑都能够.local使用该dig命令解析该域。

seb*_*sth 25

hostnslookup执行 DNS 查找,但是大多数应用程序使用 glibc 的名称服务开关来决定如何查找主机名。

/etc/nsswitch.conf可能启用了 mDNS,这可能会导致解析.local名称时出现问题。如果您认为不需要 mDNS 服务,您可以更改查找的顺序或删除它。

nsswitch.conf的 has mdns4_minimal,它执行mDNS查找(用于.local名称)。在[NOTFOUND=return]它会导致查询,以停止后,因此DNS是从来没有使用过您的应用程序无法解析主机名。您可以删除整个mdns4_minimal [NOTFOUND=return],因此不使用 mDNS 查找,或者只删除 NOTFOUND 操作,以便在 mDNS 查找失败时进行 DNS 查找。

有关更多详细信息,我建议查看Name Service Switch 文档

  • 如果您真的设置了一个名为“.local”的域,那么您的 IT 人员是无能的。以 `.local` 结尾的名称是为 mDns 保留的。LLMNR(Link-local Multicast Name Resolution)是微软的多播 DNS 竞争版本,也采用了这个约定:Windows 客户端会将“.local”视为非 DNS 域。`.local` 并非孤立于某些与 Cisco 和 Windows 无关的“外来”技术。 (2认同)

Rui*_*iro 9

这里更大的问题是:众所周知,.local在设置 DNS 基础设施时不应使用以 结尾的 DNS 域名。

.local use 是为 zeroconf/avahi aka bonjour 使用保留的,它们是除 DNS 之外用于解析本地名称/服务的并行服务。

在某些情况下,您的内部 DNS 名称服务肯定会与 zeroconf 发生冲突。因此,您接受的问题中的解决方案。

从长远来看,您的内部网络 DNS 名称不应以.local.

PS 顺便说一句,除了 DNS,本地 Microsoft DC/AD 也不应该被命名.local。如果你这样做,你会遇到奇怪的问题。

多播 DNS (mDNS) 标准。
互联网工程任务组 (IETF) 标准跟踪 RFC 6762(2013 年 2 月 20 日)保留使用域名标签 local 作为局域网中可通过多播 DNS 解析的主机名的伪顶级域名称解析协议。

来自 MS Technet(维基百科)

如果您有运行 Macintosh OS X 10.3 版或更高版本操作系统的 Macintosh 客户端计算机,...建议您不要将 .local 标签用于内部域的完整 DNS 名称。如果必须使用 .local 标签,则还必须在 Macintosh 计算机上配置设置,以便它们可以发现网络上的其他计算机

RFC 6762

对以“.local”结尾的名称的任何 DNS 查询。必须发送到
mDNS IPv4 链路本地多播地址 224.0.0.251(或其 IPv6
等效的 FF02::FB)。

......

  1. 反向地址映射

    与“.local.”一样,IPv4 和 IPv6 反向映射域也被定义为链路本地:

    对以“254.169.in-addr.arpa”结尾的名称的任何 DNS 查询。必须发送到 mDNS IPv4 链路本地多播地址 224.0.0.251 或 mDNS IPv6 多播地址 FF02::FB。由于此域下的名称对应于 IPv4 链接本地地址,因此本地链接是查找与这些名称相关的信息的最佳位置是合乎逻辑的。

......

为明确以“.local”结尾的名称启用和禁用多播 DNS 不需要特殊控制。由用户输入。
用户不需要为以“.local.”结尾的名称禁用多播 DNS,因为如果用户不想使用多播 DNS,他们可以通过不使用这些名称来实现这一点。
如果用户确实输入了以“.local.”结尾的名称,那么我们可以安全地假设用户的意图可能是它应该起作用。

虽然不是来自官方来源,但我也发现了这一点,其中有一段很好地解释了这个问题:停止使用 .local 作为 LAN 的顶级域

.local 域就是所谓的伪顶级域。这意味着什么?这意味着它不是互联网上可用(可路由)的官方顶级域,但它具有半官方地位,因为它用于某些应用程序。
在 .local 的情况下,它由多播域名服务 (mDNS) 使用。实现此服务的主机使用 .local 作为他们的域名,并有自己的解析名称的方式。通常,这不会有问题;但是,如果您还在网络上使用 .local 作为顶级域实施 DNS,则会导致严重的名称解析问题。
我已经看到这种情况在 Linux 系统上发生了很多,我想 Apple 的 OS X 可能也会有这些问题。通常,在这些类型的网络上,您会发现 DNS 名称解析根本不起作用或仅在某些时候起作用。最后,您最终不得不一直使用 IP 地址,因为您不知道名称是否可以解析(这首先否定了拥有 DNS 服务器的全部意义)。