Назад | Перейти на главную страницу

Динамическое удаление политики iptables по IP-адресу

Я хотел бы удалить некоторые правила 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 или любого другого номера.