Como atualizar de forma limpa e silenciosa as regras do iptables?

1

Eu tenho scripts muito complicados e longos do iptables. Não é possível operar na configuração existente do iptables, fazendo inserções manuais / substituições ou exclusões. Eu tenho um script que simplesmente libera todas as regras e cadeias personalizadas, em seguida, recarrega tudo do zero. Essa abordagem funciona bem, até certo ponto.

Tenho muito tráfego confidencial, como linhas E1 encapsuladas em pacotes IP e muitas outras. Não posso simplesmente abandonar todas as regras e reinseri-las, porque isso é simplesmente muito lento. Muita coisa quebra se não há regra para mais de 50ms. Além disso, parte do tráfego de alto throughput é executado no firewall parcialmente restaurado, o que resulta em entradas muito ruins do conntrack, que exigem intervenção manual para restaurar a funcionalidade.

A solução seria acrescentar novas regras no final da corrente, depois remover as antigas, o que teoricamente pode resultar em um conjunto de regras contínuas. O problema é que um script com cadeias customizadas, ipset's e outras está ficando muito complicado e propenso a erros.

A pergunta é - você conhece alguma solução existente (camada extra sobre o iptables), que lida com os problemas que mencionei aqui?

Obrigado antecipadamente.

    
por mdrozdziel 21.01.2011 / 02:22

5 respostas

5

Você já tentou carregar suas novas regras com o comando iptables-restore ? Isso é, em teoria, uma operação atômica, que pode cuidar da maioria dos seus problemas. Isso requer que você escreva suas regras no formato usado por iptables-save .

    
por 21.01.2011 / 02:36
3

Isso deve ser bem fácil se você usar correntes.

Crie uma corrente ou duas e adicione todas as suas regras a isso. Tudo o que você precisa fazer é liberar, excluir e recriar a (s) corrente (s) quando precisar reaplicar suas regras.

Assim, durante uma atualização, você insere uma regra no topo que permite conexões estabelecidas, (talvez você queira que esta seja uma regra sempre habilitada e nunca tocada), liberar a cadeia e adicionar as novas regras à cadeia . Isso pressupõe que você esteja usando regras com estado sempre que possível.

    
por 21.01.2011 / 02:38
0

Eu não acho que haja uma solução para um caso extremo como o seu. No entanto, a boa notícia é que seria muito fácil escrever um script em Python que substituísse a inserção da regra desejada acima da antiga e depois excluir a antiga.

orchidea 10.0.0.1 /etc/exim % iptables -L -n --line-numbers
Chain RH-Firewall-1-INPUT (2 references)
num  target     prot opt source               destination
1    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0
2    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0
3    ACCEPT     icmp --  0.0.0.0/0            0.0.0.0/0           icmp type 255
4    ACCEPT     udp  --  0.0.0.0/0            0.0.0.0/0           udp dpt:53

Apenas analise a saída acima para cadeia e número de regra, digamos 4, faça iptables -I chain 4 newrule e, em seguida, iptables -D chain 5.

    
por 22.01.2011 / 23:58
0

Sugiro adaptar o script para que ele use um dos dois nomes para a mesma cadeia (faz sentido usar um prefixo), dependendo de como ele é chamado. Então, em vez de uma queda de cadeia, haveria set0_dropthis ou set1_dropthis.

Dessa forma, você pode criar o novo conjunto de regras sem atrapalhar o tráfego. Depois disso, as cadeias padrão seriam liberadas e recriadas com o novo conjunto como destino. O ideal seria ter apenas uma única regra em cada cadeia padrão que direcionaria o tráfego para o antigo ou para o novo conjunto. Substituir essa regra única seria rápido (e até seguro com iptables -A; iptables -D ... 1 ). Depois disso, as correntes do conjunto antigo seriam apagadas e apagadas.

Um script de wrapper detecta qual conjunto está ativo no momento e chama o script real com o respectivo parâmetro.

    
por 11.02.2013 / 17:02
0

A única maneira de isso ser viável é retrabalhar seu script existente para usar o formato de restauração iptables ou modificar seu script existente para despejar comandos para stdout em vez de executá-los e produzir um segundo script para convertê-lo em iptables-restore format.

O iptables-restore é garantido como sendo atômico e, portanto, é a única forma confiável de fazer uma substituição de regras sem falhas.

minha sugestão para você em termos de obter o formato de restauração do iptables seria rodar seu script em uma VM ou em um namespace de rede separado na máquina live e então usar o comando iptables-save para pegá-lo.

    
por 11.02.2013 / 17:21