Я хотел бы удалить некоторые правила NAT POSTROUTING в автоматическом режиме на основе IP-адреса источника или назначения.
Я знаю IP-адрес источника и назначения, но мне не обязательно знать, какие политики уже существуют.
Например, у меня может быть это:
-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
или я могу просто получить это:
-A POSTROUTING -s 10.10.10.10/32 -j SNAT --to-source 1.2.3.4
Я хочу отменить назначение этого адреса NAT со старого компьютера и назначить его новому компьютеру. Все это автоматизировано, поэтому я не могу найти это вручную.
Как лучше всего удалить старые политики только для этого IP-адреса? Могу ли я использовать команду list + grep? Обычно я зависаю в мире Windows, поэтому не знаю, как лучше с этим справиться.
Вы можете сопоставить правило удаления, указав его точно и используя -D
(--delete
) вместо того -A
. Например:
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
Чтобы написать сценарий, сопоставив определенный IP-адрес и не теряя никаких правил из-за состояния гонки, давайте попробуем что-то вроде этого. Это удалит любое правило в таблице nat, содержащее данный 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
Некоторые примечания по этому поводу: мы используем grep -w
чтобы убедиться, что IP-адреса точно совпадают, и, например, данный адрес, который заканчивается на 25
не совпадает 250
. Преобразование из -A
к -D
делается sed
в петле. И мы используем xargs
чтобы раскрыть каждое правило в параметрах.
iptables -t nat -L POSTROUTING -n --line-numbers | grep -w 1.2.3.4 | awk '{print $1}'
Это будет grep IP, который вы хотите, и захватить номер строки правила брандмауэра. Затем используйте iptables -t nat -D POSTROUTING 1
для удаления правила 1 или любого другого номера.