我正在寻找一种方法在iptables中匹配转发的数据包,其中源地址与目标地址在同一networking中, 而不指定networking 。
当然,当我指定networking时,这很简单:
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -d 192.168.1.0/24
但是让我们说,我想要做任何C类networking(我不想明确指出所有这些)。
我看了rpfilter比赛,但根据manpage:
此匹配只能用于原始或折叠表的PREROUTING链。
所以这对我没用。 u32比赛看起来很有希望,但是太复杂了,我不明白。
我尝试了一种不同的方法:匹配出现在相同接口上的数据包,如下所示:
iptables -t nat -A POSTROUTING -i eth0 -o eth0
但是这也不起作用,因为-i不能在POSTROUTING链中使用:
iptables v1.4.21: Can't use -i with POSTROUTING
我想到的一个解决scheme是使用数据包标记:在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
这在大多数情况下都是有效的,这是基于假设你在一个给定的接口上只运行一个networking,但是这并不是我想要的,因为它在接口而不是networking上工作。
所以这个问题还没有解决。 我不是在寻找一个完整的工作解决scheme,而是寻求解决这个问题的方法,我错过了。 谢谢!
-编辑-
我需要这个的原因如下。 我有多宿主的Linux主机,我们称之为爱丽丝。 Alice有一个接口eth0,Bob和Charly是该networking上的主机。 Alice上的一些端口是通过iptables DNAT规则转发的。 比方说,我转发Alice的TCP端口456到鲍勃端口456。 我希望这个转发也适用于来自eth0主机的stream量。 在只有DNAT规则的情况下,由Charly发送到Alice端口456的分组被转发给Bob, 其源地址保持为Charly。 所以返回报文直接由Bob发送给Charly,这使得stream量不对称。
为了解决这个问题,我想在Alice上SNAT这个stream量。 所以,如果stream量离开Alice,在eth0中有一个目的地址,在eth0networking中有一个源地址(但不是Alice的),那么我需要对它进行SNAT。
如果指定地址范围,这不难做到。 但现在我有几个接口,我想这样做一般。