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站
- 微信
- 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:不要形成循环如果遇到“国外能访问,国内打不开”,优先排查:
- DNS 是否返回正常国内 IP。
- OpenClash 里国内网站是否为 DIRECT。
- 抓包是否只有 SYN,没有 SYN-ACK。
- LAN 区域是否开启 NAT 和 MSS 钳制。
总结
OpenWrt 旁路由做全屋默认网关时,lan 区域开启 IP 动态伪装和 TCP MSS 钳制非常关键。
这次问题的核心不是 DNS,不是 OpenClash 规则,也不是手机本身,而是旁路由直连转发路径没有正确处理。只要抓包看到“只有 SYN,没有 SYN-ACK”,就应该优先想到 NAT/MSS 配置。