Удалить цепочку iptables со всеми ее правилами


31

У меня есть цепочка со многими правилами, такими как:

> :i_XXXXX_i - [0:0]
> -A INPUT -s 282.202.203.83/32 -j i_XXXXX_i 
> -A INPUT -s 222.202.62.253/32 -j i_XXXXX_i 
> -A INPUT -s 222.202.60.62/32 -j i_XXXXX_i 
> -A INPUT -s 224.93.27.235/32 -j i_XXXXX_i 
> -A OUTPUT -d 282.202.203.83/32 -j i_XXXXX_i 
> -A OUTPUT -d 222.202.62.253/32 -j i_XXXXX_i 
> -A OUTPUT -d 222.202.60.62/32 -j i_XXXXX_i 
> -A OUTPUT -d 224.93.27.235/32 -j i_XXXXX_i

когда я пытаюсь удалить эту цепочку с:

iptables -X XXXX

но получил ошибку вроде (пробовал iptables -F XXXXX раньше):

iptables: слишком много ссылок.

Есть ли простой способ удалить цепочку по одной команде?


2
Я не видел iptables barf как раньше, когда пытался сбросить.
Том О'Коннор

Просто любопытно ... сколько правил "много"?
Ладададада

1
2 много - это много :), если я сначала попытаюсь удалить правила, будет много раз набирать: iptables -D OUTPUT -d XXX / 32 -j i_XXXXX_i
timy

3
Попробуйте это:iptables-save | grep -v i_XXXXX_i | iptables-restore
Стивен Понедельник

@ StevenMonday, почему бы не написать как ответ, это самый полезный (альтернатива сделать это через файл и редактировать файл). Единственное, что он не удаляет - это полные таблицы (в любом случае «сырые»)
nhed

Ответы:


38

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

-F, --flush [цепочка]

Сбросить выбранную цепочку (все цепочки в таблице, если ни одна не указана). Это эквивалентно удалению всех правил одно за другим.

-X, --delete-chain [цепочка]

Удалите указанную необязательную пользовательскую цепочку. Там не должно быть никаких ссылок на цепочку. Если есть, вы должны удалить или заменить ссылающиеся правила, прежде чем цепочка может быть удалена. Цепочка должна быть пустой, то есть не содержать никаких правил. Если аргумент не указан, он попытается удалить все не встроенные цепочки в таблице.


Я просто хочу найти способ удалить цепочку (имеет много ссылок на '-j CHAINTODELETE') напрямую, но из вашего ответа это кажется невозможным :(
timy

1
Комментарий @timy StevenMonday в один проход удалит все ссылки на цепочку. Возможно, не идеал, но чертовски близко.
Джефф Ферланд

12

Это потенциально не по теме, но это то, что я сделал после того, как нашел этот пост! Для некоторых случаев использования может быть полезна опция iptables -D. Так как это позволяет вам очистить ссылающиеся правила, добавленные программно с -A (если вы точно знаете, как вы их добавили).

Например

    iptables -N MYCHAIN
    iptables -A INPUT -i interface -j MYCHAIN
    iptables -A MYCHAIN -j ACCEPT

можно поменять местами с

   iptables -D INPUT -i interface -j MYCHAIN
   iptables --flush MYCHAIN
   iptables -X MYCHAIN

8

Вам нужно два шага, но это делается в одной команде.

Создайте файл и поместите его в него.

# Empty the entire filter table
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
COMMIT

Сохраните файл как "clear-all-rules". Теперь выполните эту команду:

iptables-restore < clear-all-rules

Теперь вы можете очистить его в любое время с помощью одной команды.


1
+1 На самом деле это самый быстрый способ начать с чистой конфигурации fw.
dr01

6

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

Дамп вашего iptablesнабора правил в файл:

iptables-save > /tmp/iptables.txt

Удалите ВСЕ случаи использования (и ссылки на) оскорбительной цепочки:

sed -i '/i_XXXXX_i/d' /tmp/iptables.txt

Затем перезагрузите набор правил:

iptables-restore < /tmp/iptables.txt && rm /tmp/iptables.txt

0

Что-то в этом духе соберет их все в одну строку, никоим образом не снимая iptables.

for chain in `iptables -L |grep i_XXXXX_i|awk '{ print $2 }'`; do iptables -X $chain; done

0

В файле iptables man есть опция -S

S, --list-rules [цепочка] Вывести все правила в выбранной цепочке. Если цепочка не выбрана, все цепочки печатаются как iptables-save. Как и любая другая команда iptables, она применяется к указанной таблице (по умолчанию используется фильтр).

С помощью iptables -S | grep <CHAINNAMEHERE>. Например:

root @ root: ~ # iptables -S | grep TRAFFICLOG

-N TRAFFICLOG

-A ВПЕРЕД -i eth0 -j TRAFFICLOG

Затем вы можете увидеть, какие правила блокируют удаление цепочки из таблицы. Просмотрите каждое правило (кроме iptables -N <CHAINNAMEHERE>и удалите правило, используя -Dопцию

-D, --delete chain rulenum Удалить одно или несколько правил из выбранной цепочки. Существует две версии этой команды: правило может быть указано как число в цепочке (начиная с 1 для первого правила) или как правило для сопоставления.

Например iptables -D FORWARD -i eth0 -j TRAFFICLOG. После того, как вы удалили каждое правило для вашей цепи очистит цепочку с -Fопцией iptables -F <CHAINNAMEHERE>.

-F, --flush [цепочка] Сброс выбранной цепочки (все цепочки в таблице, если ни одна не указана). Это эквивалентно удалению всех правил одно за другим.

Затем удалите свою цепочку с -Xопцией,iptables -X <CHAINNAMEHERE>

-X, --delete-chain [chain] Удалить необязательную указанную пользователем цепочку. Там не должно быть никаких ссылок на цепочку. Если есть, вы должны удалить или заменить ссылающиеся правила, прежде чем цепочка может быть удалена. Цепочка должна быть пустой, то есть не содержать никаких правил. Если аргумент не указан, он попытается удалить все не встроенные цепочки в таблице.

Iptables - сложный набор инструментов, поэтому необходим идеальный учебник. Вы можете попробовать один на www.iptables.info


0

Это будет выплевывать цепи и удалять их

for i in $(iptables -S | awk '{print $2}' | uniq ); do iptables -F $i && iptables -Z $i && iptables -X $i  ; done

0

Я обнаружил, что вы можете удалить правила и цепочку, отредактировав файл правил в /etc/iptables/rules.v4. Если вы удалите ненужную цепочку в этом файле и затем перезагрузите iptables, вы больше не увидите цепочку при выполнении iptables -L.


Этот файл существует только в определенных дистрибутивах Linux, а затем только в определенных версиях определенных дистрибутивов Linux.
Майкл Хэмптон
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.