iptables - Limpar todas as regras PREROUTING com um endereço de destino específico

5

Eu tenho um script que adiciona regras de PREROUTING iptable. Todos eles têm o mesmo para resolver. Quando eu corro isso:

 iptables --list PREROUTING -t nat

Eu vejo a saída assim:

 DNAT       tcp  --  anywhere             165.193.122.18      tcp dpt:https to:192.168.2.1:443
 DNAT       tcp  --  anywhere             63.135.91.11        tcp dpt:https to:192.168.2.1:443
 DNAT       tcp  --  anywhere             63.135.90.224       tcp dpt:https to:192.168.2.1:443

Parece que eu deveria ser capaz de largar todas essas regras escrevendo um comando como este ...

"drop all PREROUTING rules that go to 192.168.2.1:443"

Então, ao olhar as opções para itables, parece que eu preciso usar a opção -D. Mas eu não conheço o rulenum para dar. : - (

Então, eu provavelmente preciso consultar as regras existentes, grep para limitá-lo ao destino 192.168.2.1:443 e executar -D passando o rulenum para cada um. Eu não tenho ideia de como fazer isso. Qualquer ajuda seria apreciada.

Obrigado!

EV

    
por user548971 22.06.2012 / 20:16

4 respostas

3

Algo parecido com isto:

#!/bin/bash

for line_num in $(sudo iptables --line-numbers --list PREROUTING -t nat | awk '$7=="to:192.168.2.1:443" {print $1}')
do
  # You can't just delete lines here because the line numbers get reordered
  # after deletion, which would mean after the first one you're deleting the
  # wrong line. Instead put them in a reverse ordered list.
  LINES="$line_num $LINES"
done

# Delete the lines, last to first.
for line in $LINES
do
  sudo iptables -t nat -D PREROUTING $line
done

unset LINES

Você pode precisar ajustar o número do campo no awk, se não for compatível.

    
por 22.06.2012 / 20:44
1

Você pode simplificar a reversão de linha com tac:

#!/bin/bash

for line in $(sudo iptables --line-numbers --list PREROUTING -t nat | awk '$7=="to:192.168.2.1:443" {print $1}' | tac)
do
  # You can't just delete lines here because the line numbers get reordered
  # after deletion, which would mean after the first one you're deleting the
  # wrong line. Instead put them in a reverse ordered list.
  sudo iptables -t nat -D PREROUTING $line
done
    
por 13.01.2013 / 12:54
1

Você pode usar o seguinte one-liner:

sudo iptables -S | grep $pattern | cut -d " " -f 2- | xargs -L1 sudo iptables -D

Onde $ pattern é o seu padrão desejado.

Eu recomendo que você primeiro faça o eco dos resultados desse comando para evitar dramas

    
por 09.12.2015 / 15:41
0

Use --line-numbers para exibir o número da regra, grep e awk e você tem isso.

# iptables -vnL -t nat --line-numbers |grep 10.1.1.0|awk '{print $1}' 
1

Você pode usar for para limpar todas as regras correspondentes a um IP específico.

# for rule in $(iptables -vnL -t nat --line-numbers |grep 10.1.1.0|awk '{print $1}'); do iptables -D INPUT $rule; done

Lembre-se de que esses números são mostrados por tabela, portanto, pode ser necessário limitar o comando list por tabela e limpar um por um.

    
por 22.06.2012 / 20:43