在 Linux Debian 9 上,我能够解析特定的本地域,例如my.sample-domain.local
使用一些命令,如nslookup
or 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>
编辑:
同时我意识到在同一个办公室局域网中有一个 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
host
并nslookup
执行 DNS 查找,但是大多数应用程序使用 glibc 的名称服务开关来决定如何查找主机名。您
/etc/nsswitch.conf
可能会启用 mDNS,这可能会导致解析.local
名称时出现问题。如果您认为不需要 mDNS 服务,您可以更改查找的顺序或删除它。你
nsswitch.conf
的 hasmdns4_minimal
,它进行mDNS查找(用于.local
名称)。[NOTFOUND=return]
之后它会导致查找停止,因此从不使用 DNS,并且您的应用程序无法解析主机名。您可以删除整个mdns4_minimal [NOTFOUND=return]
,因此不使用 mDNS 查找,或者仅删除 NOTFOUND 操作,以便在 mDNS 查找失败时进行 DNS 查找。有关更多详细信息,我建议查看名称服务切换文档。
这里更大的问题是:众所周知,
.local
在设置 DNS 基础设施时不应使用以结尾的 DNS 域名。.local
use 保留用于 zeroconf/avahi aka bonjour 使用,它们是用于解析除 DNS 之外的本地名称/服务的并行服务。在某些情况下,您的内部 DNS 名称服务肯定会与 zeroconf 发生冲突。因此,您接受了问题中的解决方案。
从长远来看,您的内部网络 DNS 名称不应以
.local
.PS 顺便说一句,除了 DNS,也不应该命名本地 Microsoft DC/AD
.local
。如果你这样做,你会遇到奇怪的问题。来自 MS Technet(维基百科)
RFC 6762
……
……
虽然不是来自官方来源,但我也发现了这个,其中有一段很好地解释了这个问题:停止使用 .local 作为 LAN 的顶级域
也许您的NBNS与DNS冲突,因此请更正,或编辑您的主机文件,或包装您的命令;
应使用dig检查 DNS ;
我猜主机首先搜索 NBNS(或相反)。