iptables から nftables に移行する必要がありますか?

iptables から nftables に移行する必要がありますか?

次のような iptables ルールがあります。

1.2.3.4 および 5.6.7.8 (ソース) からのポート 10000 に来るパケットを 10.10.10.10:1080 の外部 socks5 サーバーに転送します。サーバー IP は 50.50.50.50 です。

このスキーマは、ソースの量が多くなく、同時に外部 socks5 の量も多くない場合にうまく機能します。ソースが 50 個、外部 socks が 30k 個になると、iptables が停止し、パケットが転送されなくなるため、iptables のパフォーマンスに制限があると思われます。nftables の方が強力かどうか、また、そうであれば、ルールを nftables に変換する方法を教えてください。

*nat
:PREROUTING ACCEPT [1:40]
:INPUT ACCEPT [1:40]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]

-A PREROUTING -s 1.2.3.4,5.6.7.8 -p tcp -m tcp --dport 10000 -j DNAT --to-destination 10.10.10.10:1080
-A POSTROUTING -d 10.10.10.10/32 -p tcp -m tcp --dport 1080 -j SNAT --to-source 50.50.50.50

COMMIT

*filter
:INPUT ACCEPT [15:1012]
:FORWARD ACCEPT [26:1348]
:OUTPUT ACCEPT [9:932]
COMMIT

答え1

何が問題になる可能性があるのか​​、大まかに説明します。

  • の前にiptablesルール:

    X (OP の最初の例では X=2) 個の送信元 IP アドレスと 2^16 個の送信元ポート、および 1 つの宛先アドレスとポート:

    X * 2^16 個の接続が可能です。

  • 後にiptablesルール: Xソースが1つのソースに圧縮されました

    1 * 2^16 個の接続が可能です。

X * 2^16 個の接続を 2^16 個の接続に収めることはできません。送信元ポートの衝突はますます頻繁に発生し始め、送信元ポートを変更することで解決されますが、他のフローと衝突しない空き送信元ポートを見つけることはますます困難になります。パフォーマンスの低下が増加し始め、パケットのドロップも発生し始める可能性があります。

もしこれが違った結果だったらiptablesに置き換えられたnftables? いいえ。どちらの場合も、衝突を解決する部分ではありません。この解決は同じ共通の Netfilter バックエンドで行われます。カーネルnf_natモジュール必要に応じて複数回繰り返し、場合によっては諦める(つまり、新しい接続トラックエントリとパケットがその暫定的な作成をトリガーしたことを示します。

原因は、送信先が 1 つ (サーバー) しかない場合にソース NAT が実行されることであり、これは回避する必要があります。

考えられる回避策:

  • ソース NAT を使用しないでください。代わりに、10.10.10.10 が単一の 50.50.50.50 ソースを参照する必要がないように、適切なルーティング (マルチホーミングまたはトンネルが必要な場合でも) を実施する必要があります。質問では、この SNAT が必要な理由が説明されていないため、これ以上詳しく説明することはできません。

  • 複数の送信元アドレスを用意して負荷分散し、送信元ポートの負荷を分散します。これは次のように実現できます。iptables使用してstatisticSNAT複数のターゲットに負荷を分散するモジュール。

切り替えるnftables通常は改善されますが、この場合は解決策にはならないようです。

関連情報