![iptables 限制多端口规则的解决方法](https://linux22.com/image/753622/iptables%20%E9%99%90%E5%88%B6%E5%A4%9A%E7%AB%AF%E5%8F%A3%E8%A7%84%E5%88%99%E7%9A%84%E8%A7%A3%E5%86%B3%E6%96%B9%E6%B3%95.png)
我有许多端口需要阻止,但是 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
),其中大多数是散列的。它们可以加载数十万个条目,并且仍能保持快速查找,并有助于制定简单而通用的规则。