在 Linux Debian 9 上,我能够解析特定的本地域,例如使用或my.sample-domain.local
等命令,但不能使用或 Postgres 客户端等其他命令。nslookup
host
ping
psql
我认为网络管理器之类的东西已经正确设置了我的 DNS 解析器( 的内容/etc/resolv.conf
),所以我不确定为什么会发生这种情况?
我与使用 Windows 10 的同事进行了检查,他们的主机文件中没有任何自定义条目,尽管在他们的情况下,ping
Postgres 的 Windows 版本和数据库 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>
编辑:
与此同时,我意识到同一个办公室 LAN 中有一个 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
在 Ubuntu 上:
hosts: files dns
编辑2:
Ubuntu 16 VM 和我的 Debian 9 笔记本电脑都能够.local
使用该dig
命令解析该域。
答案1
host
并nslookup
执行 DNS 查找,但是大多数应用程序使用 glibc名称服务开关决定如何查找主机名。
您可能启用了 mDNS,这可能会在解析名称/etc/nsswitch.conf
时导致问题。.local
您可以更改查找的顺序,或者如果您认为不需要 mDNS 服务,则可以直接删除它。
你nsswitch.conf
的有mdns4_minimal
,确实如此组播DNS查找(.local
名称)。之后[NOTFOUND=return]
它会导致查找停止,因此永远不会使用 DNS,并且您的应用程序无法解析主机名。您可以删除整个mdns4_minimal [NOTFOUND=return]
,以便不使用 mDNS 查找,或者仅删除 NOTFOUND 操作,以便在 mDNS 查找失败时进行 DNS 查找。
有关更多详细信息,我建议查看名称服务切换文档。
答案2
这里更大的问题是:众所周知,.local
在设置 DNS 基础设施时不应使用以 结尾的 DNS 域名。
.local
保留用于 Zeroconf/avahi 又名 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 客户端计算机运行 Macintosh OS X 10.3 版操作系统或更高版本,...建议您不要使用 .local 标签作为内部域的完整 DNS 名称。如果必须使用 .local 标签,则还必须在 Macintosh 计算机上配置设置,以便它们可以发现网络上的其他计算机
RFC 6762
对以“.local”结尾的名称的任何 DNS 查询。必须发送到
mDNS IPv4 链路本地多播地址 224.0.0.251(或其 IPv6
等效 FF02::FB)。
......
反向地址映射
与“.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 作为域名,并有自己的名称解析方式。通常,这不会成为问题;但是,如果您还在网络上实施 DNS,并将 .local 作为顶级域,则会导致严重的名称解析问题。
我在 Linux 系统上经常看到这种情况发生,我想 Apple 的 OS X 也可能会遇到这些问题。通常,在这些类型的网络上,您会发现 DNS 名称解析根本不起作用或仅在某些时候起作用。最后,您最终不得不一直使用 IP 地址,因为您不知道名称是否可以解析(这从一开始就否定了拥有 DNS 服务器的全部意义)。