Como remover todas as regras referentes a uma cadeia no iptables?

1

Eu tenho um conjunto de scripts que projetei para monitoramento de rede, controle e assim por diante. Uma coisa que faço nesses scripts é criar uma cadeia de iptables como iptables -N mychain . Em seguida, insiro regras nas tabelas principais, conforme apropriado, para obter pacotes para minha cadeia personalizada para qualquer finalidade que eu queira que eles tenham lá.

Minha pergunta é: eu tenho um script que faz um "Refresh" - em outras palavras, ele remove todas as regras e inicia novamente. É útil em caso de anomalias estranhas que surgem. As pessoas geralmente ainda gerenciam manualmente o iptables, mesmo que haja algo gerenciando parte dele. (É por isso que eu queria que todo o meu trabalho fosse feito em uma mesa separada).

Se eu quiser limpar minha cadeia, é fácil: iptables -F mychain . Mas o que eu não sei como fazer é remover qualquer regra que eu possa ter criado que faça referência a essa cadeia de volta nas cadeias internas (INPUT, OUTPUT, etc.)

Vamos supor que houve um bug no meu aplicativo, ou que um usuário estava mexendo e acabou mexendo nas tabelas e, de alguma forma, adicionou a regra à cadeia INPUT duas vezes. Agora os pacotes passarão pela cadeia duas vezes - sendo contados duas vezes, sendo roteados duas vezes, o que for.

A solução óbvia para isso é percorrer as cadeias principais e remover qualquer regra cujo destino de salto seja minha cadeia personalizada. Mas eu não sei como fazer isso.

Veja um exemplo da pior situação que podemos configurar:

iptables -N TEST
iptables -A INPUT -j TEST
iptables -I INPUT 1 -p tcp --dport 1234 -j TEST
iptables -I INPUT 1 -p tcp --dport 1234 -j TEST # again, for doubling error
iptables -I INPUT -p icmp -j TEST

Vamos supor que um administrador sem escrúpulos ou desinformado tenha criado as três regras mais inferiores.

Então, agora, eu poderia emitir iptables -D INPUT -j TEST e a regra que criei desapareceria. No entanto, essas outras regras não serão excluídas, pois os parâmetros ao usar -D precisam corresponder. Então, mesmo que eu remova minha própria regra diligentemente, os pacotes ainda podem acabar lá mais de uma vez por razões diferentes.

Limpar as correntes principais não é necessariamente apropriado. Novamente, usar o iptables na linha de comando é comum (eu faço isso o tempo todo), então limpar cegamente a regra every pode limpar algo que alguém adicionou por um bom motivo, mesmo que seja uma regra temporária.

A solução óbvia é de alguma forma remover qualquer regra cujo destino é a TEST chain e remover essas regras. No entanto, eu não vi nenhum comando na página de manual do iptables que pudesse realizar isso.

A coisa mais próxima que eu vi que pode ser de qualquer usuário é iptables -S . Eu poderia usar iptables -S e criar um analisador para interpretar a saída, mas isso é um pouco de trabalho extra. Eu estava me perguntando se existe uma maneira mais correta de excluir regras em algum tipo de curinga. Novamente, remova qualquer regra cujo destino de salto seja qualquer que seja a cadeia desejada.

Uma situação semelhante pode ocorrer se eu tiver uma cadeia da qual desejo me livrar, mas ela tem uma referência em outro lugar. Eu gostaria de poder descobrir onde essa referência é e, muito provavelmente, excluir também.

Isso é possível? Ou eu vou acabar tendo que escrever um analisador para interpretar o iptables -S output?

    
por fdmillion 09.05.2014 / 02:28

3 respostas

5

Isso deve ser bem simples. Use o iptables-save para gravar o conjunto de regras atual em um arquivo ou stdout, remova qualquer coisa com -j YOURCHAIN e carregue o resultado de volta com o comando iptables-restore

Isso é tentador fazer como um tubo

iptables-save | grep -v -- '-j YOURCHAIN' | iptables-restore

No entanto, não tenho certeza se a execução de salvar e restaurar simultaneamente funcionaria bem. Seria mais seguro separar o salvamento da restauração. Haverá uma pequena região crítica em que uma atualização intermediária ao conjunto de regras será perdida.

    
por 09.05.2014 / 11:23
2

Eu não acho que haja uma maneira trivial de resolver isso além de recarregar toda a configuração.

Você talvez deva pensar em adicionar uma política de descontinuidade à sua cadeia dessa forma, pelo menos, se você for diligente, causará problemas para os menos e talvez provocar alguma discussão.

Do ponto de vista técnico, se você vai ter que analisar a saída de vários comandos, você pode achar --line-num útil, mas lembre-se de deletar em ordem reversa (alta para baixa) para que o índice não seja mude sempre.

    
por 09.05.2014 / 10:11
0

Se você precisar de manipulações avançadas em iptables , vale a pena dar uma olhada em um excelente link da biblioteca python. Ele fornece uma interface programática (leitura e modificação) para netfilter . A interoperabilidade com iptables é obtida usando as bibliotecas iptables C ( libiptc , libxtables e as extensões iptables ), não chamando o iptables binário e analisando sua saída.

    
por 11.06.2017 / 11:11