Обратите внимание, я НЕ спрашивая, как защитить сервер от DDoS. Я имею в виду, что если кто-то сбегает siege -c 1000 www.example.com
на его VPS. Это приведет к тому, что мой сервер будет обслуживать тысячи запросов и замедлится. Если я запустил осаду с целью, скажем, виртуального хостинга, я не увижу резкого падения скорости отклика (с 60 мс до 2000 мс на запрос), которое я наблюдаю на своей машине. Я не ожидаю, что смогу смягчить большие DDoS-атаки, но я бы хотел быть в безопасности от первого сценария, обнаруживающего осаду :) С другой стороны, меня устраивает тот факт, что когда большой объем трафика исходит от законные источники, ответ может быть медленнее.
Вы можете использовать брандмауэр для ограничения количества одновременных подключений и скорости новых подключений, поступающих из сети (например, / 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.
fail2ban является одним из многих инструментов, предназначенных для решения таких ситуаций. fail2ban сработал для меня, остановив пару атак грубой силы на ssh. Я предполагаю, что ваш сервер - это Linux.
Помимо базового брандмауэра, мы полагаемся на 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
Но в основном вам нужно либо заблокировать атаку, либо исправить эксплойт, либо сделать то и другое.