macos 本身不提供一键式“dns 安全性检查”功能,但可通过组合配置与验证手段确认 dns 是否真实、加密、未被劫持:先正确配置可信 dns(含 doh/dot),再分层验证是否生效、是否走加密通道、是否绕过本地干扰。

macOS 本身不提供一键式“DNS 安全性检查”功能,但可通过组合配置与验证手段,确认当前 DNS 是否真实、加密、未被劫持。关键在于:先正确配置可信 DNS(含加密协议),再分层验证其是否生效、是否走加密通道、是否绕过本地干扰。
确认系统是否启用 DoH(macOS Ventura 及更新版本)
原生 DoH 支持从 macOS 13.0(Ventura)开始,仅对系统框架级应用(如 Safari、Mail、App Store)生效。验证方式如下:
- 进入「系统设置 → 网络 → 当前连接 → 详细信息 → DNS」,若添加的地址是 https:// 开头(如
https://cloudflare-dns.com/dns-query),且该条目位于列表顶部,则系统已识别为 DoH 服务器 - 右侧 DNS 条目旁会出现小锁图标(?),表示加密通道已启用——这是最直观的图形化提示
- 终端执行:
scutil --dns,查看输出中DNSServers字段是否为空;若非空,说明系统仍回退到传统 DNS,DoH 未接管成功(常见于配置顺序错误或网络切换后未刷新)
验证 DoT 或本地加密代理是否真正工作
对于通过 stubby 或 dnscrypt-proxy 配置的 DoT,或旧系统用 dnscrypt-proxy 实现的 DoH/DoT,需确认服务进程运行且流量被正确转发:
- 检查服务状态:
sudo brew services list | grep -E "(stubby|dnscrypt-proxy)",显示started表示后台运行正常 - 确认本地监听:
lsof -i :53 | grep LISTEN,应看到stubby或dnscrypt-proxy占用127.0.0.1:53 - 测试解析是否走本地代理:
dig example.com @127.0.0.1 +short,有返回结果即说明本地 DNS 服务可达;再对比dig example.com @1.1.1.1 +short,结果一致则无污染
抓包验证加密流量是否真实发出
明文 DNS(UDP 53)和加密 DNS(DoH/DoT)在网络层表现完全不同,Wireshark 是最可靠的终审工具:
- 启动 Wireshark,选择对应网卡(如 en0),过滤条件输入:
tcp.port == 443 && http.host contains "cloudflare-dns.com"(DoH)或tls.handshake.server_hello && ip.addr == 1.1.1.1(DoT) - 在 Safari 中访问任意网站,观察是否有匹配的 HTTPS/TLS 流量出现;若只有 UDP 53 包而无 TLS/HTTPS 请求,说明加密未生效
- 注意:
curl和dig默认不走系统加密 DNS,它们仍会直连上游 53 端口,因此不能用于验证 DoH/DoT 是否启用
排除常见干扰项确保 DNS 干净
即使配置了加密 DNS,以下几类干扰仍可能导致解析异常或降级回明文:
-
/etc/hosts 被篡改:终端执行
sudo cat /etc/hosts,检查是否存在将正常域名映射到0.0.0.0或广告 IP 的行 -
mDNSResponder 缓存污染:执行
sudo dscacheutil -flushcache; sudo killall -HUP mDNSResponder清除全部缓存(Ventura+ 必须两条都运行) - DHCP 自动推送 DNS 未禁用:在「网络 → 详细信息 → 高级 → TCP/IP」中,确认勾选了「忽略来自 DHCP 服务器的 DNS 服务器地址」
- IPv6 DNS 干扰:在「网络 → 详细信息 → IPv6」中,将配置设为「仅本地链接」或「关闭」,避免某些 ISP 利用 IPv6 DNS 绕过 DoH











