我有一个现有的 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
这将阻止 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
我假设我必须以不同的方式处理这个问题,但我不知道如何做。有什么建议么?
答案1
您可以使用以下变体之一:
第一个是 ipset,设置类型为“hash:net”。
第二个是 iptables 规则链,-j RETURN
每个网络都跳过检查,并将所需的默认操作作为最后一个链规则。
第三种是使用一些位标志来标记数据包-j MARK
并播放相应的标志(使用--set-mark
、--set-xmark
等),然后如果满足标记检查则执行所需的操作(-m mark
和--mark
)。这是最通用的变体,因为可以在一个表中设置标记并在另一个表中检查。 OTOH 标记位掩码仅限于 32 位,这对于复杂的规则来说可能不够。
答案2
如果您的 IP 是按顺序排列的,例如:
1.1.1.5,1.1.1.6,1.1.1.7...,
您可以使用--src-range
并指定序列的第一个和最后一个 IP。例如,如果我需要关闭除 1.1.1.[5-8] 之外的所有 IP 的 8020 端口,我需要添加这样的 iptables 规则:
-A INPUT -p tcp -m iprange ! --src-range 1.1.1.5-1.1.1.8 -m tcp --dport 8020 -j DROP
不要忘记-m iprange
与 一起使用--src-range
。