iptables запрос на ограничение скорости соединения

Чтобы установить контекст, у нас есть устаревший сервер, который обслуживает соединения, поступающие от большого количества клиентов. Соединения 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-флуд, но в конечном итоге замедлить и позволить всем клиентам установить соединение.


person lazzycoderr    schedule 12.12.2017    source источник


Ответы (1)


Только что понял это после долгих проб и ошибок. Решение состоит в том, чтобы использовать модуль ограничения iptables для ограничения скорости соединения для любых новых входящих соединений.

Закончилось добавлением следующей цепочки в /etc/ufw/before.rules

-A ufw-before-input -p tcp --dport 9000 -m state --state RELATED, ESTABLISHED -j ACCEPT -A ufw-before-input -p tcp --dport 9000 -m state --state NEW -m limit --limit 4/min --limit-burst 4 -j ACCEPT -A ufw-before-input -p tcp --dport 9000 -j DROP

использованная литература

person lazzycoderr    schedule 10.01.2018