Iptables

iptables 限制多埠規則的解決方法

  • June 12, 2020

我有很多埠要阻止,但 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:Ports 1:16 只是為了解釋這個想法。實際埠不按順序

隱式-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 --dport 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),其中大多數是散列的。它們可以載入數十萬個條目,並且仍然保持快速查找,並有助於製定簡單和通用的規則。

引用自:https://serverfault.com/questions/1021118