У меня есть цепочка с множеством правил, например:
> :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: слишком много ссылок.
Есть ли простой способ удалить цепочку командой Once?
Вы не можете удалять цепочки, если правила с '-j CHAINTODELETE' ссылаются на них. Выясните, на что ссылается ваша цепочка (ссылка), и удалите это. Также промойте, затем убейте.
-F, --flush [цепочка]
Очистить выбранную цепочку (все цепочки в таблице, если ни одна не указана). Это эквивалентно удалению всех правил по одному.
-X, --delete-chain [цепочка]
Удалите указанную необязательную определяемую пользователем цепочку. Ссылки на цепочку быть не должны. Если есть, то вы должен удалить или заменить правила ссылки прежде, чем цепочку можно будет удалить. Цепочка должна быть пустой, т.е. не содержать никаких правил. Если аргумент не указан, он попытается удалить каждую не встроенную цепочку в таблице.
Это потенциально не по теме, но это то, что я сделал после того, как нашел этот пост! В некоторых случаях может быть полезна опция 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
Вам нужно два шага, но это делается за один команда.
Создайте файл и поместите его в него.
# Empty the entire filter table
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
COMMIT
Сохраните файл как "все правила". Теперь выполните эту команду:
iptables-restore < clear-all-rules
Теперь вы можете очистить его в любое время с помощью всего одной команды.
Вот альтернативный план. Он включает в себя три команды, а не одну, но, если повезет, он должен работать.
Сбрось свой iptables
набор правил в файл:
iptables-save > /tmp/iptables.txt
Удалите ВСЕ случаи использования (и ссылки на) нарушающей цепочки:
sed -i '/i_XXXXX_i/d' /tmp/iptables.txt
Затем перезагрузите набор правил:
iptables-restore < /tmp/iptables.txt && rm /tmp/iptables.txt
В файле man iptables есть опция -S
S, --list-rules [цепочка] Вывести все правила в выбранной цепочке. Если цепочка не выбрана, все цепочки печатаются как iptables-save. Как и любая другая команда iptables, она применяется к указанной таблице (по умолчанию используется фильтр).
Используя iptables -S | grep <CHAINNAMEHERE>
. Например:
root @ root: ~ # iptables -S | grep TRAFFICLOG
-N ДОРОЖНЫЙ ЖУРНАЛ
-A ВПЕРЕД -i eth0 -j ДОРОЖНЫЙ ЖУРНАЛ
затем вы можете увидеть, какие правила блокируют удаление цепочки из таблицы. Просмотрите каждое правило (кроме 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 [цепочка] Удалить необязательную указанную пользователем цепочку. Ссылки на цепочку быть не должны. Если да, то перед удалением цепочки необходимо удалить или заменить правила ссылки. Цепочка должна быть пустой, т.е. не содержать никаких правил. Если аргумент не указан, он попытается удалить каждую не встроенную цепочку в таблице.
Iptables - это сложный набор инструментов, поэтому необходим идеальный учебник. Вы можете попробовать один на www.iptables.info
Что-то в этом роде объединит их всех в одну строку, никоим образом не отключая iptables.
for chain in `iptables -L |grep i_XXXXX_i|awk '{ print $2 }'`; do iptables -X $chain; done
Это выплюнет цепочки и удалит их
for i in $(iptables -S | awk '{print $2}' | uniq ); do iptables -F $i && iptables -Z $i && iptables -X $i ; done
Я обнаружил, что вы можете удалить правила и цепочку, отредактировав файл правил в /etc/iptables/rules.v4. Если вы удалите ненужную цепочку в этом файле, а затем перезагрузите iptables, вы больше не должны видеть цепочку при выполнении команды iptables -L.