Remover dinamicamente a política iptables pelo endereço IP

1

Eu gostaria de remover algumas regras de POSTROUTING de NAT de maneira automatizada com base no endereço IP de origem ou de destino.

Conheço o IP de origem e de destino, mas não sei necessariamente quais políticas já existem.

Por exemplo, posso ter isto:

-A POSTROUTING -s 10.10.10.10/32 -p tcp -m tcp --dport 80 -j SNAT --to-source 1.2.3.4
-A POSTROUTING -s 10.10.10.10/32 -p tcp -m tcp --dport 443 -j SNAT --to-source 1.2.3.4
-A POSTROUTING -s 10.10.10.10/32 -j ACCEPT

ou eu posso ter isso:

-A POSTROUTING -s 10.10.10.10/32 -j SNAT --to-source 1.2.3.4

Desejo cancelar a atribuição desse endereço NAT do computador antigo e atribuí-lo a um novo computador. Tudo isso é automatizado, então não posso procurá-lo manualmente.

Qual é a melhor maneira de remover as políticas antigas apenas para esse IP? Eu poderia usar um comando list + grep? Eu normalmente saio no mundo do Windows, então não tenho certeza da melhor maneira de lidar com isso aqui.

    
por Scott Forsyth - MVP 30.01.2014 / 21:40

2 respostas

2

Você pode corresponder uma regra para exclusão especificando-a com precisão e usando -D ( --delete ) em vez de -A . Por exemplo:

iptables -t nat -D POSTROUTING -s 10.10.10.10/32 -p tcp -m tcp --dport 80 -j SNAT --to-source 1.2.3.4

Para fazer isso, correspondendo a um endereço IP específico e não perdendo nenhuma regra devido às condições de corrida, vamos tentar algo assim. Isso excluirá qualquer regra na tabela nat que contenha um determinado endereço IP:

IFS=$'\n'
for rule in 'iptables-save -t nat | grep -w $IP_ADDRESS | sed -e 's/-A/-D/''; do
    echo $rule | xargs iptables -t nat
done

Algumas observações sobre isso: usamos grep -w para garantir que os endereços IP correspondam exatamente e, por exemplo, um determinado endereço que termina em 25 não corresponde a 250 . A transformação de -A para -D é feita por sed no loop. E usamos xargs para expandir cada regra em parâmetros.

    
por 30.01.2014 / 21:47
1

iptables -t nat -L POSTROUTING -n --line-numbers | grep -w 1.2.3.4 | awk '{print $1}'

Isso faria com que o IP fosse o desejado e pegaria o número da linha da regra de firewall. Em seguida, use iptables -t nat -D POSTROUTING 1 para excluir a regra 1 ou o número que você quiser.

    
por 30.01.2014 / 21:46

Tags