web-dev-qa-db-ja.com

ip6table-restoreがDebian buster / sidで失敗しました

/etc/iptables/rule.V6および/etc/iptables/rule.V4に以下のiptableルールがあります

-4 -A INPUT -p icmp -j ACCEPT
-6 -A INPUT -p ipv6-icmp -j ACCEPT

netfilter-persistentを再起動しようとすると、内部でiptables-restoreおよびip6tables-restoreが呼び出されます。

ip6tables-restoreは、以下のルールを理解できなかったため失敗しました

-4 -A INPUT -p icmp -j ACCEPT

以下はエラーです

root@rs-dal:/etc/iptables# ip6tables-restore rules.q
Error occurred at line: 15
Try `ip6tables-restore -h' or 'ip6tables-restore --help' for more information.

-4で始まるルールはip6tables-restoreによって無視されるのが理想的ですが、Debianバスターでは機能していないようです。

ただし、iptables-restoreは正常に機能しました。これはip6tables-restoreの問題のみです。この問題を修正するにはどうすればよいですか?

3
Karthik

これはDebianバスターのデフォルトであるため、ntableを介してiptablesを実行していることは間違いありません。これが事実であることを確認するには、(nf_tables)を確認します。

# ip6tables-restore --version
ip6tables-restore v1.8.2 (nf_tables)

ip6tablesマニュアル に、常にあります:

-4、-ipv4
このオプションは、iptablesとiptables-restoreには影響しません。 -4オプションを使用するルールがip6tables-restoreを使用して(そしてそれのみを使用して)挿入された場合、暗黙的に無視されます。その他の使用はエラーをスローします。このオプションにより、iptables-restoreとip6tables-restoreの両方で使用する単一のルールファイル内のIPv4およびIPv6ルールが許可されます。

問題は ip6tables-nft-restore ではなく ip6tables-legacy-restore を実行していることです。

レガシーiptablesとの違い-4の記述はありません。つまり、違いはないはずですが、ここにあります。これは本当にバグのように見えます。新しいバージョンip6tables-nft-restoreで対応できるか、ドキュメントにそれを許容できる追加の差異として反映させる必要があります。

ちなみに、逆の方法(-6iptables-nft-restore)は見栄えがよくありません。無視される代わりに受け入れられ、IPv4プロトコルの-A INPUT -p ipv6-icmp -j ACCEPTに加えて-A INPUT -p icmp -j ACCEPTにつながります。 (これはおそらくカスタムテスト以外では起こりません。IPスタックはとにかくそれを無視します)。

可能な回避策:

  1. バグレポートを提出して、既存のルールとドキュメントを破るような退行を主張する。これは他の人にも役立ちます。

  2. 分割ルール

    ファイルを2つのファイルに分割しますが、次のように、それぞれに異なるフィルターを適用します。

    grep -v -- '^ *-4 ' < before > after.v6
    grep -v -- '^ *-6 ' < before > after.v4
    
  3. ip6tables-restore/usr/local/sbin/ip6tables-restoreのラッパーを作成して、ほぼ同じように(そしてiptables-restoreについても同じように)、単一のルールを維持できるようにします。

  4. Nftablesよりも(今のところ)iptablesをあきらめて、レガシーiptablesに戻します。

    # readlink -f $(which ip6tables-restore)
    /usr/sbin/xtables-nft-multi
    # update-alternatives --config ip6tables        
    There are 2 choices for the alternative ip6tables (providing /usr/sbin/ip6tables).
    
      Selection    Path                        Priority   Status
    ------------------------------------------------------------
    * 0            /usr/sbin/ip6tables-nft      20        auto mode
      1            /usr/sbin/ip6tables-legacy   10        manual mode
      2            /usr/sbin/ip6tables-nft      20        manual mode
    
    Press <enter> to keep the current choice[*], or type selection number: 1
    update-alternatives: using /usr/sbin/ip6tables-legacy to provide /usr/sbin/ip6tables (ip6tables) in manual mode
    # readlink -f $(which ip6tables-restore)
    /usr/sbin/xtables-legacy-multi
    

    関連コマンドのリンクも変更されました。

    iptablesでも同じことを行います。

    現在のルールはまだnftablesで実行されています。 iptables-nft-save + ip6tables-nft-saveでそれらをダンプし、iptables-save + ip6tables-saveで復元できます。これにより、ルールが2回実行されます。1回目はカーネルのiptablesバックエンドで、1回目はカーネルのnftablesバックエンドで、NATはカーネル4.19でこれを使用すると常に正しく機能しない場合があります(通常、最初にロードされたモジュールが勝つ:ここにnft_nat)。再起動を改善するか、ルールをフラッシュして関連する(nat)nftablesモジュールを削除する方法を理解してください。

  5. 新機能を採用し、直接使用 nft

    ここで役立つコマンドがあります(ただし、上記と同じ問題があります): iptables-translate /ip6tables-translateおよびiptables-restore-translate/ip6tables-restore-translate、とにかく結果は通常、とにかくやり直す必要があります(特に u32 のような派手な一致の場合)。 Nftablesにはファミリータイプ inet があり、実際にはIPv4ルールとIPv6ルールを混在させることができるため(natでこれを行うには、新しいカーネルが必要になる場合があります)、物事を簡素化します。

4
A.B