我正在寻找一种方式来iptables
匹配转发源地址为在同一网络中作为目标地址,无需指定网络。
当然,当我指定网络时,这很简单:
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -d 192.168.1.0/24
但是假设我想对任何 C 类网络执行此操作(显然,我不想指定所有 C 类网络)。
我看了rpfilter
比赛,但根据手册页:
此匹配只能在 raw 或 mangle 表的 PREROUTING 链中使用。
所以这对我没什么用。u32
比赛看起来很有希望,但太复杂了,我看不懂。
我尝试了一种不同的方法:匹配从同一接口发出和接收的数据包,如下所示:
iptables -t nat -A POSTROUTING -i eth0 -o eth0
但这也不起作用,因为-i
不能在 POSTROUTING 链中使用:
iptables v1.4.21: Can't use -i with POSTROUTING
我想到的一个解决方案是使用数据包标记:标记进入的数据包eth0
并匹配传出的接口和 POSTROUTING 链中的标记,如下所示:
iptables -t mangle -A PREROUTING -i eth0 -j MARK --set-mark 0x01/0xff
iptables -t nat -A POSTROUTING -o eth -m mark --mark 0x01/0xff
在大多数情况下,这种方法都是有效的,因为它基于在给定接口上仅运行一个网络的假设,但它并不完全符合我的要求,因为它在接口上工作而不是在网络上工作。
所以到目前为止,问题还没有解决。我不是在寻找一个完整的解决方案,而是在寻找一种我错过的解决这个问题的方法的建议。谢谢!
-编辑-
我需要这个的原因如下。我有多宿主 Linux 主机,我们称之为 alice。Alice 有一个接口 eth0,Bob 和 Charly 是该网络上的主机。Alice 上的某些端口通过 iptables DNAT 规则转发。假设我将 Alice 的 tcp 端口 456 转发到 Bob 上的端口 456。我希望此转发也适用于来自 eth0 上主机的流量。仅使用 DNAT 规则,Charly 发送到 Alice 端口 456 的数据包将转发给 Bob,位它的源地址仍然是 Charly 的。因此,返回数据包由 Bob 直接发送给 Charly,这导致流量不对称。
为了解决这个问题,我想在 Alice 上对这个流量进行 SNAT。因此,如果流量离开 Alice,其目标地址在 eth0 中,源地址在 eth0 网络中(但不是 Alice 的),那么我需要对其进行 SNAT。
如果您指定地址范围,这并不难做到。但现在我有几个接口,我想以通用方式执行此操作。