macOS 12+ 系统原生不支持 DoH/DoT,需通过.mobileconfig(macOS 12.3+)或 dnscrypt-proxy + launchd 配置;系统 DNS 框架仅影响 CFHost/NWEndpoint,curl/dig 等命令行工具默认不走加密 DNS。

macOS 12+ 系统原生支持 DoH / DoT 吗?
不支持。系统网络设置里没有 DoH 或 DoT 开关,networksetup 和 scutil 均无法直接配置加密 DNS 协议。Apple 把这事交给了「配置描述文件(.mobileconfig)」或底层网络扩展机制,普通用户点几下是配不出来的。
用配置描述文件强制启用 DoH(推荐给大多数用户)
这是目前最稳定、无需第三方工具、且能随网络切换自动生效的方式。但要注意:只在 macOS 12.3+ 和 iOS 15.4+ 生效,旧系统会静默忽略。
- 必须使用 Apple Configurator 2(Mac App Store 免费下载)生成
.mobileconfig,手写 XML 容易因签名或 schema 错误导致安装失败 - DoH 地址必须是 HTTPS URL,且服务端需支持 HTTP/2 和 TLS 1.3;常见错误是填了
http://或用了自签名证书的测试服务器 - 填写的
server-url不能带路径参数(如https://dns.google/dns-query合法,https://dns.google/dns-query?ct=application/dns-json会被系统截断) - 配置后可在「系统设置 > 网络 > 当前连接 > 详细信息 > DNS」看到加密标识(小锁图标),但不会显示协议类型——这是正常现象,别以为没生效
示例有效 DoH 地址:https://dns.google/dns-query、https://cloudflare-dns.com/dns-query
用 dnscrypt-proxy + launchd 实现 DoT(适合需要自定义路由或日志的用户)
如果你要过滤广告、分流国内域名、或调试 DNS 流量,dnscrypt-proxy 是更灵活的选择。但它不走系统 DNS 设置,得手动把网络接口的 DNS 指向 127.0.0.1,且必须禁用「自动配置 IPv6 DNS」这类干扰项。
- 安装后默认监听
127.0.0.1:53,但 macOS 的resolv.conf不被读取,必须用networksetup -setdnsservers Wi-Fi 127.0.0.1显式设置 -
dnscrypt-proxy.toml中的server_names要选明确支持DoT的条目(如cloudflare、quad9-dot),不是所有预设都开 DoT - 启动方式必须用
launchd(通过brew services start dnscrypt-proxy),直接运行进程会在睡眠唤醒后断连 - 遇到解析失败时先检查
sudo log show --predicate 'subsystem == "com.github.DNSCrypt.dnscrypt-proxy"' --last 5m,而不是盲调网络设置
为什么 Safari 能用 DoH 但终端 curl 或 dig 不走?
因为 macOS 的 DoH 配置只影响「系统 DNS 解析器框架(CFHost / NWEndpoint)」,而 curl 默认用 libc 的 getaddrinfo(),dig 直连 UDP 53。它们根本看不到你配的 DoH。
- 想让命令行工具走加密 DNS,唯一办法是让它们也查
127.0.0.1:53(即用dnscrypt-proxy方案),再配合networksetup全局指向 - 不要试图改
/etc/resolv.conf——它在 macOS 上是只读符号链接,指向/var/run/resolv.conf,由 mDNSResponder 动态生成 - 验证是否真正走加密通道:用
tcpdump -i lo0 port 853 or port 443抓包,看到 TLS 握手或 DoT 流量才算落地
真正的难点不在配置步骤,而在验证链路是否完整闭环——从系统策略、网络接口、应用层解析器到实际发包,中间任何一环脱钩,都会让你以为“配好了”,其实 DNS 请求早就在明文飞了。

















