Содержание
Мой блог живёт на маленьком одноплатном компьютере Raspberry Pi 3 Model B+, и при обычной нагрузке HTTP сервер Apache2, который его обслуживает, легко справляется со своим делом. Но однажды, играясь с Andrax на смартфоне я обнаружил, что легко могу его «положить», закидав мусорными запросами с помощью приложения для осуществления DoS атак из данного дистрибутива. И хоть у меня не супер мощный топовый сервер, а всего лишь одноплатный компьютер за пару сотен десятков баксов — всё равно так дело не пойдёт и нужно с этим бороться. Хотя бы от одного пользователя мы должны отмахаться 😁
Как я положил HTTP сервер?
В состав дистрибутива Andrax входит одна небольшая утилита на Python под названием GoldenEye (страница на Github).
С настройками по умолчанию за несколько секунд GoldenEye закидал мой HTTP сервер GET запросами типа https://imatvey.xyz/?w4tgwaui44hmgiklasff34wf до состояния, при котором Apache перестал отдавать страницы блога легитимным пользователям, а память и процессор Raspberry Pi были загружены на 100% процессами apache и php-fpm. Это и есть классическая успешная DoS атака.
Как этому противостоять?
HTTP сервер Apache за свою долгую историю обзавёлся множеством дополнительных модулей, расширяющих его фунекциональность в ту или иную сторону. И среди них есть как раз тот, который мне нужен: mod_qos.
Установка mod_qos
Устанавливать и настраивать будем на примере операционной системы Debian GNU/Linux. Ставим пакет libapache2-mod-qos.
sudo apt install libapache2-mod-qos
Настройка
Настройки модуля хранятся в файле /etc/apache2/mods-available/qos.conf. Открываем для редактирования любым текстовым редактором, мне например nano нравится.
sudo nano /etc/apache2/mods-available/qos.conf
Конфигурационный файл по умолчанию имеет следующий вид:
<IfModule qos_module>
# minimum request rate (bytes/sec at request reading):
#QS_SrvRequestRate 120
# limits the connections for this virtual host:
#QS_SrvMaxConn 100
# allows keep-alive support till the server reaches 600 connections:
#QS_SrvMaxConnClose 600
# allows max 50 connections from a single ip address:
#QS_SrvMaxConnPerIP 50
</IfModule>
Далее настраиваем по вкусу. Довольно подробное руководство по настройке есть на Opennet. Мне же хватило наскомментировать строку QS_SrvMaxConnPerIP и понизить ее значение с 50 до 5. Этот параметр ограничивает максимальное количество одновеменных соединений с одного IP адреса. Сохраняем конфиг и включаем модуль командой
sudo a2enmod qos
Для применения изенений перезапускаем Apache.
sudo systemctl restart apache2.service
Готово. Теперь после запуска атаки GoldenEye блог открывается без проблем.