iptables:端口转发的多重排除

jag*_*ier 6 iptables

我有一个现有的 iptables 设置可以进行端口转发。在这种端口转发场景中,有些情况下我不希望它进行端口转发。所以,例如我有这个定义:

iptables -A PREROUTING -t nat -i eth0 '!' -s 10.200.0.0/16 -p tcp --dport 80 -j DNAT --to 10.200.30.11
Run Code Online (Sandbox Code Playgroud)

这将阻止 10.200/16 访问此规则。事实证明,我需要添加多个排除项。但是,似乎没有办法做到这一点:

iptables -A PREROUTING -t nat -i eth0 '!' -s 10.200.0.0/16,192.168.0.0/16 -p tcp --dport 8080 -j DNAT --to 10.200.30.11:80
iptables v1.4.8: ! not allowed with multiple source or destination IP addresses
Run Code Online (Sandbox Code Playgroud)

我将假设我必须以不同的方式处理这个问题,但我不知道如何。有什么建议?

Net*_*tch 7

您可以使用以下变体之一:

第一个是设置类型为“hash:net”的 ipset。

第二个是 iptables 规则链,-j RETURN每个网络都跳过检查,并将所需的默认操作作为最后一个链规则。

第三个是标记数据包使用一些位标记-j MARK和相应的标志播放(带--set-mark--set-xmark等等),然后做所需的操作,如果标记检查的条件(-m mark--mark)。这是最通用的变体,因为标记可以在一个表中设置并在另一个表中检查。OTOH 标记位掩码限制为 32 位,这对于复杂规则来说可能不够。