iptables 限制多端口规则的解决方法

iptables 限制多端口规则的解决方法

我有许多端口需要阻止,但是 iptables 多端口规则有限制,最多只允许 15 个端口。

severalports="1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16"
iptables -A INPUT -p tcp -m multiport --dports $severalports -J DROP
iptables v1.4.21: too many ports specified

我想知道是否有任何方法可以创建自定义规则来绕过最大 15 个端口的限制(这样我就不必拆分规则)。谢谢

PD:端口 1:16 只是为了解释这个想法。实际端口不是按顺序排列的

答案1

隐含的-m tcp-m udp(和 sctp 等)都接受端口范围参数。因此,您当前的示例可以简化为:

iptables -A INPUT -p tcp -m tcp --dport 1:16 -j DROP # -m tcp is implicitly loaded if omitted anyway

这对于-m multiport除了范围占用两个位置外:

multiport

此模块匹配一组源端口或目标端口。最多可指定 15 个端口。一个端口范围 (port:port) 计为两个端口。

因此,如果有最多 7 个范围(+1 个单端口),您可以执行以下操作:

iptables -A INPUT -p tcp -m multiport --dports 1:5,10:50,6666 -j DROP

如果你计划使用任意数量的端口,但不添加大量规则,则可以切换到使用ipset(这还需要使用ipset工具)和set匹配:

ipset create portlist bitmap:port range 0-65535 #or narrower if known in advance
for i in $(seq 1 1000); do ipset add portlist $i; done

编辑:实际上,上面的具体情况(所有值都在一个范围内)也可以通过在ipset(不过支持情况可能取决于版本)如果需要,则使用循环代替。不会改变设置结果:

ipset add portlist 1-1000

单身的iptables规则:

iptables -A INPUT -p tcp -m set --match-set portlist dst -j DROP

位图应该具有 O(1) 查找:恒定(并且重要的是:非常快)时间。

ipset可以在使用时动态改变:

ipset del portlist 22

甚至从数据包路径如果确实需要的话。

它提供许多其他列表类型(如hash:ip,port),其中大多数是散列的。它们可以加载数十万个条目,并且仍能保持快速查找,并有助于制定简单而通用的规则。

相关内容