我运行的是我认为相当标准的 nerd 设置。统一网络设备、用于广告拦截的本地 DNS 和自定义内部域映射 ( *.home
)。
非常频繁地,我的 Mac 会突然因内部 DNS 而失败。foo.home
?从未听说过。外部 DNS 继续不受影响。因此,我疲惫地打破了旧的sudo killall -HUP mDNSResponder
(有时两次),突然间一切又恢复正常了。
dig
并且nslookup
不使用 macOS dns 系统,它们在这些中断期间仍能继续正常工作。
在停机时,如果我运行,dscacheutil -q host -a name foo.home
则什么也得不到。重新启动mDNSResponder
,它会正常提供输出:
name: foo.home
ip_address: 192.168.1.4
相同dns-sd -q foo.home
:
DATE: ---Wed 12 Jul 2023---
10:39:54.691 ...STARTING...
Timestamp A/R Flags IF Name Type Class Rdata
10:39:54.692 Add 40000002 0 foo.home.v Addr IN 0.0.0.0 No Such Record
然后重新启动 mDNSResponder 并:
DATE: ---Wed 12 Jul 2023---
10:58:17.585 ...STARTING...
Timestamp A/R Flags IF Name Type Class Rdata
10:58:17.591 Add 2 0 foo.home. Addr IN 192.168.1.4
这种故障经常会毒害浏览器内部 DNS 缓存,我必须清除它,到目前为止我所见过的 Brave、Firefox 和 Safari 都是这种情况。
这是我的scutil --dns
输出:
DNS configuration
resolver #1
search domain[0] : tail44a85.ts.net
search domain[1] : home
nameserver[0] : 100.100.100.100
if_index : 22 (utun3)
flags : Supplemental, Request A records, Request AAAA records
reach : 0x00000003 (Reachable,Transient Connection)
order : 100200
resolver #2
nameserver[0] : 192.168.1.4
nameserver[1] : 9.9.9.9
if_index : 15 (en0)
flags : Request A records
reach : 0x00020002 (Reachable,Directly Reachable Address)
order : 200000
resolver #3
domain : tail44a85.ts.net.
nameserver[0] : 100.100.100.100
if_index : 22 (utun3)
flags : Supplemental, Request A records, Request AAAA records
reach : 0x00000003 (Reachable,Transient Connection)
order : 100201
resolver #4
domain : local
options : mdns
timeout : 5
flags : Request A records
reach : 0x00000000 (Not Reachable)
order : 300000
resolver #5
domain : 254.169.in-addr.arpa
options : mdns
timeout : 5
flags : Request A records
reach : 0x00000000 (Not Reachable)
order : 300200
resolver #6
domain : 8.e.f.ip6.arpa
options : mdns
timeout : 5
flags : Request A records
reach : 0x00000000 (Not Reachable)
order : 300400
resolver #7
domain : 9.e.f.ip6.arpa
options : mdns
timeout : 5
flags : Request A records
reach : 0x00000000 (Not Reachable)
order : 300600
resolver #8
domain : a.e.f.ip6.arpa
options : mdns
timeout : 5
flags : Request A records
reach : 0x00000000 (Not Reachable)
order : 300800
resolver #9
domain : b.e.f.ip6.arpa
options : mdns
timeout : 5
flags : Request A records
reach : 0x00000000 (Not Reachable)
order : 301000
DNS configuration (for scoped queries)
resolver #1
search domain[0] : home
nameserver[0] : 192.168.1.4
nameserver[1] : 9.9.9.9
if_index : 15 (en0)
flags : Scoped, Request A records
reach : 0x00020002 (Reachable,Directly Reachable Address)
resolver #2
search domain[0] : tail44a85.ts.net
nameserver[0] : 100.100.100.100
if_index : 22 (utun3)
flags : Scoped, Request A records, Request AAAA records
reach : 0x00000003 (Reachable,Transient Connection)
我在互联网上看到过一些传言,说“后备” DNS 可能会造成问题,即 mDNSResponder 尝试使用本地 DNS,由于网络或服务异常而出现问题,然后将其注销并转到 DNS#2。我不确定如何测试这个假设。我在 DHCP 配置中提供 2 个 DNS,因为如果本地服务发生故障/崩溃等,其他房屋居住者不会经历“互联网”的完全故障。
我确实运行了 Tailscale,但我发现这个问题在我使用它之前就存在了。
我的本地 DNS 服务是作为 HomeAssistant Supervised Docker 容器运行的 Adguard。DHCP 由 Unifi USG 提供。
我曾尝试解析 Console.app 中 mDNSResponder 的日志,但是它有点神秘,因为它似乎对值进行哈希处理,而我不能 100% 确定我想要的是什么。
互联网上有很多关于此类事情的评论,其中一些比较有趣:
- https://discussions.apple.com/thread/254717652
- https://www.reddit.com/r/MacOS/comments/s4ngui/dns_issues_on_safari/
我发现这个问题早于 Ventura。这个问题已经持续了好几年,我已经厌倦了,所以想弄清楚到底发生了什么。