macOS DNS优先级由服务序号决定,仅用最高优先级活动服务的DNS列表;单服务内按顺序尝试但动态降级不可用服务器,IPv4与IPv6地址独立评分,可通过日志实时捕获决策过程。

当 macOS 系统配置了多个网络接口或同一接口下设置多组 DNS 服务器时,系统并非按列表顺序线性使用,而是依据一套隐式优先级与响应能力动态决策。以下是对其 DNS 优先级排列规则与自动切换行为的逐层解析:
一、DNS 服务器列表的层级归属与继承关系
macOS 将 DNS 配置绑定至特定服务(如 Wi-Fi、以太网),每个服务可独立配置 DNS 服务器列表;系统不合并所有服务的 DNS 列表,而是仅采用当前**活动且具有最高服务序号(Service Order)的服务所定义的 DNS 列表**。服务序号由“网络”偏好设置中的拖拽顺序决定,顶部服务拥有最高优先级。
1、打开“系统设置” → “网络”,点击右下角“详细信息…”按钮。
2、切换到“DNS”标签页,确认当前选中服务所显示的 DNS 服务器地址。
3、点击左下角“齿轮”图标 → “设定服务顺序…”,观察各服务从上至下的排列,顶部服务的 DNS 列表即为系统实际使用的唯一 DNS 源。
二、单服务内 DNS 服务器的查询执行顺序
在同一网络服务内部,DNS 服务器按用户输入顺序从上至下排列,但系统并非严格轮询或固定主备;它会持续探测各服务器的可达性与响应延迟,并基于实时表现动态调整使用倾向:首台服务器在无超时、无拒绝响应的前提下被优先发送全部查询;一旦出现超时(默认 5 秒)或 NXDOMAIN/NODATA 类明确否定响应,后续查询将立即转向列表中下一台可用服务器。
1、在“DNS”标签页中,查看已添加的 DNS 地址行,其垂直顺序即为初始尝试顺序。
2、执行 sudo killall -HUP mDNSResponder 重载 DNS 缓存服务,使新顺序立即生效。
3、使用 scutil --dns 命令输出当前生效的 DNS 配置,其中 “nameserver[0]” 对应当前被系统标记为首选的服务器地址。
三、DNS 响应质量反馈驱动的自动降级与回升机制
macOS 内建 DNS 解析器(mDNSResponder)会持续记录每台 DNS 服务器的响应时间、超时次数及错误码频率,并据此维护一个内部“健康度评分”。当某服务器连续超时或返回 SERVFAIL 超过阈值,系统将其临时标记为“不可用”,跳过该条目,将查询转发至下一顺位;若该服务器后续恢复稳定响应,评分回升,系统会在数分钟内自动将其重新纳入活跃候选队列,无需手动干预。
1、运行 sudo dscacheutil -flushcache; sudo killall -HUP mDNSResponder 清除历史评分缓存。
2、使用 dig @8.8.8.8 google.com +short 和 dig @1.1.1.1 google.com +short 分别测试不同服务器的原始响应延迟。
3、观察 scutil --dns 输出中 “timeout” 字段数值变化,数值持续大于 0 表明对应服务器已被系统判定为高延迟或不稳定。
四、IPv4 与 IPv6 DNS 条目的独立优先级判定
若同一服务中同时配置 IPv4 和 IPv6 地址的 DNS 服务器(例如 8.8.8.8 与 2001:4860:4860::8888),系统将它们视为完全独立的实体,各自维护健康度评分与超时状态。即使 IPv4 地址被降级,IPv6 地址仍可能保持首选地位;反之亦然。系统不会因某协议栈故障而自动切换至另一协议的同源 DNS。
1、在“DNS”设置中,同时添加 IPv4 和 IPv6 格式的同一服务商 DNS 地址(如 Google 的双栈地址)。
2、执行 networksetup -getdnsservers Wi-Fi 查看当前服务实际读取的 DNS 列表,确认两类地址是否共存。
3、使用 dig google.com AAAA @2001:4860:4860::8888 单独验证 IPv6 DNS 功能,其结果不影响 IPv4 DNS 的健康度评分或调用顺序。
五、mDNSResponder 日志中 DNS 决策行为的实时捕获
系统默认不记录 DNS 选择过程,但可通过启用调试日志获取完整决策链:包括每次查询选定的服务器、响应耗时、是否触发切换、切换原因(timeout/SERVFAIL/REFUSED)等。该日志直接反映内核级 DNS 路由逻辑,是验证优先级与切换真实行为的最权威依据。
1、执行 sudo dscacheutil -setdebugmask 0x8000 启用 DNS 查询跟踪。
2、运行 sudo log stream --predicate 'subsystem == "com.apple.mDNSResponder"' --info 实时监听日志流。
3、在另一终端执行 ping example.com 触发 DNS 查询,日志中出现 “Using DNS server X.X.X.X” 即表示该次查询实际选用的服务器。










