Slackware14.2でiptables v1.6.0
を使用しています。カスタムチェーンを使用する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
オプションにもかかわらずカスタムチェーンはフラッシュされます。古いカスタムチェーンを保持する方法はありますか?これがバグではない場合、この動作の理由は何ですか?
[〜#〜] update [〜#〜]
さらに調査したところ、カスタムチェーンは、new_rules
ファイルに明示的に記載されている場合にのみフラッシュされることがわかりました。ただし、既存のカスタムチェーンにルールを追加することはまだ不可能であるため、これでは問題は解決しません。 iptables-restore -n < new_rules
は、そのカスタムチェーン内の以前のすべてのルールをフラッシュして失い、追加されるはずの1つのルールのみを残します。
同じバグに遭遇しました。 https://git.netfilter.org/iptables/tree/iptables/ip6tables-restore.c?id=577b7e20c2af1e6ea2bbe72e0c01802334fa4069 を見てください
航海は正しかったようです
if (ops->builtin(chain, handle) <= 0) {
if (noflush && ops->is_chain(chain, handle)) {
DEBUGP("Flushing existing user defined chain '%s'\n", chain);
if (!ops->flush_entries(chain, handle))
xtables_error(PARAMETER_PROBLEM,
"error flushing chain "
"'%s':%s\n", chain,
strerror(errno));
これは組み込みチェーンではなく、noflushは1であるため、iptables-restoreはカスタムテーブルをフラッシュします。