Как защитить сервер от простой 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.

Другие вопросы по тегам