Exclui uma cadeia de iptables com todas as suas regras

28

Eu tenho uma corrente 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 eliminar esta cadeia com:

iptables -X XXXX

mas tem erro como (tentou iptables -F XXXXX antes):

iptables: Too many links.

Existe uma maneira fácil de excluir a cadeia pelo comando uma vez?

    
por timy 02.04.2012 / 19:15

8 respostas

33

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

-F, --flush [chain]

Flush the selected chain (all the chains in the table if none is given). This is equivalent to deleting all the rules one by one.

-X, --delete-chain [chain]

Delete the optional user-defined chain specified. There must be no references to the chain. If there are, you must delete or replace the referring rules before the chain can be deleted. The chain must be empty, i.e. not contain any rules. If no argument is given, it will attempt to delete every non-builtin chain in the table.

    
por 02.04.2012 / 19:33
11

Isso é potencialmente fora do tópico, mas é o que eu fiz depois que encontrei este post! Para alguns casos de uso, a opção iptables -D pode ser útil. Desde que ele permite que você limpe as regras de referência adicionadas programaticamente com -A (se você souber precisamente 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
    
por 29.12.2013 / 21:47
6

Você precisa de duas etapas, mas isso é feito no comando one .

Crie um arquivo e coloque isso nele.

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

Salve o arquivo como "clear-all-rules". Agora, faça este comando:

iptables-restore < clear-all-rules

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

    
por 02.10.2014 / 20:07
4

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

Envie seu conjunto de regras iptables para um arquivo:

iptables-save > /tmp/iptables.txt

Remova TODOS os usos de (e referências a) a cadeia problemática:

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
    
por 02.04.2012 / 19:50
0

Algo ao longo destas linhas irá obter todos eles em uma única linha sem reduzir o iptables de qualquer forma.

for chain in 'iptables -L |grep i_XXXXX_i|awk '{ print $2 }''; do iptables -X $chain; done
    
por 02.10.2014 / 19:56
0

No arquivo man do iptables existe uma opção -S

S, --list-rules [chain] Print all rules in the selected chain. If no chain is selected, all chains are printed like iptables-save. Like every other iptables command, it applies to the specified table (filter is the default).

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

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

-N TRAFFICLOG

-A FORWARD -i eth0 -j TRAFFICLOG

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

-D, --delete chain rulenum Delete one or more rules from the selected chain. There are two versions of this command: the rule can be specified as a number in the chain (starting at 1 for the first rule) or a rule to match.

Por exemplo, iptables -D FORWARD -i eth0 -j TRAFFICLOG . Depois de ter excluído cada regra para sua cadeia, elimine a cadeia com a opção -F , iptables -F <CHAINNAMEHERE> .

-F, --flush [chain] Flush the selected chain (all the chains in the table if none is given). This is equivalent to deleting all the rules one by one.

Em seguida, exclua sua cadeia com a opção -X , iptables -X <CHAINNAMEHERE>

-X, --delete-chain [chain] Delete the optional user-defined chain specified. There must be no references to the chain. If there are, you must delete or replace the referring rules before the chain can be deleted. The chain must be empty, i.e. not contain any rules. If no argument is given, it will attempt to delete every non-builtin chain in the table.

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

    
por 17.12.2014 / 21:37
0

Isso vai soltar correntes e apagá-las

for i in $(iptables -S | awk '{print $2}' | uniq ); do iptables -F $i && iptables -Z $i && iptables -X $i  ; done
    
por 07.09.2016 / 10:13
0

Descobri que você pode remover as regras e a cadeia editando o arquivo de regras em /etc/iptables/rules.v4. Se você deletar a cadeia indesejada nesse arquivo e, em seguida, recarregar o iptables, você não deve mais ver a cadeia ao fazer um iptables -L.

    
por 04.05.2018 / 15:02