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
相关产品推荐
相关产品推荐

