AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 433054
Accepted
Martin
Martin
Asked: 2018-03-24 05:08:05 +0800 CST2018-03-24 05:08:05 +0800 CST 2018-03-24 05:08:05 +0800 CST

O módulo multiportas do iptables oferece um benefício de desempenho em relação a várias regras separadas?

  • 772

O iptablesmódulo multiporta fornece um benefício de desempenho em relação a várias regras separadas? Em outras palavras, é isso:

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

..mais eficiente do que isso:

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

No primeiro caso, ambos os módulos tcpe multiportsão verificados para cada pacote, mas há uma única regra. No segundo caso, 15 regras são verificadas para cada pacote, mas para cada regra apenas o tcpmódulo é processado.

Eu fiz uma topologia de rede simples a seguir:

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

Ambos eth2in server1e enp0s31f6in server2são adaptadores de rede 1GigE e são conectados com cabo Cat5e de 5m. Quando eu baixei um arquivo de 10.000 MiB de server1para server2sem nenhuma regra de firewall, a taxa de transferência foi de 942 Mbps. Então eu gerei 4369 regras como esta:

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

Isso significa que havia 4369 multiportregras com 15 portas em cada regra. Por exemplo:

# 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
# 

Agora, quando executei wget --report-speed=bits -4 -O /dev/null 10.10.10.1:65535em server2, para minha surpresa, a taxa de transferência ainda era de 942 Mbps. Como próximo passo, limpei a INPUTcadeia e gerei 65535 regras como esta:

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

Mais uma vez, executei e agora o throughput caiu wget --report-speed=bits -4 -O /dev/null 10.10.10.1:65535para server2580Mbps. Então, estou correto que, em casos extremos, a multiportabordagem é mais eficiente? Porém, em condições normais sem dezenas de milhares de regras ou dezenas de Gbps de tráfego, não há diferença prática?

iptables
  • 2 2 respostas
  • 2484 Views

2 respostas

  • Voted
  1. Best Answer
    Cristian Ciupitu
    2018-04-03T08:14:58+08:002018-04-03T08:14:58+08:00

    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 sejam executadas mais rapidamente do que outras, por exemplo, uma regra multiporta para 15 portas pode ser mais rápida que a regra definida equivalente (como na resposta de Hauke ​​Laging ). Portanto, não apenas o número de regras é importante, mas também o tipo delas.

    O código-fonte para tcp/udp , multiport e set match extensions oferece algumas regras básicas, mas como é 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 executo o iperf3 com uma lista de apenas 3 portas, e o módulo tcp foi um pouco mais rápido que os módulos multiport e set que ofereceram uma taxa de transferência semelhante.

    Se você ainda gosta de microbenchmarks, contei os ciclos de CPU necessários para executar a função do kernel usando este script SystemTapipt_do_table muito, muito rudimentar :

    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 meus resultados para um pacote que percorre todas as regras em uma máquina virtual executando o Linux 4.15:

    Módulo portas Regras Executar 1 Corrida 2 Corrida 3 Corrida 4 Corrida 5
    tcp 4500 4500 973148 1032564 856528 410894 854708
    multiportas 4500 300 89370 259250 99752 225275 182256
    definir 4500 1 28463 43494 28315 33589 40988
    • 3
  2. Hauke Laging
    2018-03-31T11:43:56+08:002018-03-31T11:43:56+08:00

    Não sei como o Linux lida com as regras do Netfilter no nível do opcode. Mas a abordagem multiporta pode fazer várias verificações com uma única operação.

    Como 1Gb/s não é muito para uma CPU (mesmo lenta), não é de se estranhar que você precise de casos extremos. Mas ambas as abordagens podem, mesmo com o mesmo rendimento, gerar cargas bastante diferentes. Como isso é coisa do kernel, provavelmente nem é mostrado em /proc/loadavg. Portanto, você teria que executar um aplicativo com uso intensivo de CPU no mesmo sistema e medir seu desempenho para ver a diferença real.

    Mas acho que sua comparação é meio injusta porque multiport verifica uma vez -p tcpenquanto multirule faz a mesma verificação 65536 vezes. Assim, você faria algo assim:

    iptables -N tcp_ports
    iptables -A INPUT -p tcp -j tcp_ports
    for ((i=1;i<65536;i++)); do iptables -A tcp_ports --sport $i ...
    

    Acabei de perceber que você não pode deixar de fora a verificação do TCP porque é um requisito para o --dport. Mas esse é um dos motivos pelos quais a abordagem de regras múltiplas é mais lenta.

    Não tenho certeza se o multiport foi planejado para casos como o seu. Para enormes listas de comparação ipsetforam criadas. Então pode ser isso que você está realmente procurando.

    ipset create foo bitmap:port range tcp:10000-19999
    ipset add foo tcp:10000-19999
    iptables -A INPUT -p tcp -m set --match-set foo dst
    
    • 2

relate perguntas

  • Uma pequena dúvida sobre MASQUERADE e SNAT/DNAT

  • iptables não filtra tráfego em ponte

  • iptables persistentes

  • Regras do Iptables para permitir que o appVM passe pelo proxyVM configurado para passar apenas por uma VPN no QubesOS

  • Como fazer todo o tráfego passar por uma interface no Linux

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Como exportar uma chave privada GPG e uma chave pública para um arquivo

    • 4 respostas
  • Marko Smith

    ssh Não é possível negociar: "nenhuma cifra correspondente encontrada", está rejeitando o cbc

    • 4 respostas
  • Marko Smith

    Como podemos executar um comando armazenado em uma variável?

    • 5 respostas
  • Marko Smith

    Como configurar o systemd-resolved e o systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

    • 3 respostas
  • Marko Smith

    Como descarregar o módulo do kernel 'nvidia-drm'?

    • 13 respostas
  • Marko Smith

    apt-get update error no Kali Linux após a atualização do dist [duplicado]

    • 2 respostas
  • Marko Smith

    Como ver as últimas linhas x do log de serviço systemctl

    • 5 respostas
  • Marko Smith

    Nano - pule para o final do arquivo

    • 8 respostas
  • Marko Smith

    erro grub: você precisa carregar o kernel primeiro

    • 4 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Martin Hope
    rocky Como exportar uma chave privada GPG e uma chave pública para um arquivo 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Wong Jia Hau ssh-add retorna com: "Erro ao conectar ao agente: nenhum arquivo ou diretório" 2018-08-24 23:28:13 +0800 CST
  • Martin Hope
    Evan Carroll status systemctl mostra: "Estado: degradado" 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim Como podemos executar um comando armazenado em uma variável? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S Por que /dev/null é um arquivo? Por que sua função não é implementada como um programa simples? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 Como ver as últimas linhas x do log de serviço systemctl 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - pule para o final do arquivo 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla Por que verdadeiro e falso são tão grandes? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Bagas Sanjaya Por que o Linux usa LF como caractere de nova linha? 2017-12-20 05:48:21 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve