Как защитить сервер от простой DoS-атаки

Как защитить сервер от простой DoS-атаки

Обратите внимание, что яНЕТспрашивают, как защитить сервер отDDoS. Я имею в виду, что если кто-то работает siege -c 1000 www.example.comна своем VPS. Это приведет к тому, что мой сервер будет обслуживать тысячи запросов и замедляться. Если я запущу целевую осаду, скажем, на общем хостинге, я не увижу такого резкого падения скорости отклика (с 60 мс до 2000 мс/запрос), как на моей машине. Я не ожидаю, что смогу смягчить большой DDoS, но я хотел бы быть в безопасности от первого обнаружения осады скрипт-кидди :) С другой стороны, меня устраивает тот факт, что когда большие объемы трафика поступают из легитимных источников, отклик может быть медленнее.

решение1

Вы можете использовать брандмауэр для ограничения количества одновременных подключений и скорости новых подключений из сети (например, /32 для IPv4 и /64 для IPv6). Пример того, как это может выглядеть с использованием iptables:

# Limit number of concurrent connections
-A INPUT -i eth0 -p tcp --syn -m connlimit --connlimit-above 50 -j DROP
# Limit rate of new connections
-A INPUT -i eth0 -p tcp --syn -m hashlimit --hashlimit-name tcp --hashlimit-mode srcip --hashlimit-above 3/sec --hashlimit-burst 7 --hashlimit-srcmask 32 -j DROP

(То же самое, за ip6tablesисключением добавления --connlimit-mask 64к первому и изменения --hashlimit-srcmaskна 64во втором.)

Вы также можете ограничить частоту HTTP-запросов, например, с помощьюмодуль limit_req nginx.

решение2

Помимо некоторых базовых брандмауэров, мы полагаемся на haproxy для выполнения тяжелой работы TCP. Мы обнаружили, что он ходит кругами вокруг готового экземпляра Apache HTTPd, насколько это касается атак типа slowdos.

-A INPUT -p tcp -m tcp -m state --state RELATED,ESTABLISHED -j ACCEPT

-A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -j SYNFLOOD

-A INPUT -p tcp -m tcp --dport 80 -m state --state NEW -j HTTPDGUARD
-A INPUT -p tcp -m tcp --dport 443 -m state --state NEW -j HTTPDGUARD

-A HTTPDGUARD -m connlimit --connlimit-above 25 --connlimit-mask 32 -j HTTPDENY
-A HTTPDENY -j LOG --log-prefix "HTTP Flood: "
-A HTTPDENY -p tcp -m tcp -j REJECT --reject-with tcp-reset

-A SYNFLOOD -m state --state NEW -m recent --set --name SYNRATE --rsource
-A SYNFLOOD ! -s 150.156.24.0/24 -m state --state NEW -m recent --update \
   --seconds 5 --hitcount 200 --name SYNRATE --rsource -j DROP

-A INPUT -p tcp -m tcp --dport 80 -m state --state NEW -j ACCEPT
-A INPUT -p tcp -m tcp --dport 443 -m state --state NEW -j ACCEPT

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

решение3

fail2banодин из многих инструментов, разработанных для решения таких ситуаций. fail2ban помог мне остановить несколько атак методом подбора на ssh. Я предполагаю, что ваш сервер — Linux.

Связанный контент