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