![在 Linux 中无需 NAT 即可连接两个 LAN](https://linux22.com/image/792006/%E5%9C%A8%20Linux%20%E4%B8%AD%E6%97%A0%E9%9C%80%20NAT%20%E5%8D%B3%E5%8F%AF%E8%BF%9E%E6%8E%A5%E4%B8%A4%E4%B8%AA%20LAN.png)
我有一台地址为 192.168.3.2 的 PC。它连接到路由器 192.168.3.1。路由器 192.168.3.1 连接到另一个静态地址为 192.168.88.6 的 LAN。192.168.8.1 处的路由器为 192.168.3.0/24 和 192.168.88.0/24 提供互联网访问。还有一个服务器 192.168.88.51
我希望 192.168.3.2 能够访问 192.168.88.51,而无需 NAT。主要原因是我需要查看来自 192.168.3.0/24 的客户端 IP,而不是其 SNATted 地址 192.168.88.6
3.2 -> 3.1/88.6 -> 88.1 -> internet
^
|
88.51
使用 NAT:
192.168.3.0/24 可以通过其默认路由访问 192.168.88.0/24(和互联网)
如果我在 192.168.3.1 上有 SNAT,那么一切都正常:-A POSTROUTING -o wan -j SNAT --to-source 192.168.88.6
无 NAT:
192.168.3.0/24 仍然可以通过其默认路由访问 192.168.88.0/24(和互联网)
对于 192.168.88.1 的路由器,我通过 192.168.88.6 添加了到 192.168.3.0/24 的静态路由
我删除了 192.168.3.0/24 -> 192.168.88.0/24 的 SNAT 规则(但我仍然可以访问互联网)
但它不起作用,因为 192.168.88.1 有规则,在 FORWARD 链中丢弃无效(ctstate)数据包
如果我在该规则之前添加类似的规则-A FORWARD -i br0 -o br0 -m conntrack --ctstate INVALID
(或者根本没有 conntrack),一切都会正常,但我不喜欢这样
FORWARD 链中的其他规则:
-A FORWARD -i br0 -o ens18 -m conntrack --ctstate NEW -j ACCEPT # internet access
-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
规则。那么 192.168.3.1 将这些数据包标记为 RELATED/ESTABLISHED 吗?然后愉快地 FORWARD 回去?
记录的数据包: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
我有一个问题:
- 为什么数据包被标记为无效?192.168.3.0/24 可以访问互联网,因此 192.168.88.1 上的 WAN 接口的数据包可以正确跟踪
- 为什么同一接口(br0)但不同 LAN 之间存在 FORWARD?
- 我还需要了解/检查/调试什么吗?
更新
我终于明白了,该请求直接从 192.168.3.1 到 192.168.88.51 跳过 192.168.88.1,因为它通过 192.168.88.6 地址属于同一子网
但回复通过 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?
答案1
如果你的192.168.88.0/24
子网全部桥接在一起,你根本不需要转发,只要告诉192.168.88.51
它可以192.168.3.0/24
通过192.168.88.6
ip route add 192.168.3.0/24 via 192.168.88.6
正如您所说的那样,打开的设备192.168.3.0/24
将能够通过默认路由返回。
如果你想继续192.168.88.51
使用其默认路由,你只需要绕过丢弃数据包的规则,这应该可以通过-A FORWARD -i br0 -o br0 -j ACCEPT