Mac Ventura 13.4 DNS拆分视界故障:dig可解析域名但ping等工具无法解析
看起来你碰到了Mac Ventura上一个挺常见的DNS解析优先级坑——dig和nslookup是直接绕开系统缓存、向配置的DNS服务器发请求,而ping、浏览器这类系统级工具,得先走macOS自带的dscacheutil缓存和mDNSResponder服务,这俩的逻辑和直接DNS查询完全不一样,尤其是你用了PiHole的 wildcard 本地域名规则时,很容易出现“能解析但用不了”的分裂情况。
核心现象梳理
- 用
dig foo.int.hmwsl.de或nslookup bar.int.hmwsl.de,能正常通过PiHole(192.168.69.10)拿到正确的A记录(指向Pi的IP) - 但ping、浏览器、
dscacheutil -q host甚至dns-sd都解析失败,要么返回Unknown host,要么显示No Such Record - 手动执行
sudo networksetup -setdnsservers "Wi-Fi" 192.168.69.10指定唯一DNS后,问题就消失,但DHCP自动分配的DNS(明明包含PiHole地址)却不管用
你已完成的排查(方向没问题)
- 重启设备
- 刷新DNS缓存:
sudo dscacheutil -flushcache; sudo killall -HUP mDNSResponder - 调整域名注册商的wildcard记录
- 切换二级域名/子域名测试
- 手动指定DNS验证有效性
为什么会出现这种差异?
1. macOS的DNS解析流程和dig完全不同
dig这类工具是直接向配置的DNS服务器发查询,不走系统缓存。但系统工具会先查dscacheutil本地缓存,再通过mDNSResponder处理,这货有自己的优先级逻辑:
- 优先处理mDNS(.local域名)、链路本地解析
- 如果DHCP分配了多个DNS服务器,macOS可能因为之前的解析失败记录、响应速度差异,跳过PiHole直接查后面的公网DNS,而公网DNS肯定没有你的本地wildcard记录,自然解析失败
- 要是你之前访问过这个域名的公网地址,缓存里可能还留着旧记录,哪怕PiHole已经配置了新规则也没用
2. DHCP的DNS顺序坑
从你的scutil --dns输出看,DHCP分配的DNS顺序是192.168.69.10 → 62.233.233.233 → 8.8.8.8。理论上应该先查PiHole,但macOS的DNS解析器有时候会“自作主张”跳过它,比如如果某次PiHole响应慢了一点,就会被标记为不可靠,之后直接走公网DNS。
可行的解决办法
方案1:强制macOS优先用PiHole作为唯一DNS
既然手动指定DNS有效,那可以在系统设置里调整:
- 打开「系统设置-网络-Wi-Fi-详情-DNS」
- 删除所有自动分配的DNS服务器,只保留
192.168.69.10 - 要是需要公网DNS解析,直接在PiHole的后台配置上游DNS(比如用Cloudflare或Google DNS),让PiHole作为唯一的DNS入口——这样既能保证本地域名解析正确,又能利用PiHole的广告过滤功能
方案2:彻底清理DNS缓存(比你之前的命令更彻底)
有时候普通的缓存刷新不够,试试这套组合拳:
sudo dscacheutil -flushcache sudo killall -HUP mDNSResponder sudo killall mDNSResponderHelper sudo dscacheutil -flushcache
然后重启Wi-Fi接口,让DNS配置重新生效:
networksetup -setairportpower en0 off sleep 5 networksetup -setairportpower en0 on
方案3:检查PiHole的wildcard配置
确认你的wildcard规则有没有问题:
- 你当前的配置
address=/int.hmwsl.de/192.168.69.10是对的,但可以试试改成address=/.int.hmwsl.de/192.168.69.10(前面多一个点),确保能匹配所有子域名 - 去PiHole的后台「Query Log」看看,macOS发送的查询有没有真的到达PiHole——如果日志里看不到相关查询,说明macOS根本没把请求发给PiHole,问题出在本地DNS配置
方案4:临时禁用mDNSResponder测试(排查缓存问题)
如果以上都没用,可以临时禁用系统的DNS缓存服务测试:
sudo launchctl unload /System/Library/LaunchDaemons/com.apple.mDNSResponder.plist
这时候再ping域名,如果能正常解析,那就是缓存服务的问题,之后再重新加载:
sudo launchctl load /System/Library/LaunchDaemons/com.apple.mDNSResponder.plist
关于你的目标的补充建议
你想实现用单一域名+子域名访问Pi上的服务,搭配Traefik、Authelia和Let's Encrypt,这个方案完全可行:
- 确保PiHole的wildcard规则正确,让所有
*.int.hmwsl.de都指向Pi的IP - Traefik里给每个服务配置对应的子域名路由就行
- Authelia可以统一做身份认证,没毛病
- Let's Encrypt建议用DNS挑战(因为你有自己的域名),这样哪怕在局域网里也能拿到合法证书,不用依赖HTTP挑战的端口映射
备注:内容来源于stack exchange,提问作者ekamil

