Iptables удаляет определенные правила по комментариям

Мне нужно удалить некоторые правила с тем же комментарием.

Например, у меня есть правила с комментарием = "test it", поэтому я могу получить их список следующим образом:

sudo iptables -t nat -L | grep 'test it'

Но как я могу удалить все правила PREROUTING с комментарием 'test it'?

UPD: Как сказал @hek2mgl, я могу сделать что-то вроде этого:

sudo bash -c "iptables-save > iptables.backup"
sed -i '/PREROUTING.*--comment.* "test it"/d' iptables.backup
sudo iptables-restore < iptables.backup
sudo rm iptables.backup

Но между сохранением и восстановлением могут быть изменения в iptables, поэтому после восстановления будут проблемы =/

Ответ 1

Вы можете использовать следующую команду:

iptables-save | sed -r '/PREROUTING.*comment.*test it/s/-A/iptables -D/e'

iptables-save вернет команды iptables, которые могут быть выполнены для возврата текущего состояния брандмауэра после перезагрузки или что-то еще.

Значение будет содержать строки типа:

...
-A PREROUTING -p tcp -m tcp --dport 25 -j ACCEPT -m comment --comment "test it"
...

Команда sed выполняет поиск строк, содержащих PREROUTING.*comment.*test it (должно быть достаточно) и добавляет термин iptables плюс заменяет -A на -D, так как -D удаляет правило. Результат операции замены затем выполняется с помощью команды e. Команда e является расширением GNU до sed.


Примечание. Если вы хотите напечатать команду в дополнение к простому ее выполнению, вы можете использовать s/-A/iptables -D/pe.