Iptables

iptables 多埠模組是否比多個單獨的規則提供性能優勢?

  • August 18, 2021

多埠模組是否iptables提供優於多個單獨規則的性能優勢?換句話說,是這樣的:

iptables -A INPUT -p tcp -m multiport --sports 1,2,3,4,5,6,7,8,9,10,11,12,13,14,80 -j ACCEPT

..比這更有效:

iptables -A INPUT -p tcp --sport 1 -j ACCEPT
iptables -A INPUT -p tcp --sport 2 -j ACCEPT
iptables -A INPUT -p tcp --sport 3 -j ACCEPT
iptables -A INPUT -p tcp --sport 4 -j ACCEPT
iptables -A INPUT -p tcp --sport 5 -j ACCEPT
iptables -A INPUT -p tcp --sport 6 -j ACCEPT
iptables -A INPUT -p tcp --sport 7 -j ACCEPT
iptables -A INPUT -p tcp --sport 8 -j ACCEPT
iptables -A INPUT -p tcp --sport 9 -j ACCEPT
iptables -A INPUT -p tcp --sport 10 -j ACCEPT
iptables -A INPUT -p tcp --sport 11 -j ACCEPT
iptables -A INPUT -p tcp --sport 12 -j ACCEPT
iptables -A INPUT -p tcp --sport 13 -j ACCEPT
iptables -A INPUT -p tcp --sport 14 -j ACCEPT
iptables -A INPUT -p tcp --sport 80 -j ACCEPT

在第一種情況下,每個包都檢查tcpmultiport模組,但只有一個規則。在第二種情況下,為每個包檢查 15 條規則,但對於每個規則,只tcp處理模組。

我做了以下簡單的網路拓撲:

server1[eth2] <--> [enp0s31f6]server2

eth2inserver1enp0s31f6in都是server21GigE 網路適配器,它們使用 5m Cat5e 電纜連接。server1當我從沒有任何防火牆規則的情況下下載 10000 MiB 文件時server2,吞吐量為 942Mbps。然後我生成了 4369 條這樣的規則:

for i in {1..65535}; do if ((i%15 == 0)); then iptables -A INPUT -p tcp -m multiport --sports $p$i -j ACCEPT; p=; else p=$p$i,; fi; done

這意味著有 4369multiport條規則,每條規則中有 15 個埠。例如:

# iptables -L INPUT 1 -v -n --line-numbers 
1        0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            multiport sports 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15
# iptables -L INPUT 4369 -v -n --line-numbers 
4369     0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            multiport sports 65521,65522,65523,65524,65525,65526,65527,65528,65529,65530,65531,65532,65533,65534,65535
# 

現在當我執行wget --report-speed=bits -4 -O /dev/null 10.10.10.1:65535server2,令我驚訝的是,吞吐量仍然是 942Mbps。下一步,我刷新了INPUT鏈並生成了 65535 條規則,如下所示:

for i in {1..65535}; do iptables -A INPUT -p tcp --sport $i -j ACCEPT; done

我再次執行wget --report-speed=bits -4 -O /dev/null 10.10.10.1:65535server2現在吞吐量下降到 580Mbps。那麼我是否正確,在極端情況下,該multiport方法更有效?但是,在沒有幾萬條規則或幾十Gbps流量的正常情況下,有沒有實際的區別?

iptables 遍歷表中的每個規則,直到找到與終止目標的匹配項,因此更少的規則意味著更少的 CPU 使用率。儘管有些規則比其他規則執行得更快,例如15 個埠的多埠規則可能比等效的設置規則更快(如 Hauke Laging 的回答)。因此,不僅規則的數量很重要,它們的類型也很重要。

tcp/udpmultiportset match 擴展的原始碼提供了一些經驗法則,但由於很難預測哪裡慢,我建議對可能的 iptables 規則集進行基準測試,看看哪個更快。例如,我使用僅包含 3 個埠的列表執行iperf3,並且tcp模組比提供相似吞吐量的多埠設置模組快一點。

如果你還在使用微基準測試,我使用這個非常非常基本的SystemTap腳本計算了執行ipt_do_table核心函式所需的 CPU 週期:

global call_cycles = 0

probe kernel.function("ipt_do_table@net/ipv4/netfilter/ip_tables.c").call {
   call_cycles = get_cycles()
}

probe kernel.function("ipt_do_table@net/ipv4/netfilter/ip_tables.c").return {
   delta = get_cycles() - call_cycles
   printf(" <- delta = %d\n", delta)
}

這些是我在執行 Linux 4.15 的虛擬機上遍歷所有規則的數據包的結果:

引用自:https://unix.stackexchange.com/questions/433054