Ядро Linux 4.9.17-8.31
Я открываю множество внешних портов, которые отображаются на один внутренний порт. Причина в том, что каждая группа клиентов получает собственный порт, что позволяет вести учет с использованием tc.
Правила выглядят примерно так:
iptables -t nat -A PREROUTING -i eth0 -p tcp --match multiport --dports 3000,3032,3064,3096,3128,3160,3192,3224,3256,3288 -j REDIRECT --to-port 54321
iptables -t nat -A PREROUTING -i eth0 -p tcp --match multiport --dports 3330,3352,3384,3416,3448,3480,3512,3544,3576,3608 -j REDIRECT --to-port 54321
iptables -t nat -A PREROUTING -i eth0 -p tcp --match multiport --dports 3640,3672,3704,3736,3768,3800,3832,3864,3896,3928 -j REDIRECT --to-port 54321
iptables -t nat -A PREROUTING -i eth0 -p tcp --match multiport --dports 3960,3992,3024,3056,3088,3113,3152,3184,3216,3248 -j REDIRECT --to-port 54321
Если я тестирую 400 соединений, выполняя одно из этих правил, все соединения происходят чисто.
Если я тестирую 100 соединений, попадающих в каждую из 4 строк правил, я вижу таймауты и повторные передачи пакетов TCP SYN, я могу tcpdump захватить TCP SYN, который приходит, но не отвечает, нет ответа TCP SYN ACK.
Я не могу найти точку падения или ошибки, и все соединения, попадающие в одно правило, очень надежны. В моих тестовых сценариях все 400 подключений поступают с одного хоста, я не уверен, существует ли проблема в более реальном сценарии, когда подключения будут поступать с нескольких хостов.
В целях тестирования я отключил tc и могу воспроизводить ошибки только с помощью iptables.
Интересно узнать, наблюдалось ли подобное поведение в прошлом.