Excluir uma cadeia de iptables com todas as suas regras


31

Eu tenho uma cadeia anexada com muitas regras como:

> :i_XXXXX_i - [0:0]
> -A INPUT -s 282.202.203.83/32 -j i_XXXXX_i 
> -A INPUT -s 222.202.62.253/32 -j i_XXXXX_i 
> -A INPUT -s 222.202.60.62/32 -j i_XXXXX_i 
> -A INPUT -s 224.93.27.235/32 -j i_XXXXX_i 
> -A OUTPUT -d 282.202.203.83/32 -j i_XXXXX_i 
> -A OUTPUT -d 222.202.62.253/32 -j i_XXXXX_i 
> -A OUTPUT -d 222.202.60.62/32 -j i_XXXXX_i 
> -A OUTPUT -d 224.93.27.235/32 -j i_XXXXX_i

quando tento excluir esta cadeia com:

iptables -X XXXX

mas obteve erro como (tentei iptables -F XXXXX antes):

iptables: Muitos links.

Existe uma maneira fácil de excluir a cadeia por um comando?


2
Eu nunca vi iptables vomitar assim antes ao tentar liberar.
Tom O'Connor

Apenas curioso ... quantas regras são "muitas"?
Ladadadada

11
2 muitos é muitas :) se eu tentar excluir as regras primeiro, ele vai gostar digitando muitas vezes: iptables -D OUTPUT -d XXX / 32 -j i_XXXXX_i
timy

3
Tente isto:iptables-save | grep -v i_XXXXX_i | iptables-restore
Steven segunda-feira

@StevenMonday Por que não escrever como resposta, esta é a mais útil (alternativa faça isso via arquivo e edite-o). A única coisa que ele não remove é tabelas completas ( "crus" de qualquer maneira)
nhed

Respostas:


38

Você não pode excluir cadeias quando regras com '-j CHAINTODELETE' as referenciam. Descubra o que está referenciando sua cadeia (o link) e remova-o. Além disso, lave e mate.

-F, --flush [cadeia]

Lave a corrente selecionada (todas as correntes na tabela, se nenhuma for fornecida). Isso é equivalente a excluir todas as regras uma por uma.

-X, --delete-cadeia [cadeia]

Exclua a cadeia definida pelo usuário opcional especificada. Não deve haver referências à cadeia. Se houver, você deve excluir ou substituir as regras de referência antes que a cadeia possa ser excluída. A cadeia deve estar vazia, ou seja, não deve conter nenhuma regra. Se nenhum argumento for fornecido, ele tentará excluir todas as cadeias não internas da tabela.


Eu só quero encontrar uma maneira de excluir a cadeia (tem muitas regras de referência '-j CHAINTODELETE') diretamente, mas pela sua resposta, parece impossível :(
timy

11
@timy O comentário de StevenMonday irá, com uma única passagem, remover todas as referências à cadeia. Talvez não seja o ideal, mas muito perto.
Jeff Ferland

12

Isso é potencialmente fora de tópico, mas foi o que fiz depois que encontrei este post! Para alguns casos de uso, a opção iptables -D pode ser útil. Como ele permite limpar as regras de referência adicionadas programaticamente com -A (se você souber exatamente como as adicionou).

Por exemplo

    iptables -N MYCHAIN
    iptables -A INPUT -i interface -j MYCHAIN
    iptables -A MYCHAIN -j ACCEPT

pode ser revertido com

   iptables -D INPUT -i interface -j MYCHAIN
   iptables --flush MYCHAIN
   iptables -X MYCHAIN

8

Você precisa de duas etapas, mas isso ocorre em um comando.

Crie um arquivo e coloque-o nele.

# Empty the entire filter table
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
COMMIT

Salve o arquivo como "limpar todas as regras". Agora, execute este comando:

iptables-restore < clear-all-rules

Agora você pode limpá-lo a qualquer momento com apenas um comando.


11
+1 Esta é realmente a maneira mais rápida de começar com uma configuração limpa do fw.
dr01

6

Aqui está um plano alternativo. Envolve três comandos, não um, mas com sorte, deve funcionar.

Despeje seu iptablesconjunto de regras em um arquivo:

iptables-save > /tmp/iptables.txt

Remova TODOS os usos (e referências) da cadeia incorreta:

sed -i '/i_XXXXX_i/d' /tmp/iptables.txt

Em seguida, recarregue o conjunto de regras:

iptables-restore < /tmp/iptables.txt && rm /tmp/iptables.txt

0

Alguma coisa nesse sentido colocará todos eles em uma única linha sem remover o iptables de forma alguma.

for chain in `iptables -L |grep i_XXXXX_i|awk '{ print $2 }'`; do iptables -X $chain; done

0

No arquivo man do iptables, há uma opção -S

S, --list-rules [chain] Imprime todas as regras na cadeia selecionada. Se nenhuma cadeia for selecionada, todas as cadeias serão impressas como iptables-save. Como todos os outros comandos do iptables, ele se aplica à tabela especificada (o filtro é o padrão).

Usando iptables -S | grep <CHAINNAMEHERE>. Por exemplo:

raiz @ raiz: ~ # iptables -S | grep TRAFFICLOG

-N TRÁFEGO

-A FRENTE -i eth0 -j TRAFFICLOG

você pode ver quais regras estão bloqueando a exclusão da cadeia da tabela. Passe por cada regra (exceto a iptables -N <CHAINNAMEHERE>e exclua a regra usando a -Dopção

-D, --delete cadeia rulenum Exclua uma ou mais regras da cadeia selecionada. Existem duas versões deste comando: a regra pode ser especificada como um número na cadeia (iniciando em 1 para a primeira regra) ou como uma regra correspondente.

Por exemplo iptables -D FORWARD -i eth0 -j TRAFFICLOG. Depois de excluir cada regra da sua corrente, lave a corrente com a -Fopção iptables -F <CHAINNAMEHERE>,.

-F, --flush [chain] Libera a cadeia selecionada (todas as cadeias na tabela, se nenhuma for fornecida). Isso é equivalente a excluir todas as regras uma por uma.

Em seguida, exclua sua cadeia com a -Xopçãoiptables -X <CHAINNAMEHERE>

-X, --delete-chain [cadeia] Exclua a cadeia definida pelo usuário opcional especificada. Não deve haver referências à cadeia. Se houver, você deve excluir ou substituir as regras de referência antes que a cadeia possa ser excluída. A cadeia deve estar vazia, ou seja, não deve conter nenhuma regra. Se nenhum argumento for fornecido, ele tentará excluir todas as cadeias não internas da tabela.

Iptables é um conjunto de ferramentas complicado, portanto é necessário um tutorial ideal. Você pode experimentar um em www.iptables.info


0

Isso cuspirá cadeias e as excluirá

for i in $(iptables -S | awk '{print $2}' | uniq ); do iptables -F $i && iptables -Z $i && iptables -X $i  ; done

0

Descobri que você pode remover as regras e a cadeia editando o arquivo de regras em /etc/iptables/rules.v4. Se você excluir a cadeia indesejada deste arquivo e recarregar o iptables, não deverá mais vê-lo ao executar um iptables -L.


Este arquivo existe apenas em determinadas distribuições Linux e, em seguida, apenas em determinadas versões de determinadas distribuições Linux.
Michael Hampton
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.