/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
の問題のみです。この問題を修正するにはどうすればよいですか?
これは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
で対応できるか、ドキュメントにそれを許容できる追加の差異として反映させる必要があります。
ちなみに、逆の方法(-6
とiptables-nft-restore
)は見栄えがよくありません。無視される代わりに受け入れられ、IPv4プロトコルの-A INPUT -p ipv6-icmp -j ACCEPT
に加えて-A INPUT -p icmp -j ACCEPT
につながります。 (これはおそらくカスタムテスト以外では起こりません。IPスタックはとにかくそれを無視します)。
可能な回避策:
バグレポートを提出して、既存のルールとドキュメントを破るような退行を主張する。これは他の人にも役立ちます。
分割ルール
ファイルを2つのファイルに分割しますが、次のように、それぞれに異なるフィルターを適用します。
grep -v -- '^ *-4 ' < before > after.v6
grep -v -- '^ *-6 ' < before > after.v4
ip6tables-restore
の/usr/local/sbin/ip6tables-restore
のラッパーを作成して、ほぼ同じように(そしてiptables-restore
についても同じように)、単一のルールを維持できるようにします。
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モジュールを削除する方法を理解してください。
新機能を採用し、直接使用 nft
。
ここで役立つコマンドがあります(ただし、上記と同じ問題があります): iptables-translate
/ip6tables-translate
およびiptables-restore-translate
/ip6tables-restore-translate
、とにかく結果は通常、とにかくやり直す必要があります(特に u32
のような派手な一致の場合)。 Nftablesにはファミリータイプ inet
があり、実際にはIPv4ルールとIPv6ルールを混在させることができるため(natでこれを行うには、新しいカーネルが必要になる場合があります)、物事を簡素化します。