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?