
У меня есть следующие правила iptables.
Пересылка пакетов с 1.2.3.4 и 5.6.7.8 (источники), поступающих на порт 10000, на внешний сервер socks5 10.10.10.10:1080. IP сервера 50.50.50.50
Эта схема работает хорошо, если количество источников невелико и в то же время количество внешних socks5 тоже невелико. Как только у меня 50 источников и 30 тыс. внешних socks - 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 (X=2 в начальном примере OP) исходных IP-адресов с 2^16 возможными исходными портами и 1 адресом назначения и портом:
X * 2^16 возможных соединений.
Послеiptablesправила: X источников были объединены в один источник
1 * 2^16 возможных соединений.
X * 2^16 соединений не могут быть сделаны так, чтобы соответствовать только 2^16 соединениям. Конфликт исходного порта будет происходить все чаще и будет разрешаться путем изменения исходного порта, но найти свободный исходный порт, не конфликтующий с другим потоком, будет становиться все сложнее: начнет расти снижение производительности, могут даже начаться потери пакетов.
Произошло бы это иначе, если быiptablesбыли заменены наnftables? Нет. В обоих случаях они не являются частями, разрешающими столкновение. Это разрешение выполняется в том же общем бэкэнде Netfilter:nf_nat
модуль ядра, возможно, повторив это несколько раз, если это необходимо, и даже отказавшись от этого (т.е. отказавшись от новогоconntrackзапись и пакет, инициировавший ее предварительное создание).
Причиной является исходный NAT, выполняемый при наличии единственного возможного пункта назначения (сервера): этого следует избегать.
Возможные обходные пути:
не используйте исходный NAT. Вместо этого следует установить адекватную маршрутизацию (даже если для этого требуется multi-homing или туннель), чтобы 10.10.10.10 не приходилось видеть единственный источник 50.50.50.50. Вопрос не объясняет, почему требуется этот SNAT, поэтому невозможно детализировать его более подробно.
иметь несколько адресов источников для балансировки нагрузки и распределения давления порта источника. Это может быть достигнуто с помощьюiptablesиспользуя
statistic
модуль для балансировки нагрузки на несколькоSNAT
целей.
Переключение наnftablesобычно является улучшением, но в данном случае это, по-видимому, не решение.