macOS DNS 发生了什么?

macOS DNS 发生了什么?

我运行的是我认为相当标准的 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 提供。

Unifi DHCP DNS 设置

我曾尝试解析 Console.app 中 mDNSResponder 的日志,但是它有点神秘,因为它似乎对值进行哈希处理,而我不能 100% 确定我想要的是什么。

互联网上有很多关于此类事情的评论,其中一些比较有趣:

我发现这个问题早于 Ventura。这个问题已经持续了好几年,我已经厌倦了,所以想弄清楚到底发生了什么。

相关内容