macOS可通过四种方式实现域名级DNS分流:一、/etc/resolver下配置域名专属DNS;二、dnsmasq本地代理条件转发;三、mDNSResponder动态注入解析规则;四、pfctl防火墙重定向+CoreDNS处理。

如果您希望 macOS 系统对某个特定域名(例如 example.com)使用与其他域名不同的 DNS 服务器进行解析,而非全局统一配置,则需绕过系统级 DNS 设置,采用更精细的解析控制机制。以下是实现该目标的多种可行方案:
一、使用 scutil 命令配置网络服务级 DNS 路由
macOS 的 networksetup 和 scutil 工具支持为指定网络服务(如 Wi-Fi 或以太网)添加静态 DNS 路由规则,结合 resolver 配置文件可实现基于域名的 DNS 分流。此方法不修改全局 DNS,仅影响匹配域名的查询路径。
1、创建自定义 resolver 配置目录:sudo mkdir -p /etc/resolver
2、为特定域名生成 resolver 文件:sudo touch /etc/resolver/example.com
3、向该文件写入专用 DNS 地址:echo "nameserver 8.8.8.8" | sudo tee /etc/resolver/example.com
4、验证文件权限是否为 root:wheel 且不可被组/其他用户写入:sudo ls -l /etc/resolver/example.com
二、部署本地 DNS 代理(dnsmasq)实现条件转发
dnsmasq 可监听本地 53 端口,根据域名后缀将查询转发至不同上游 DNS 服务器。该方式完全独立于系统网络设置,适用于多域名差异化解析场景,且支持通配符和 IP 白名单控制。
1、通过 Homebrew 安装 dnsmasq:brew install dnsmasq
2、编辑主配置文件启用地址绑定与日志:echo "bind-interfaces" | sudo tee -a /opt/homebrew/etc/dnsmasq.conf
3、添加针对目标域名的转发规则:echo "server=/example.com/1.1.1.1" | sudo tee -a /opt/homebrew/etc/dnsmasq.conf
4、启动服务并设为开机自启:sudo brew services start dnsmasq
5、将系统 DNS 设置为 127.0.0.1(通过“系统设置 > 网络 > 详细信息 > DNS”添加)
三、利用 mDNSResponder 配置自定义解析策略
macOS 内置的 mDNSResponder 支持通过动态配置注入 resolver 规则,其优先级高于传统 /etc/resolver 文件。该方法适合需要临时生效或脚本化部署的场景,且无需第三方进程常驻。
1、停止当前 mDNSResponder 服务:sudo killall -HUP mDNSResponder
2、生成临时 resolver 配置内容:printf "domain example.com\nnameserver 9.9.9.9\n" | sudo tee /tmp/example.com.resolver
3、加载该配置到运行时环境:sudo scutil --dns | grep -A5 "resolver #" 查看当前 resolver 编号
4、使用 scutil 手动插入新 resolver 条目:sudo scutil --dns --set resolver.example.com domain example.com nameserver 9.9.9.9
四、配合 pfctl 防火墙重定向 DNS 流量
通过 macOS 内置的 pf 防火墙,在内核层捕获发往 53 端口的目标域名 DNS 查询包,并依据域名特征重定向至指定 DNS 服务器。此方案具备最高粒度控制能力,但需启用 pf 并编写匹配规则。
1、启用 pf 防火墙并加载空规则集:sudo pfctl -e -f /etc/pf.conf
2、在 /etc/pf.anchors/dns-redirect 中添加域名匹配规则:echo "rdr pass on en0 proto udp from any to any port 53 -> 127.0.0.1 port 5353" | sudo tee /etc/pf.anchors/dns-redirect
3、配置本地轻量 DNS 转发器(如 CoreDNS)监听 5353 端口,仅对 example.com 查询转发至 8.8.4.4
4、重新加载 pf 规则:sudo pfctl -f /etc/pf.conf








