Чтобы установить контекст, у нас есть устаревший сервер, который обслуживает соединения, поступающие от большого количества клиентов. Соединения TCP и использует двоичный протокол. В последнее время, когда количество клиентов увеличилось, кажется, что сервер не может обрабатывать все входящие подключения, особенно если сервер когда-либо перезагружается. В таком случае сервер переходит в какое-то несогласованное состояние с потерей соединений в CLOSE_WAIT.
Если запросы на подключение клиентов распределяются в шахматном порядке, сервер в конечном итоге берет на себя нагрузку. Мы проверили это, смоделировав клиентов в докере.
Поскольку в сервер не встроено ограничение скорости, я решил попробовать iptables, чтобы посмотреть, смогу ли я использовать функцию ограничения скорости в iptables для распределения входящих запросов на подключение. Соединения могут исходить с одного и того же IP-адреса или с разных IP-адресов.
Ограничение скорости не должно влиять ни на какие установленные соединения, а только на новые (3-стороннее рукопожатие). Поскольку у клиентов есть логика повторных попыток, они в конечном итоге придут и снова подключатся. Поэтому не нужно ограничивать скорость по IP-адресу, потому что все соединения, даже если с одного и того же исходного IP-адреса, в конечном итоге должны подключаться, не нарушая установленных соединений.
Это правила iptables, которые я использую. Это правильный путь?
iptables -A INPUT -i eth0 -p tcp --dport 9000 -m state --state NEW,ESTABLISHED -m recent --set -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --dport 9000 -m state --state NEW -m recent --update --seconds 600 --hitcount 11 -j REJECT --reject-with tcp-reset
Я не знаком с iptables и в настоящее время использую оболочку ufw в Ubuntu 14.04. Приведенная выше идея была взята из этой ссылки https://www.cyberciti.biz/tips/howto-limit-linux-syn-attacks.html.
Намерение состоит в том, чтобы предотвратить SYN-флуд, но в конечном итоге замедлить и позволить всем клиентам установить соединение.