У меня есть веб-хостинг, который не позволяет редактировать iptables. Время от времени у меня бывают легкие (около 300 запросов / сек) DoS-атаки (обычно не распределенные). Я решил написать сценарий PHP, который блокирует эти IP-адреса. Сначала я попытался сохранить все запросы за последние 10 секунд в базе данных и найти адреса злоупотреблений для каждого запроса. Но я быстро понял, что таким образом я должен делать как минимум 1 запрос к базе данных для каждого запроса DoS, а это не хорошо. Затем я оптимизировал этот подход следующим образом:
Read 'deny.txt' with blocked ip's
If it contains request ip, then die()
--- at this point we have filtered out all known attacking ips ---
store requesting ip in database
clean all requests older than 10 secs
count requests from this ip, if it is greater than threshold, add it to 'deny.txt'
Таким образом, новый атакующий ip сделает только Threshold
запросы к базе данных, а затем блокируются.
Итак, вопрос в том, имеет ли этот подход оптимальную производительность? Есть ли лучший способ выполнить эту задачу?
Если запрос может каким-либо образом попасть на ваш сервер (даже если вы можете редактировать iptables), он все равно сокращает пропускную способность. Если ваш сервер может обрабатывать 300 запросов в секунду, не беспокойтесь об этом. Если вам не хватает пропускной способности, вам придется справиться с этим в восходящем направлении. Если вы не можете редактировать iptables на своем сервере, вероятно, у вас есть общий хостинг, поэтому есть вероятность, что ваш хост увидит атаку и, надеюсь, ограничит ее в восходящем направлении, прежде чем она выйдет из-под контроля.