mDNS和.local域名后缀

Nov 13, 2022 at 01:15:57

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

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

nslookup bt.local也正常

nslookup bt.local解析正常

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

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

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

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

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

最好的办法是换一个后缀:
https://serverfault.com/questions/17255/top-level-domain-domain-suffix-for-private-network

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

Openwrt配置方式如下:
Openwrt配置自定义local domain suffix

换成.internal后缀之后局域网页面访问正常。

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