
У меня есть набор скриптов, которые я разработал для мониторинга сети, управления и т. д. Одна из вещей, которую я делаю в этих скриптах, — это создание цепочки 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
двоичного файла и разбора его вывода.