分享技术 · 探索极限 · Code is Art
Linux 发布 2026-05-11 320阅读 约 7分钟阅读

OpenWrt 旁路由排障:Google 能访问但国内网站打不开,原来是 LAN NAT 没开

OpenWrt 旁路由排障:Google 能访问但国内网站打不开,原来是 LAN NAT 没开

在 OpenWrt 旁路由 + OpenClash 的全屋代理环境中,一个很典型的问题是:

  • Google、YouTube、GitHub 等国外网站可以访问。
  • 百度、淘宝、B站、国内 App 反而打不开。
  • DNS 查询看起来正常。
  • 电脑可能正常,手机可能异常。
  • 抓包时只有客户端发出的 TCP SYN,看不到服务器返回的 SYN-ACK。

这类问题很容易被误判为 OpenClash 规则、DNS 污染、Fake-IP、手机网络检测异常。实际上,在旁路由作为全屋默认网关的场景里,最常见的原因是:OpenWrt 的 LAN 区域没有开启 IP 动态伪装,也就是 NAT。

一、网络环境

本文讨论的是这种结构:

主路由 / AP:192.168.1.1
OpenWrt 旁路由:192.168.1.2
可选 DNS / AdGuardHome:192.168.1.3
客户端默认网关:192.168.1.2
客户端 DNS:192.168.1.3

示例:

主路由 / AP:192.168.1.1
OpenWrt 旁路由:192.168.1.2
AdGuardHome:192.168.1.3
局域网网段:192.168.1.0/24

客户端通过 DHCP 拿到:

默认网关:192.168.1.2
DNS:192.168.1.3

此时客户端所有流量会先进入 OpenWrt 旁路由,再由 OpenWrt 转发到主路由出网。

二、典型现象

最迷惑人的地方在于:

国外网站能访问
国内网站打不开

直觉上很多人会以为是:

  • OpenClash 规则错了。
  • 国内网站被错误代理了。
  • DNS 返回了错误 IP。
  • Fake-IP 影响了手机。
  • 小米手机网络检测异常。

但如果 Google 能访问,通常说明代理链路是通的。国外网站可能是被 OpenClash 接管后,由 OpenWrt 自己发起代理连接。而国内网站如果走 DIRECT,就需要 OpenWrt 正常转发客户端原始流量。

如果转发链路有问题,就会出现“代理通,直连不通”。

三、先确认 DNS 是否正常

先看 DNS 查询结果。以 baidu.com 为例,正常返回可能类似:

CNAME: www.a.shifen.com
A: 183.2.172.177

如果返回的是正常国内 IP,就说明 DNS 本身不是问题。

异常结果通常包括:

0.0.0.0
127.0.0.1
198.18.x.x

其中 198.18.x.x 常见于 Fake-IP。如果国内域名返回了 Fake-IP,就需要回头检查 DNS / OpenClash 模式。但如果已经返回正常国内 IP,问题就不在 DNS。

四、抓包确认问题

在 OpenWrt 上抓客户端访问国内 IP 的包:

tcpdump -i br-lan host 192.168.1.100 and host 183.2.172.177 and tcp port 443

示例:

tcpdump -i br-lan host 192.168.1.198 and host 183.2.172.177 and tcp port 443

如果看到大量这样的包:

192.168.1.198.xxxxx > 183.2.172.177.443: Flags [S]
192.168.1.198.xxxxx > 183.2.172.177.443: Flags [S]
192.168.1.198.xxxxx > 183.2.172.177.443: Flags [S]

但没有看到:

183.2.172.177.443 > 192.168.1.198.xxxxx: Flags [S.]

说明客户端发出了 SYN,但没有收到 SYN-ACK 回包。

这通常意味着:OpenWrt 旁路由的直连转发/NAT 路径不通。

五、为什么代理网站能访问,国内 DIRECT 反而不能访问?

因为两类流量路径不一样。

国外代理流量大致是:

客户端
  → OpenWrt
  → OpenClash 接管
  → 代理节点
  → 目标网站

国内 DIRECT 流量大致是:

客户端
  → OpenWrt
  → 主路由
  → 目标国内 IP

如果 OpenWrt 没有对从 LAN 进来的转发流量做 NAT,主路由或回包路径可能无法正确处理这些流量,于是出现:

客户端只发 SYN
服务器回包回不来

六、解决方法:开启 LAN 区域 IP 动态伪装和 MSS 钳制

进入 OpenWrt:

网络 → 防火墙 → 区域 → lan → 编辑

开启:

IP 动态伪装:开启
TCP MSS 钳制:开启

保存并应用。

对应命令方式可以参考:

uci show firewall | grep "=zone"

找到 name='lan' 对应的 zone 编号后,例如是 firewall.@zone[0]

uci set firewall.@zone[0].masq='1'
uci set firewall.@zone[0].mtu_fix='1'
uci commit firewall
/etc/init.d/firewall restart

注意:实际编号不一定是 [0],请以你系统中的 lan 区域为准。

七、修复后如何验证

再次抓包:

tcpdump -i br-lan host 192.168.1.100 and host 183.2.172.177 and tcp port 443

正常应该能看到:

客户端 → 目标服务器:Flags [S]
目标服务器 → 客户端:Flags [S.]

也就是 TCP 三次握手开始正常。

同时测试:

  • 百度
  • 淘宝
  • B站
  • 微信
  • Google
  • GitHub

如果国内外都正常,说明旁路由转发链路已经修复。

八、和 Fake-IP 有没有关系?

这类问题容易被误认为 Fake-IP 导致,但需要分开看。

如果国内网站打不开,且抓包只有 SYN 没有 SYN-ACK,通常是 NAT/MSS 问题。

如果网络实际可用,但手机提示:

Wi-Fi 无法访问互联网
网络异常
需要登录认证

那可能和 Fake-IP、连通性检测域名、IPv6、私人 DNS 有关。

这两类问题表现有重叠,但根因不同。

九、最终检查清单

旁路由作为全屋网关时,建议确认:

主路由:继续拨号 / AP
OpenWrt:作为客户端默认网关
OpenWrt LAN 区域:IP 动态伪装开启
OpenWrt LAN 区域:TCP MSS 钳制开启
OpenClash:规则模式
DNS:不要形成循环

如果遇到“国外能访问,国内打不开”,优先排查:

  1. DNS 是否返回正常国内 IP。
  2. OpenClash 里国内网站是否为 DIRECT。
  3. 抓包是否只有 SYN,没有 SYN-ACK。
  4. LAN 区域是否开启 NAT 和 MSS 钳制。

总结

OpenWrt 旁路由做全屋默认网关时,lan 区域开启 IP 动态伪装和 TCP MSS 钳制非常关键。

这次问题的核心不是 DNS,不是 OpenClash 规则,也不是手机本身,而是旁路由直连转发路径没有正确处理。只要抓包看到“只有 SYN,没有 SYN-ACK”,就应该优先想到 NAT/MSS 配置。

发表回复