As mudanças rápidas nas regras do iptables causarão problemas?

As mudanças rápidas nas regras do iptables causarão problemas?

Estou escrevendo um script que monitora diferentes métricas (por exemplo, uso de largura de banda da interface) e alterando iptablesas regras de acordo. Essas alterações podem ocorrer pelo menos 2x por segundo, até 4 * number of interfacespor segundo.

O problema é que não tenho certeza de como iptableslidar com as mudanças nas regras. As coisas são recompiladas e o script sobrecarregará a CPU? Ou o que acontece com os pacotes que ainda estão sendo processados ​​durante a mudança de regras; eles serão descartados? Esse tipo de preocupação.

As mudanças rápidas nas regras do iptables causarão problemas?

EDITAR: Para minha aplicação específica, todas as regras já estão em vigor. Eles servem mais para ativar ou desativar (adicionar ou remover) certas regras. Em outras palavras, as tabelas não crescerão com o tempo e ficarão extremamente grandes.

Responder1

Como você muda as regras?

Você invoca o iptablescomando repetidamente? Isso terá um impacto significativo no desempenho, porque como o iptables funciona:

  • Pegue todas as tabelas/cadeias do netfilter
  • Execute UMA alteração conforme solicitado
  • Carregue todas as tabelas/cadeias do netfilter de volta no kernel

Isso acontecerá emcada um iptablesinvocação.

A questão é: qual é a natureza das mudanças que você faz nas regras?

Se você estiver adicionando/removendo regras com base em endereços de origem e/ou destino, você deverá usar ipset.

Mas se você estiver adicionando/removendo regras, digamos, porque está alterando outros parâmetros rapidamente (por exemplo, alterando ratepara corresponder com mais/menos frequência, alterando os sinalizadores de QoS etc.), talvez ipsetnão seja adequado para você.

Por outro lado, se o seu script realizar alteraçõesem massa, considere também fazer desta forma:

  • Pegue todas as tabelas/cadeias do netfilter
    • Você pode usar iptables-saveo utilitário ou, dependendo de onde você escreve seu script, talvez haja uma biblioteca que possa fazer isso por você
  • Execute TODAS as alterações desejadas de uma só vez
  • Carregar (confirmar) todas as tabelas/cadeias do netfilter de volta ao kernel
    • Você pode usar iptables-restoreo utilitário ou, semelhante à etapa 1, usar uma biblioteca que possa fazer isso por você

EDITAR:

Ah, como as regras já estão na tabela, você pode usar ocorrespondência de condiçãopara ligá-los/desligá-los.

Insira -m condition --condition $NAMEem sua iptablesregra.

Isso criará um arquivo /proc/net/ipt_condition/$NAME. A correspondência será bem-sucedida se o arquivo contiver 1e, caso contrário, se o arquivo contiver0

(Você pode, é claro, usar a negação !para inverter a correspondência.)

Por exemplo:

iptables -A INPUT -m condition --condition allow_880 -p tcp -m tcp --dport 880 -j ACCEPT

Para ativar a regra:

echo 1 > /proc/net/ipt_condition/allow_880

Desabilitar:

echo 0 > /proc/net/ipt_condition/allow_880

(Você é livre para usar o nome que quiser, recomendo torná-los facilmente identificáveis. Há um comprimento máximo para o nome, mas não me lembro qual.)

Editar 1a:

Se você já construiu a tabela, a maneira mais fácil de editar é salvar a saída de iptables-save, editá-la (adicionar as correspondências de condição para as regras que precisam delas) e carregar o arquivo inteiro usando iptables-restoreouiptables-apply

Lembre-se: 1 arquivo de condição pode controlar mais de 1 regra; você não é obrigado a ter 1 arquivo por regra, a menos que realmente queira assim.

Editar 1b:

Como @AB mencionou nos comentários (obrigado!), -m conditionPode não ser um recurso padrão para os iptables integrados da sua distribuição; nesse caso, você provavelmente precisará instalar um pacote adicional, por exemplo, xtables-addons.

(Desculpe, esqueci disso porque estou no Gentoo e o iptablespacote no Gentoo simplesmente segue o que é o kernel .config.)

Responder2

O Nftables pode ser mais adequado neste caso. O nftables foi projetado para ser mais eficiente e escalável do que o iptables, especialmente com conjuntos de regras complexos ou modificações frequentes. Ele oferece melhor desempenho devido à sua integração ao kernel Linux e sintaxe simplificada.

informação relacionada