У меня есть приложение Flask, которое я разрабатываю и которое в значительной степени зависит от взаимодействия с внешним веб-сайтом и инициируется конечным пользователем. Если я оставлю приложение без какого-либо контроля пропускной способности / ограничения скорости, то это приложение может быть использовано со стороны актеров с гнусными намерениями.
Моя цель - довольно простой двухэтапный подход:
Ограничьте скорость отдельных IP-источников от выполнения более чем
x
числа соединений в минуту. Это может быть легко достигнуто сiptables
. Вот пример, аналогичный моей цели:iptables -A INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 15 \ --connlimit-mask 32 -j REJECT --reject-with tcp-reset
Оценить ограничение возможности приложений выполнять больше, чем
x
количество просмотров на URL . Пример:APP ---- 10 pps ---> stackexchange.com PERMIT APP ---- 25 pps ---> google.com DENY / 15 SECOND BACKOFF
Насколько я могу судить, iptables
нет возможности отслеживать отдельные URL-адреса. Это только в состоянии оценить ограничение этих соединений в целом. Это также не кажется единственным ограничением того, чего я пытаюсь достичь. Если бы был способ настроить iptables
таким образом, это могло бы вызвать некоторые проблемы с моим веб-приложением, так как эти запросы инициированы пользователем.
Я использую Flask, жизнеспособным вариантом может быть использование before_request
ловушки и ручное отслеживание этих мест назначения с помощью хранилища данных, такого как Redis. Тем не менее, это довольно высоко в стеке, чтобы иметь дело с соединениями таким образом. Что мне действительно нужно (или я думаю, что я делаю), это интеллектуальное приложение брандмауэра, которое может анализировать запросы нестандартным способом и закрывать соединения, когда достигнуты определенные точки останова.
Есть ли способ добиться того, что я пытаюсь сделать?
Если да, то как?