前言

最近用 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
2
/etc/init.d/passwall restart
/etc/init.d/dnsmasq 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端口