You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Linux环境下无NAT跨LAN访问的问题排查及解决方案咨询

Linux环境下无NAT跨LAN访问的问题排查及解决方案咨询

先跟大家梳理下我的网络环境:

  • 我的PC地址是192.168.3.2,连接在路由器192.168.3.1上
  • 这台192.168.3.1路由器有个静态地址192.168.88.6,连到另一个LAN段
  • 另一个LAN的核心路由器是192.168.88.1,负责给192.168.3.0/24和192.168.88.0/24这两个网段提供互联网访问
  • 目标LAN里还有一台服务器192.168.88.51

我的核心需求是:让192.168.3.2能不经过NAT访问192.168.88.51。主要原因是我需要在服务器上看到192.168.3.0/24的真实客户端IP,而不是被SNAT转换成的192.168.88.6。

大概的流量路径如下:

192.168.3.2 -> 192.168.3.1/192.168.88.6 -> 192.168.88.1 -> 互联网
                ^
                |
           192.168.88.51

带NAT的情况(正常工作)

之前配置SNAT规则的时候一切都没问题:

  • 在192.168.3.1上添加了这条规则:-A POSTROUTING -o wan -j SNAT --to-source 192.168.88.6
  • 192.168.3.0/24可以通过默认路由正常访问192.168.88.0/24和互联网

去掉NAT后的问题

当我把针对192.168.3.0/24 -> 192.168.88.0/24的SNAT规则删掉后:

  • 192.168.3.0/24访问互联网依然正常
  • 我已经在192.168.88.1上添加了静态路由:让192.168.3.0/24的流量通过192.168.88.6转发
  • 但访问192.168.88.51的请求直接失败了,查了半天发现是192.168.88.1的FORWARD链里有一条规则,会直接DROP掉ctstate为INVALID的数据包

临时解决方法(但不想长期使用)

如果我在这条DROP规则之前加一条规则,比如-A FORWARD -i br0 -o br0 -m conntrack --ctstate INVALID -j ACCEPT(甚至不带conntrack条件),就能正常访问了,但总觉得这么做不太合规,不想长期用。

附上192.168.88.1的FORWARD链规则:

-A FORWARD -i br0 -o ens18 -m conntrack --ctstate NEW -j ACCEPT # 互联网访问规则
-A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -m conntrack --ctstate INVALID -j DROP
-A FORWARD -m conntrack --ctstate DNAT -j ACCEPT

而192.168.3.1上的FORWARD链我没怎么修改,只有br0到wan的规则,看起来它会把返回的数据包标记为RELATED/ESTABLISHED然后转发回来?

抓包到的无效数据包信息:

IN=br0 OUT=br0 MAC=xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx SRC=192.168.88.51 DST=192.168.3.2 LEN=60 TOS=0x00 PREC=0x00 TTL=63 ID=0 DF PROTO=TCP SPT=xxxx DPT=57416 WINDOW=65160 RES=0x00 ACK SYN URGP=0

我的几个疑问:

  • 为什么这些数据包会被标记为INVALID?毕竟192.168.3.0/24访问互联网是正常的,说明192.168.88.1上的WAN接口数据包跟踪是正常的
  • 为什么会出现同一接口(br0)之间的FORWARD流量?明明是不同的LAN段啊
  • 还有其他我需要检查、调试的点吗?

更新:终于找到问题根源

后来我搞明白了流量的异常路径:

  • 请求数据包是从192.168.3.1直接发到192.168.88.51的,跳过了192.168.88.1,因为192.168.3.1的192.168.88.6和192.168.88.51属于同一个子网
  • 但返回数据包是走192.168.88.1的,因为192.168.88.51没有到192.168.3.0/24的路由,只能用默认网关192.168.88.1

现在想请教大家:正确的修复方法是什么?

  • 如果把192.168.88.6配置成/32地址,192.168.3.1就完全访问不了192.168.88.0/24了
  • 是不是要专门给路由器之间建一个单独的LAN?

备注:内容来源于stack exchange,提问作者dmzkrsk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.20 09:24:29