web-dev-qa-db-ja.com

ʻiptables-restore`はカスタムチェーンを保持しません

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つのルールのみを残します。

1
nautical

同じバグに遭遇しました。 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はカスタムテーブルをフラッシュします。

1
Assaf Cwajghaft