
Estou escrevendo um script que monitora diferentes métricas (por exemplo, uso de largura de banda da interface) e alterando iptables
as regras de acordo. Essas alterações podem ocorrer pelo menos 2x por segundo, até 4 * number of interfaces
por segundo.
O problema é que não tenho certeza de como iptables
lidar 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 iptables
comando 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 iptables
invocaçã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 rate
para corresponder com mais/menos frequência, alterando os sinalizadores de QoS etc.), talvez ipset
nã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-save
o utilitário ou, dependendo de onde você escreve seu script, talvez haja uma biblioteca que possa fazer isso por você
- Você pode usar
- 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-restore
o utilitário ou, semelhante à etapa 1, usar uma biblioteca que possa fazer isso por você
- Você pode usar
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 $NAME
em sua iptables
regra.
Isso criará um arquivo /proc/net/ipt_condition/$NAME
. A correspondência será bem-sucedida se o arquivo contiver 1
e, 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-restore
ouiptables-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 condition
Pode 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 iptables
pacote 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.