![Mac OS X 10.9 将子域名视为顶级域名?](https://linux22.com/image/1409557/Mac%20OS%20X%2010.9%20%E5%B0%86%E5%AD%90%E5%9F%9F%E5%90%8D%E8%A7%86%E4%B8%BA%E9%A1%B6%E7%BA%A7%E5%9F%9F%E5%90%8D%EF%BC%9F.png)
我似乎总是无法从 OS X 系统解析网络上的主机。我有一个域名(我们称之为 mydomain.com),其中包含一个 lab.mydomain.com 子域名,而我想要访问的主机位于 host.lab.mydomain.com。
我的 Mac 的 DNS 搜索条目包括:
- 我的域名
- lab.mydomain.com
- lab.otherdomain.com
- othersubdomain.otherdomain.com
我可以很好地解析完整的“host.lab.mydomain.com”,并且当列表中有“lab.mydomain.com”时,我可以只使用“host”,因为它在“lab.mydomain.com”后缀下解析。但我无法解析(在某些情况下 - 请继续阅读)“host.lab”。
最奇怪的是这次失败仅有的某些命令(即 SSH 和 dig)会出现这种情况。使用“nslookup”工作正常并正确解析主机名。但是,使用 SSH 或 dig失败。我通常可以(但并非总是)通过 Chrome 解析“host.lab”。
我在端口 53 上运行了 tcpdump 过滤,尝试自己诊断这个问题,结果很有趣:在运行“dscacheutil -flushcache; killall -HUP mDNSResponder”并尝试使用不同的命令进行解析后,我发现“nslookup”当然会按顺序使用每个后缀对我配置的 DNS 服务器进行正确的查找,从而很快找到了主机。但是,ssh 和 dig 似乎将“host.lab”视为顶级域名并直接进入 root-servers.net 尝试将“host”解析为“.lab”顶级域名下的域名——无需曾经触摸我配置的 DNS 服务器!
这是怎么回事?为什么我的 Mac 上的某些名称解析方案会短路并将 .lab 视为顶级域名,而不是遵守我的 DNS 搜索后缀?当然,我可以通过输入完整域名来解决这个问题,但这真的非常烦人。
答案1
请记住,nslookup
和dig
是 DNS调试工具。它们有自己的内置解析器代码,其行为方式与常规应用程序使用的系统解析器不同。默认情况下,dig
从不附加搜索列表域尝试完全限定一个名称,即使你只给它“主机”(它会将其视为顶级域名),但nslookup
结果却相反,始终附加搜索列表域(试图“帮助”您)。这些工具与调试工具相比,简直是天壤之别。
大多数命令行应用程序(如“ssh”)使用 BSD 库进行名称查找,其中的解析器代码来自绑定它将任何带有“.”的名称视为完全合格的域,并且不会附加搜索列表域。至于为什么会这样,有一个很长的肮脏历史,但这种方式最能避免在一般意义上搜索列表附加时发生的冲突和名称“冲突”。您可以阅读有关该主题的最新分析。
现在您已经理解了这一点,请在您的应用程序中使用“host”或“host.lab.mydomain.com”。;-)
答案2
来自dig
的手册页:
Mac OS X NOTICE
The dig command does not use the host name and address resolution or
the DNS query routing mechanisms used by other processes running on Mac
OS X. The results of name or address queries printed by dig may differ
from those found by other processes that use the Mac OS X native name
and address resolution mechanisms. The results of DNS queries may also
differ from queries that use the Mac OS X DNS routing library.
当像您一样通过以下方式观察 DNS 事务时tcpdump
,我注意到 dig 正在发送一个完全限定的(带有尾随 .)DNS 查询,即使它未包含在命令行中:
192.168.2.122.61036 > 142.166.166.166.53: 51329+ A? www. (21)
这当然会失败。这是 编译的默认行为dig
;添加+search
参数将使其行为更加常规。
对于ssh
其他人,我发现本文建议向 mDNSresponder 的属性列表文件添加一个参数,以强制其使用搜索域。这也可能修复dig
。