O iptables percorre todas as regras da tabela até que uma correspondência com um destino final seja encontrada, portanto, menos regras significam menos uso da CPU. Embora algumas regras rodem mais rápido do que outras, por exemplo, uma regra multiportas para 15 portas pode ser mais rápida que a regra set equivalente (como em answer ). Portanto, não apenas o número de regras é importante, mas o tipo delas também.
O código-fonte para tcp / udp , multiportas e conjunto extensões de correspondência oferece algumas regras práticas, mas porque é difícil prever onde as coisas estão lentas , eu recomendo comparar os possíveis conjuntos de regras iptables e ver qual deles é mais rápido. Por exemplo eu corro iperf3 com uma lista de apenas 3 portas, e o módulo tcp foi um pouco mais rápido que os módulos multiportas e set que ofereciam uma taxa de transferência semelhante.
Se você ainda curte microbenchmarks, contei os ciclos de CPU necessários para executar o ipt_do_table
função do kernel usando este muito, muito rudimentar SystemTap :
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)
}
Estes são os meus resultados para um pacote que atravessa todas as regras em uma máquina virtual executando o Linux 4.15:
Module | Ports | Rules | Run 1 | Run 2 | Run 3 | Run 4 | Run 5
----------+-------+--------+---------+---------+---------+---------+--------
tcp | 4500 | 4500 | 973148 | 1032564 | 856528 | 410894 | 854708
multiport | 4500 | 300 | 89370 | 259250 | 99752 | 225275 | 182256
set | 4500 | 1 | 28463 | 43494 | 28315 | 33589 | 40988