mDNS和.local域名后缀

0x015f
April 10th, 2022

Openwrt会自动将局域网主机名增加一个.local后缀,解析到局域网IP地址上。比如局域网内有一个设备名叫bt,此时Openwrt会解析域名bt.local到该设备IP。当使用Windows设备、Android手机时,能够正确打开http://bt.local,而使用Mac、Manjaro时却提示域名解析失败。

bt.local域名解析失败
bt.local域名解析失败

直接dig bt.local测试,解析正常

dig bt.local解析正常
dig bt.local解析正常

nslookup bt.local也正常

nslookup bt.local解析正常
nslookup bt.local解析正常

所以说Openwrt自带的DNS服务器是正常的,问题出在客户端上。

查看/etc/nsswitch.conf配置,发现有一个mdns4_minimal优先级比较高,并且配置了[NOTFOUND=return],当域名未找到时直接返回报错,而不是接着往下走。

mdns4_minimal模块响应.local域名请求
mdns4_minimal模块响应.local域名请求

mDNS是一个广播DNS协议,一般用于局域网内互相发现,.local后缀是该协议的保留后缀。所以当.local请求落到mdns4_minimal这个模块时,经过广播协议去局域网中寻找local后缀域名(当然肯定找不到,因为我是在Openwrt上强行配置的劫持记录,局域网内的客户端并不会主动响应广播),未找到则直接返回空,导致域名无法解析。

如果临时去掉上图中的红框部分,bt.local恢复正常解析。

问题出在.local后缀属于mDNS的保留后缀,该后缀的请求会被Mac、Manjaro等客户端识别为广播请求,如果广播出去之后未收到响应则直接返回解析为空,不会继续去网关上做DNS查询,即使网关上配置了DNS劫持记录也不会生效。

最好的办法是换一个后缀:

我测试.lan识别不正确,会触发Firefox的搜索功能,换成.internal能够被Firefox正常识别,推荐使用.internal。

Openwrt配置方式如下:

Openwrt配置自定义local domain suffix
Openwrt配置自定义local domain suffix

换成.internal后缀之后访问正常:

bt.internal访问正常
bt.internal访问正常

.local后缀比较特殊,不建议在任何场景下使用该后缀,会导致意想不到的兼容问题。内网可以使用.internal作为劫持后缀,Firefox可以正常支持,也不会和公网域名冲突。

Arweave TX
GojjB7I2_h4VTDiTv2gT-9_xJTmnVGIJ5VkqTicMcF0
Ethereum Address
0x015fF08E0898733d50F12958f8208B8BB18f18F4
Content Digest
zKEK1GHoMeKams1ZDfPZ9lqI8RZbSCSoVolmlzOTAXA