
Eu tenho um conjunto de scripts que projetei para monitoramento, controle de rede 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 enviar pacotes para minha cadeia personalizada para qualquer finalidade que eu queira que eles tenham lá.
Minha dúvida é: tenho um script que faz um "Refresh" - ou seja, remove todas as regras e recomeça. É útil no caso de surgirem anomalias estranhas. Muitas vezes as pessoas 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 tabela separada.)
Se eu quiser limpar minha cadeia, é fácil:iptables -F mychain
. Mas o que eunãoO que sei fazer é remover qualquer regra que eu possa ter criado que faça referência a essa cadeia 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, roteados duas vezes, tanto faz.
A solução óbvia para isso é percorrer as cadeias principais e remover qualquer regra cujo alvo de salto seja minha cadeia personalizada. Mas não sei como fazer isso.
Aqui está um exemplo da pior situação que poderíamos 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 criou as três regras mais baixas.
Então agora eu poderia emitir iptables -D INPUT -j TEST
e a regra que criei desapareceria. No entanto, essas outras regras não seriam excluídas, pois os parâmetros usados -D
devem corresponder. Portanto, mesmo que eu remova minha própria regra de forma diligente, os pacotes ainda poderão acabar lá mais de uma vez por diferentes motivos.
Lavar as cadeias principais não é necessariamente apropriado. Novamente, usar iptables na linha de comando é comum (eu mesmo faço isso o tempo todo), então apenas limpar cegamentetodoregra pode limpar algo que alguém adicionou por um bom motivo, mesmo que seja uma regra temporária.
A solução óbvia é remover de alguma formaqualquerregra cujo destino é a TEST
cadeia e remover essas regras. No entanto, não vi nenhum comando na página de manual do iptables que pudesse fazer isso.
A coisa mais próxima que pude ver de qualquer usuário é iptables -S
. Eu poderia usar iptables -S
e criar um analisador para interpretar a saída, mas isso dá um pouco de trabalho extra. Eu só estava me perguntando se existe uma maneira mais correta de excluir regras de alguma forma curinga. Novamente, remova qualquer regra cujo alvo de salto seja a cadeia que eu desejar.
Uma situação semelhante pode ocorrer se eu tiver uma cadeia da qual desejo me livrar, mas ela tiver uma referência em outro lugar. Eu gostaria de descobrir onde está essa referência e, provavelmente, excluí-la também.
Isso é possível? Ou terei que escrever um analisador para interpretar a iptables -S
saída?
Responder1
Isto deve ser bastante simples. Use iptables-save para gravar o conjunto de regras atual em um arquivo ou stdout, remova qualquer coisa -j YOURCHAIN
e carregue o resultado de volta com iptables-restore
É tentador fazer isso como um cachimbo
iptables-save | grep -v -- '-j YOURCHAIN' | iptables-restore
No entanto, não tenho certeza se executar salvar e restaurar simultaneamente funcionaria bem. Seria mais seguro separar o salvamento da restauração. Haverá uma pequena região crítica onde uma atualização intermediária do conjunto de regras seria perdida.
Responder2
Não creio que exista uma maneira trivial de resolver isso, a não ser talvez recarregar toda a configuração.
Talvez você deva pensar em adicionar uma política de drop à sua cadeia, dessa forma, pelo menos se você for diligente, isso causará problemas para os menos e talvez provoque alguma discussão.
Do ponto de vista técnico, se você precisar analisar a saída de vários comandos, você pode achar --line-num útil, mas lembre-se de excluir na ordem inversa (de alto para baixo) para que o índice não mude sempre .
Responder3
Se você precisar de manipulações avançadas emiptables
, uma excelente biblioteca pythonhttp://ldx.github.io/python-iptables/pode valer a pena dar uma olhada. Ele fornece uma interface programática (leitura e modificação) para arquivos netfilter
. A interoperabilidade com iptables
é obtida usando as iptables
bibliotecas C ( libiptc
, libxtables
e as iptables
extensões), não chamando o iptables
binário e analisando sua saída.