macOS 中手动管理 DNS 搜索域需分三层:系统级全局搜索域(GUI 或 networksetup 设置)、per-domain resolver 配置(/etc/resolver/ 文件)、验证排错(scutil --dns、缓存刷新)。
在 macOS 中手动管理 DNS 搜索域,核心是控制域名补全行为——比如输入 gitlab 就能自动解析为 gitlab.internal.company.com,而不用每次敲全称。这依赖两个层级:系统级全局搜索域(适用于大多数场景),以及更精准的 per-domain resolver 配置(用于特殊域名强制走特定 DNS 或补全规则)。
注意:搜索域不带点号开头(写 corp.local,不是 .corp.local);也不能包含通配符或正则表达式。
networksetup 可绕过 GUI 直接写入,尤其适合运维或部署场景:- 先查服务名:networksetup -listallnetworkservices(输出类似 Wi-Fi、Ethernet) - 设置搜索域(会**覆盖**原有列表):networksetup -setsearchdomains "Wi-Fi" corp.local dev.corp.local - 若想追加而非覆盖,需先读取现有值:networksetup -getsearchdomains "Wi-Fi",再拼接后重新设置 - 验证是否生效:scutil --dns | grep search,能看到当前生效的搜索域顺序 该方式立即生效,但不会保存在「系统设置」UI 中的编辑框里——UI 仅显示最后一次通过图形界面修改的结果。
/etc/resolver/ 文件:- 创建目录:sudo mkdir -p /etc/resolver - 为域名新建配置文件(如针对 internal.company.com):sudo nano /etc/resolver/internal.company.com - 写入内容(至少含 search 行):search internal.company.comnameserver 10.1.1.50- 保存后确认权限:
ls -l /etc/resolver/internal.company.com 应显示 -rw-r--r-- root wheel - 此配置优先级高于全局搜索域,且只对匹配该域名的查询生效(如 `api` → `api.internal.company.com`)⚠️ 注意:/etc/resolver/ 下的文件名必须与目标域名完全一致(不能用通配符),且不能有端口或路径;若域名含子域(如 staging.internal.company.com),需单独建对应文件。
ping gitlab 或 nslookup api,观察解析出的完整域名 - 查看当前所有生效搜索策略:scutil --dns,重点关注 search domain[s] 和 resolver # 区块 - 若修改后无效,先刷新 DNS 缓存:sudo dscacheutil -flushcache; sudo killall -HUP mDNSResponder(macOS Ventura 及更新系统) - 搜索域不参与 HTTPS 或 URL 自动补全(浏览器地址栏输入 `store` 不会跳转到 `store.apple.com`,除非你在浏览器里启用了相关功能) 不复杂但容易忽略