OpenWrt Passwall频繁切换节点后外网DNS失效的排查与修复
前言
最近用 OpenWrt 老出问题,尤其是 Passwall 插件频繁切换节点之后,外网突然完全连不上,DNS 解析直接挂掉,curl 也报 could not resolve host,折腾了好一阵子。
本来以为是节点不稳定,或者简单重启就能好,结果发现不是那么回事。排查下来才发现是 DNS 被 Xray 错误劫持了,加上链路没恢复好,导致整个外网 DNS 和流量全崩。
现把完整的排查过程和修复方法记录下来,希望能帮到同样踩坑的朋友。整个问题其实是典型的“链式故障”,不是单点坏了,而是几层东西一起出问题。跟着步骤看,基本就能快速定位和解决。
问题现象
DNS异常
1 | nslookup google.com 127.0.0.1 |
No answer
外网 DNS 不通
1 | nslookup google.com 8.8.8.8 |
timeout
curl 失败
1 | curl -I https://www.google.com |
Could not resolve host
结论:DNS + 外网链路全部失效
排查DNS层
检查 DNS 进程
1 | ps w | grep chinadns-ng |
结果:
1 | chinadns-ng 正常运行 ✔ |
说明:
- DNS代理进程没有挂
- 问题不在“没启动”
检查 53 端口
1 | netstat -lnp | grep :53 |
结果:
1 | dnsmasq 正常监听 ✔ |
说明:
- 本地 DNS 服务存在
- 但“不等于能解析”
关键异常发现
❗ 发现 8.8.8.8 被占用
1 | 8.8.8.8:53 → xray |
根因之一:Xray 错误接管 DNS 请求
结果:
- DNS 请求被“代理劫持”
- 但没有正确返回解析结果
- DNS 全崩
核心验证
外网 DNS 测试失败
1 | nslookup google.com 8.8.8.8 → timeout |
说明UDP 53 出口不通 / 被拦截 / 被代理劫持
本地 DNS 无结果
1 | nslookup google.com 127.0.0.1 → No answer |
说明:
- chinadns-ng 收到请求
- 但 upstream(上游DNS)失败
curl 失败
1 | Could not resolve host |
说明:系统 DNS 完全不可用
真正根因
问题不是单点,而是链式故障:
根因1:Xray DNS劫持
- 占用 8.8.8.8:53
- 导致 DNS 请求异常路由
根因2:DNS链路断裂
路径错误变成:
1 | dnsmasq → xray → 无返回 |
根因3:Passwall DNS未正确接管
Passwall
- DNS 没走预期链路
- chinadns-ng 只能“接收但无法解析”
修复
执行如下命令
1 | /etc/init.d/passwall restart |
① Passwall 重启(核心)
作用:
- 重建代理链路(xray / sing-box 等)
- 重新生成 DNS 配置
- 重启 chinadns-ng / dns 相关组件
- 重新下发 iptables / nft 规则
本质:恢复“科学上网整条链路”
② dnsmasq 重启(DNS基础层)
作用:
- 重新加载
/etc/resolv.conf - 重新监听 53 端口
- 清空 DNS 缓存
- 重新绑定 LAN / IPv6 DNS
本质:恢复“本地DNS服务”
以后如何快速判断(很重要)
以后遇到类似问题,按这个顺序查
① DNS是否存活
1 | nslookup google.com 127.0.0.1 |
② 外网DNS是否通
1 | nslookup google.com 8.8.8.8 |
③ 53端口是谁
1 | netstat -lnp | grep :53 |
④ 代理是否干扰DNS
1 | logread | grep dns |
经验总结
你这次属于典型 OpenWrt 三层问题:
| 层级 | 问题 |
|---|---|
| 应用层 | curl失败 |
| DNS层 | chinadns-ng无输出 |
| 网络层 | Xray劫持53端口 |
评论





