Muss ich von iptables zu nftables migrieren?

Muss ich von iptables zu nftables migrieren?

Ich habe die folgenden iptables-Regeln.

Weiterleitung von Paketen von 1.2.3.4 und 5.6.7.8 (Quellen), die über Port 10000 eingehen, an einen externen Socks5-Server am 10.10.10.10:1080. Die Server-IP lautet 50.50.50.50

Dieses Schema funktioniert gut, wenn die Quellmenge nicht hoch ist und gleichzeitig auch die externe Socks5-Menge nicht hoch ist. Sobald ich 50 Quellen und 30.000 externe Socks habe, hängt iptables fest und es werden keine Pakete weitergeleitet, daher vermute ich, dass die Leistung von iptables begrenzt ist. Kann mir jemand sagen, ob nftables leistungsfähiger ist und wenn ja, wie ich meine Regeln in nftables übersetze?

*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

Antwort1

Hier ist eine grobe Erklärung, was schief gehen kann.

  • Vor demiptablesRegeln:

    X (X=2 im Ausgangsbeispiel des OP) Quell-IP-Adressen mit 2^16 möglichen Quellports und 1 Zieladresse und -port:

    X * 2^16 mögliche Verbindungen.

  • Nach demiptablesRegeln: X Quellen wurden zu einer Quelle zusammengefasst

    1 * 2^16 mögliche Verbindungen.

X * 2^16 Verbindungen können nicht in nur 2^16 Verbindungen integriert werden. Quellportkollisionen werden immer häufiger auftreten und durch Ändern des Quellports gelöst werden können. Es wird jedoch immer schwieriger, einen freien Quellport zu finden, der nicht mit einem anderen Datenfluss kollidiert: Die Leistungseinbußen nehmen zu, es können sogar Pakete verloren gehen.

Wäre dies anders, wenniptableswurden ersetzt durchNftables? Nein. In beiden Fällen sind sie nicht die Teile, die die Kollision auflösen. Diese Auflösung erfolgt im selben gemeinsamen Netfilter-Backend:das nf_natKernelmodul, möglicherweise mehrere Iterationen, falls erforderlich, und sogar Aufgeben (d. h.: Löschen des neuenKontaktEintrag und das Paket, das seine vorläufige Erstellung ausgelöst hat).

Die Ursache ist, dass das Quell-NAT durchgeführt wird, wenn es nur ein einziges mögliches Ziel (den Server) gibt: Es sollte vermieden werden.

Mögliche Problemumgehungen:

  • Verwenden Sie kein Quell-NAT. Stattdessen sollte ein geeignetes Routing eingerichtet werden (selbst wenn dies Multihoming oder einen Tunnel erfordert), sodass 10.10.10.10 nicht eine einzelne 50.50.50.50-Quelle sehen muss. Die Frage erklärt nicht, warum dieses SNAT erforderlich ist, daher ist es nicht möglich, näher darauf einzugehen.

  • mehrere Quelladressen für den Lastausgleich und die Verteilung des Quellportdrucks haben. Dies kann erreicht werden mitiptablesVerwendung derstatisticModul zum Lastenausgleich auf mehrere SNATZiele.

Wechseln zuNftablesist normalerweise eine Verbesserung, aber in diesem Fall scheint es nicht die Lösung zu sein.

verwandte Informationen