Назад | Перейти на главную страницу

Ограничение входящих соединений с помощью iptables

У меня при некоторых обстоятельствах происходит DoS, вызванный самим собой, и я пытаюсь понять, могу ли я использовать iptables для смягчения его последствий. Краткая версия: «Как я могу ограничить скорость входящих подключений к серверу, скажем, не более чем 2 каждые 5 секунд, используя правила iptables?». Я читал такие вопросы, как этот и хотя он подключен, ответ там (который я пробовал - см. ниже) не дает того, что мне нужно.

Длинная версия заключается в том, что наше клиент-серверное приложение поддерживает активные соединения, а одна из сетей наших клиентов продолжает отключаться, что означает одновременное отключение большого числа (15+) клиентов. Когда их сетевое соединение восстанавливается, все они пытаются повторно подключиться одновременно, вызывая своего рода DoS. Долгосрочным решением для нас является реализация случайного отката в коде повторного подключения клиента, над которым мы работаем. А пока то, что я пробовал до сих пор, основано на таких ресурсах, как ответ SF выше. Оттуда я создал эти 2 правила:

-A INPUT -p tcp -s 54.208.46.226 --match state --state NEW --match recent --set
-A INPUT -p tcp -s 54.208.46.226 --match state --state NEW --match recent --update --seconds 5 --hitcount 3 -j DROP

Примечание. Я указал один из наших собственных IP-адресов для тестирования, поэтому я могу попытаться подключиться с этого IP-адреса и посмотреть, заблокированы ли подключения или разрешены. Это вроде работает в том смысле, что первая попытка подключения принимается, как и вторая. Но когда в течение 5 секунд делается 3-я попытка, она блокируется - пока все хорошо.

Проблема в том, что если клиент продолжает попытки подключиться (как в настоящее время делает наш клиентский код), он продолжает блокироваться - я думаю, потому что второе правило --update обновляет временную метку, и это действующее правило говорит, что должна быть 5 секунд разрыв между попытками подключения. Но то, что мне нужно, - это возможность успешного выполнения до 2 подключений каждые 5 секунд, независимо от того, как часто они пытаться для подключения. Я предположил, что это может быть --update флаг, который хранил временную метку самой последней попытки (а не самой последней успешной попытки, которую я действительно хочу проверить). Я переключился на --rcheck, но похоже, что он ведет себя так же, а это значит, что я не понимаю этого уровня iptable-fu.

Итак, чтобы резюмировать вопрос, если предпринимаются повторные попытки подключения (несколько в секунду), существует ли набор правил iptable, который позволит им подключаться с более низкой скоростью (например, с разделением в среднем 2,5 секунды), а не блокировать их полностью после первых 2?

Посмотрите на ограничение скорости. Он может дросселировать соединения до указанной скорости. Скорее всего, вам потребуется поминутное ограничение, поскольку я считаю, что ставки являются целыми числами. Скорость 24 / мин должна работать.

Вам нужно будет проверить, насколько частыми будут соединения.