Нужно ли мне переходить с iptables на nftables?

Нужно ли мне переходить с iptables на nftables?

У меня есть следующие правила 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обычно является улучшением, но в данном случае это, по-видимому, не решение.

Связанный контент