如何保护服务器免受简单的 DoS 攻击

如何保护服务器免受简单的 DoS 攻击

请注意我不是询问如何保护服务器免受分布式拒绝服务。我的意思是,如果有人siege -c 1000 www.example.com在他的 VPS 上运行。这将导致我的服务器处理数千个请求并变慢。如果我针对共享主机运行 siege,我不会看到我的机器上的响应速度急剧下降(从 60ms 到 2000ms/请求)。我不指望能够缓解大型 DDoS,但我希望能够避免第一个发现 siege 的脚本小子 :) 另一方面,我可以接受这样一个事实,即当大量流量来自合法来源时,响应可能会变慢。

答案1

您可以使用防火墙来限制并发连接数和来自网络的新连接速率(例如 IPv4 为 /32,IPv6 为 /64)。使用示例如下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-srcmask64

您还可以限制 HTTP 请求的速率,例如使用nginx 的 limit_req 模块

答案2

除了一些基本的防火墙之外,我们还依靠 haproxy 来完成繁重的 TCP 任务。我们发现,就任何类型的 slowdos 攻击而言,它都比现成的 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

但基本上,您要么需要阻止攻击,要么修复漏洞,要么两者兼而有之。

答案3

失败2ban是众多用于处理此类情况的工具之一。fail2ban 帮助我阻止了几次对 ssh 的暴力攻击。我假设您的服务器是 Linux。

相关内容