Varnish 和连接洪水 (DoS - DDoS)

Varnish 和连接洪水 (DoS - DDoS)

我一直在使用 Varnish 缓存服务器,我的网页加载速度非常快,在 Google 的 Pagespeed 上获得了 97 分,在 Pingdom 上获得了 100 分。我使用了 Varnish(代理到 nginx)、NGINX(仅在本地可用,代理 *.php 到 php-fpm(但我考虑迁移到 HipHop PHP 编译器))。

由于我的页面速度很快,而且只使用了约 500/1GB 的 RAM,所以我请一位朋友对这台机器的 HTTP 服务器进行了压力测试。我配置了以下反 DDoS 机制:

  • iptables 防火墙限制每秒连接数
  • 更多 iptables 检查(以 SYN、ICMP 等开头的会话)
  • Varnish 缓存
  • 重新编码小网页以存储一些可能经常在备用 php 缓存中获取的值(例如:当前播放的歌曲,ttl 为 120 应该没问题)

网页上除了当前播放的歌曲(由 APC 驱动)之外没有动态数据,并且绝对不需要会话。

现在说说我的问题,我的朋友从他被授权使用的某台机器发起了 DoS 攻击,我的服务器很快就瘫痪了。我无法登录 SSH,所以我使用串行控制台并检查了 varnishd 日志,其中显示:会话开始会话结束

这种情况一直在重复。我提前关闭了控制台访问权限并禁止了 IP,我的页面又回来了。

现在,由于不需要会话,我需要 VCL 语法来禁止除子目录 /user 中的脚本之外的所有会话。

答案1

据我所知,Varnish 使用线程来处理连接,并且配置了限制。因此,攻击者只需打开 200 个到缓存的连接即可阻止每个线程(另请参阅懒猴)。另一方面,nginx(它将愉快地作为缓存反向代理) 是一个基于事件的服务器;上下文切换是需求驱动的 - 它仅受可以打开的套接字数量的限制,因此对此类攻击的抵抗力更强。

(Varnish 在处理请求方面仍然比 pre-fork 甚至 worker apache 更好,而且每个请求占用的空间不大,因此你会看到很多人谈论使用它来减轻此类 DOS 攻击)。

你可以使用以下方法在网络层缓解 DOS 攻击基于 iptables 和/或 QOS 的路由,但我建议首先使用 nginx 作为代理。

答案2

您可以安装类似 fail2ban 或 OSSEC(我最喜欢的)的工具来自动阻止此类攻击。它无法保护您免受欺骗 IP 的攻击(防御这些攻击确实很困难),但这是一个开始。

相关内容