Iată o explicație aproximativă a ceea ce poate merge prost.
Inainte de iptables reguli:
X (X=2 în exemplul de pornire al OP) adrese IP sursă cu 2^16 porturi sursă posibile și 1 adresă și port de destinație:
X * 2^16 posibile conexiuni.
După iptables reguli: X surse au fost strivite într-o singură sursă
1 * 2^16 conexiuni posibile.
X * 2^16 conexiuni nu pot fi făcute pentru a se potrivi doar în 2^16 conexiuni. Coliziunea portului sursă va începe să se întâmple din ce în ce mai des și va fi rezolvată prin schimbarea portului sursă, dar găsirea unui port sursă liberă care nu se confruntă cu un alt flux va deveni din ce în ce mai dificilă: degradarea performanței începe să crească, pachetele abandonate pot chiar să înceapă să aibă loc.
S-ar întâmpla asta altfel dacă iptables au fost înlocuite cu nftables? Nu. În ambele cazuri, ele nu sunt părțile care rezolvă coliziunea. Această rezoluție se face în același backend Netfilter comun: cel nf_nat
modulul kernelului, eventual repetând de mai multe ori dacă este necesar și chiar renunțând (adică: renunțarea la noul contratrack intrare și pachetul care a declanșat crearea sa provizorie).
Cauza este NAT-ul sursă făcut atunci când există o singură destinație posibilă (serverul): ar trebui evitată.
Soluții posibile:
nu utilizați sursa NAT. În schimb, ar trebui făcută o rutare adecvată (chiar dacă aceasta necesită multi-homing sau un tunel), astfel încât 10.10.10.10 să nu fie nevoit să vadă o singură sursă 50.50.50.50. Întrebarea nu explică de ce este necesar acest SNAT, așa că nu este posibil să detaliezi mai mult.
au mai multe adrese de sursă pentru a echilibra încărcarea și pentru a distribui presiunea portului sursă. Acest lucru se poate realiza cu iptables folosind statistic
modul pentru a echilibra încărcarea la mai multe SNAT
tinte.
Trecând la nftables este de obicei o îmbunătățire, dar pentru acest caz, aceasta nu pare a fi soluția.