LINUX.ORG.RU
ФорумAdmin

Ограничение количества входящих пакетов за промежуток времени


0

1

Здравствуйте. Никак не могу разобраться. Столько всего читал в интернете - ничего нужного не нашел, что сильно меня удивляет.

В чем моя проблема? Есть приложение. Бот к нему устанавливает соединение и по established шлет тучу пакетов. Как их правильно ограничить, без ущерба обычным пользователям?

Пробовал tcpdump+log+iptables+ipset, но «бурст» всё равно убивает. Сервер успевает принимать тычячи пакетов от бота, пока обрабатывается лог tcpdump.

В iptables, hashlimit + limit-burst - работает очень странно. Банит случайных пользователей, когда достигается предел бурста. Мне так и не удалось в нем разобраться.

Использовать tc боюсь. Да и вообще я не уверен, что шейпинг и ограничение количества пакетов одно и то же.

Как же мне защититься от ботов? Я думаю, что единственный способ - это найти способ ограничения количества входящих пакетов за промежуток времени. Именно пакетов. Дело в том, что вес пользовательских пакетов может быть очень большими, а бот посылает всегда маленькие пакеты, но много.

Очень нужна ваша помощь. Читать тонны документаций времени нет. Жена орет сводить ребенка в зоопарк, а мне приходится сидеть целый день дома и руками банить ботов :(

Своди ребенкав зоопарк, на ботов посмотришь

dvrts ★★★
()

Входящие пакеты невозможно ограничить, если запросы посылает не само приложение. Вы можете их только «дропать».

kostik87 ★★★★★
()
Ответ на: комментарий от zolden

http://en.wikipedia.org/wiki/Fail2ban

Fail2ban operates by monitoring log files (e.g. /var/log/pwdfail, /var/log/auth.log, etc.) for selected entries and running scripts based on them.

Наверняка этот скрипт не обрабатывает данные в режиме реального времени, и поэтому он мне не подходит. Как я уже писал, бот может послать 1000 пакетов за секунду и вырубить приложение на несколько минут.

Xenonaut
() автор топика
Ответ на: комментарий от kostik87

Мне как раз и нужно дропать все пакеты, которые превышают обозначенный лимит.

То есть, бот посылает 1000 пакетов/сек. Лимит 50 пакетов/сек в одного IP. Каждую секунду 50 пакетов от бота доходят, остальные 950 дропаются.

Xenonaut
() автор топика
Ответ на: комментарий от Xenonaut

Это не ограничение трафика, по сути ваш сервер всё равно обрабатывает 1000 пакетов в секунду с одного IP, просто 950 вы будете дропать, а 50 пропускать, загрузка канала как была 1000 пакетов/сек. с одного IP так и осталась.

kostik87 ★★★★★
()
Ответ на: комментарий от kostik87

Ясно, спасибо. Сейчас эти 1000 пакетов обрабатываются приложением, из-за чего получается очень большая нагрузка. Как сделать так, чтобы пакеты до приложения не доходили? Посоветуете что-нибудь?

Xenonaut
() автор топика
Ответ на: комментарий от zolden

Какая разница? Я объяснил суть проблемы - что именно у меня на сервере происходит.

Ладно, раз не поняли - объясняю. Скрипт, который вы посоветовали, не умеет работать в режиме реального времени, как, например, iptables. Его можно запускать максимум раз в секунду. Меня это не спасет, так как за эту секунду бот может отправить 1000 пакетов и сервер ляжет на пару минут.

Xenonaut
() автор топика
Ответ на: комментарий от sdio

iptables -A INPUT -p tcp --dport 555 -m conntrack --ctstate RELATED,ESTABLISHED -m hashlimit --hashlimit-above 50/sec --hashlimit-burst 50 --hashlimit-mode srcip --hashlimit-name aadd -j LOG --log-prefix='TESTTEST '

При активности ботов, начинает логировать обычных пользователей, и даже меня.

Xenonaut
() автор топика
Ответ на: комментарий от Xenonaut

И это правильно, следующие правило iptables -A INPUT -p tcp --dport 555 -j DROP , profit. А зачем вы логгируете, то что пропускаете?

hizel ★★★★★
()
Ответ на: комментарий от Xenonaut

При активности ботов

Вы можете внятно объяснить отличие бота от нормального пользователя?
PPS это слишком эфемерный критерий

zolden ★★★★★
()
Ответ на: комментарий от hizel

Разве? --hashlimit-above: если пакеты поступают с большей скоростью, они считаются подпадающими под критерий. (http://ru.wikibooks.org/wiki/Iptables)

Готовое правило для сервера я бы использовал такое:

iptables -A INPUT -p tcp --dport 555 -m conntrack --ctstate RELATED,ESTABLISHED -m hashlimit --hashlimit-upto 50/sec --hashlimit-burst 50 --hashlimit-mode srcip --hashlimit-name aadd -j ACCEPT
iptables -A INPUT -p tcp --dport 555 -j DROP

Где --hashlimit-upto было бы правильным, а не above.

Моё правило для логирования и эти ничем не отличаются, вроде бы.

Xenonaut
() автор топика
Ответ на: комментарий от zolden

По замерам tcpdump, обычный пользователь не превышает 30 pps, когда бот бурстит по 1000 pps. И всё это с одного открытого соединения.

Xenonaut
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.