Как удалить все правила, ссылающиеся на цепочку в iptables?

Как удалить все правила, ссылающиеся на цепочку в iptables?

У меня есть набор скриптов, которые я разработал для мониторинга сети, управления и т. д. Одна из вещей, которую я делаю в этих скриптах, — это создание цепочки iptables, например iptables -N mychain. Затем я вставляю правила в основные таблицы по мере необходимости, чтобы пакеты попадали в мою пользовательскую цепочку для любой цели, которую я хочу, чтобы они там имели.

Мой вопрос: у меня есть скрипт, который делает "Обновление" - другими словами, он удаляет все правила и начинает заново. Это полезно в случае возникновения каких-либо странных аномалий. Люди часто продолжают вручную управлять iptables, даже если есть что-то, управляющее его частью. (Вот почему я хотел, чтобы вся моя работа была сделана в отдельной таблице.)

Если я хочу очистить свою цепочку, это легко: iptables -F mychain. Но то, что янезнаю, как это сделать, — удалить любое правило, которое я мог создать и которое ссылается на эту цепочку обратно во встроенных цепочках (INPUT, OUTPUT и т. д.)

Предположим, что в моем приложении был баг, или пользователь игрался и в итоге испортил таблицы, и это каким-то образом добавило правило в цепочку INPUT дважды. Теперь пакеты будут проходить через цепочку дважды — дважды подсчитываться, дважды маршрутизироваться, что угодно.

Очевидное решение этой проблемы — пройти по основным цепочкам и удалить все правила, целью перехода которых является моя пользовательская цепочка. Но я не знаю, как это сделать.

Вот пример наихудшей ситуации, которую мы могли бы организовать:

iptables -N TEST
iptables -A INPUT -j TEST
iptables -I INPUT 1 -p tcp --dport 1234 -j TEST
iptables -I INPUT 1 -p tcp --dport 1234 -j TEST # again, for doubling error
iptables -I INPUT -p icmp -j TEST

Предположим, что три самых нижних правила создал недобросовестный или неинформированный администратор.

Итак, теперь я мог бы выдать, iptables -D INPUT -j TESTи созданное мной правило исчезло бы. Однако те другие правила не были бы удалены, поскольку параметры при использовании -Dдолжны совпадать. Поэтому даже если я старательно удалю свое собственное правило, пакеты все равно могут оказаться там больше одного раза по разным причинам.

Очистка основных цепочек не обязательно уместна. Опять же, использование iptables в командной строке является обычным делом (я сам делаю это постоянно), поэтому просто слепая очисткакаждыйправило может отменить что-то, добавленное кем-то по веской причине, даже если это временное правило.

Очевидное решение — как-то удалитьлюбойправило, назначением которого является TESTцепочка, и удалить эти правила. Однако я не видел никаких команд на странице руководства iptables, которые могли бы это сделать.

Ближайшее, что я смог увидеть, что может быть у любого пользователя, это iptables -S. Я мог бы использовать iptables -Sи создать парсер для интерпретации вывода, но это немного дополнительной работы. Мне просто интересно, есть ли более правильный способ удаления правил каким-то образом с подстановочными знаками. Опять же, удалите любое правило, целью перехода которого является любая цепочка, которую я хочу.

Похожая ситуация может возникнуть, если у меня есть цепочка, от которой я хочу избавиться, но у нее есть ссылка где-то еще. Я хотел бы иметь возможность выяснить, где находится эта ссылка, и, скорее всего, удалить ее тоже.

Возможно ли это? Или мне придется писать парсер для интерпретации iptables -Sвывода?

решение1

Это должно быть довольно просто. Используйте iptables-save, чтобы записать текущий набор правил в файл или stdout, удалите все -j YOURCHAINи загрузите результат обратно с помощью iptables-restore

Это заманчиво сделать как трубку

iptables-save | grep -v -- '-j YOURCHAIN' | iptables-restore

Однако я не уверен, что одновременный запуск сохранения и восстановления будет работать хорошо. Было бы безопаснее разделить сохранение и восстановление. Будет небольшая критическая область, где промежуточное обновление набора правил будет потеряно.

решение2

Я не думаю, что есть какой-то простой способ решить эту проблему, кроме как перезагрузить всю конфигурацию.

Возможно, вам стоит подумать о добавлении политики отказа от подписки в вашу цепочку, тогда, по крайней мере, если вы будете усердны, это вызовет проблемы у менее усердных и, возможно, спровоцирует некоторую дискуссию.

С технической точки зрения, если вам придется анализировать вывод различных команд, параметр --line-num может оказаться полезным, но не забывайте удалять в обратном порядке (от большего к меньшему), чтобы индекс не менялся каждый раз.

решение3

Если вам нужны расширенные манипуляции с iptables, отличная библиотека Pythonhttp://ldx.github.io/python-iptables/может быть стоит взглянуть. Он предоставляет программный интерфейс (как для чтения, так и для изменения) для netfilter. Взаимодействие с iptablesдостигается за счет использования iptablesбиблиотек C ( libiptc, libxtables, и iptablesрасширений), без вызова iptablesдвоичного файла и разбора его вывода.

Связанный контент