macos原生doh仅作用于safari、mail等系统应用,不覆盖终端命令;需用dnscrypt-proxy等本地转发器并设dns为127.0.0.1才能统一加密所有请求。
macos 配置加密 dns(主要是 dns-over-https,doh)能有效防止 dns 劫持、isp 窥探和中间人篡改,但需注意:它不是全局生效的“一键开关”,而是分层、分版本、分应用的配置。关键在于明确目标——是保护 safari/mail 等系统应用,还是连终端命令(如 curl、dig)也要加密?下面按实际效果分层说明。
系统级 DoH(Safari、Mail、Finder 等原生应用)
macOS Ventura(13)及以上支持图形化配置,Monterey(12.3+)需用配置描述文件。仅对使用系统网络框架(CFNetwork/NWEndpoint)的应用生效:
- 进入「系统设置 → 网络 → 当前连接 → 详细信息… → DNS」
- 点击「+」号,输入标准 DoH 地址:
https://dns.google/dns-query 或 https://cloudflare-dns.com/dns-query
(必须完全匹配,不能带参数、不能用 HTTP、证书必须有效) - 拖动该条目到 DNS 列表最上方,确保优先使用
- 保存后,条目旁出现小锁图标即表示启用成功(协议类型不显示是正常设计)
终端与命令行工具也加密(需本地转发器)
默认情况下,dig、curl、ping 等直接调用底层 socket 或 libc 的 getaddrinfo(),绕过系统 DoH。要统一加密,必须部署本地 DNS 转发器:
- 安装并运行 dnscrypt-proxy(推荐)或 stubby,配置其上游为 Cloudflare/Quad9 的 DoH 或 DoT 地址
- 将 dnscrypt-proxy 设为监听
127.0.0.1:53 - 回到「网络 → DNS」,把 DNS 服务器设为 127.0.0.1(唯一地址),并移除其他所有条目
- 这样所有系统 DNS 请求(包括终端)都会先经本地加密代理转发
验证是否真正生效
别只看界面有没有锁图标,实测才可靠:
- 终端执行:
scutil --dns,查看 resolver 配置中是否有nameserver[0] : 127.0.0.1(本地代理)或HTTPS类型标识(系统 DoH) - 测试 DoH 流量:
curl -v https://1.1.1.1/help 2>&1 | grep via,若返回via: cloudflare,说明请求经 Cloudflare DoH 处理 - 用 Wireshark 抓包,筛选
tls && http.host contains "cloudflare-dns.com",有持续 TLS 流量即为正常
额外防护建议(防劫持+提稳)
加密只是手段,配合基础加固才能闭环:
- 刷新 DNS 缓存:
sudo dscacheutil -flushcache; sudo killall -HUP mDNSResponder - 禁用 DHCP 推送的 DNS:在「网络 → 高级 → TCP/IP」中勾选「忽略来自 DHCP 服务器的 DNS 服务器地址」
- 检查并清理
/etc/hosts,避免恶意重定向;必要时禁用 IPv6(在「IPv6」设置中选「关闭」) - 日常使用非管理员账户,限制恶意软件修改
/Library/Preferences/SystemConfiguration/preferences.plist的权限











