Я использую iptables v1.6.0
на Slackware 14.2.
У меня есть некоторые правила фильтрации iptables, которые используют пользовательские цепочки. Пример вывода из iptables-save
может выглядеть так
*filter
:INPUT DROP - [0:0]
:FORWARD DROP - [0:0]
:OUTPUT DROP - [0:0]
:custom_chain - [0:0]
-A INPUT -j custom_chain
-A OUTPUT -j ACCEPT
-A custom_chain -j ACCEPT
COMMIT
Согласно справочной странице iptables-restore
опция -n
должна оставить текущий набор правил без изменений и только добавить новые правила.
-n, --noflush
don't flush the previous contents of the table. If not
specified,both commands flush (delete) all previous contents
of the respective table.
Тем не менее, если я пытаюсь добавить правила, такие как
# cat new_rules
*filter
:INPUT DROP - [0:0]
:FORWARD DROP - [0:0]
:OUTPUT DROP - [0:0]
:custom_chain - [0:0]
:new_chain - [0:0]
-A new_chain -j DROP
COMMIT
с помощью iptables-restore
с параметром -n
и проверьте набор правил с помощью iptables-save
# iptables-restore -n < new_rules
# iptables-save
*filter
:INPUT DROP - [0:0]
:FORWARD DROP - [0:0]
:OUTPUT DROP - [0:0]
:custom_chain - [0:0]
:new_chain - [0:0]
-A INPUT -j custom_chain
-A OUTPUT -j ACCEPT
-A new_chain -j DROP
COMMIT
тогда цепочки по умолчанию остаются неизменными, но пользовательская цепочка сбрасывается, несмотря на параметр -n
. Есть ли способ сохранить старые пользовательские цепочки? Если это не ошибка, то в чем причина такого поведения?
ОБНОВИТЬ
Дальнейшие исследования показывают, что пользовательские цепочки сбрасываются только в том случае, если они явно упоминаются в файле new_rules
. Однако это не решает проблему, поскольку все еще невозможно добавить правило в существующую пользовательскую цепочку. iptables-restore -n < new_rules
прежнему сбрасывает и теряет все предыдущие правила в этой пользовательской цепочке, оставляя только одно правило, которое должно быть добавлено дополнительно.