我的项目有一个使用socket.io在Node.js中构建的WebSocket服务器。
回顾最近中断的原因,我发现前端应用程序进入了一种状态,即服务器拒绝进行错误的连接尝试。它是在没有后退的循环中完成的。
此服务器上最终发生的事情是单个Node.js CPU线程最终被积压阻塞,并产生级联效果 - 无法发出新请求,不会发生其他处理,等等上。
解决这个问题的简单方法是在客户端上 - 弄清楚为什么它会进入快速循环并添加一些指数后退。
然而,这并未解决将来发生类似问题的问题。所以,我需要找到一种方法让我的服务器更具弹性。
一种方法是在调用backlog
时使用server.listen
参数。但是,这可能会阻止合法的客户请求通过。
我希望能够以某种方式以某种方式识别失控客户端。由于NAT,代理和防火墙,IP地址可能无法正常工作。
那么,保护我的服务器免受此类DoS攻击的好方法是什么?
答案 0 :(得分:1)
拦截DoS攻击的理想位置是在连接到达您的应用程序服务器之前。这通常是在路由器,防火墙或负载均衡器中,并且您依赖于它具有来自特定源的速率限制的手段。如果您要为托管服务付费,这应该是托管服务必须提供的功能之一,因为许多较大或更明显的租户将需要这种类型的服务。
从意外行为不当的浏览器(就像您在问题中描述的那样),您可以对已拒绝的请求进行Cookie,然后对提供该Cookie的任何客户端进行速率限制(将其限制为不超过N个连接请求/分钟)。
你不能依赖cookie来进行真正有目的的DoS攻击,因为如果攻击者干扰了攻击,攻击者可能会保留cookie。为此,所有任何基础设施都可以在源中查找标识信息(通常是IP地址)。如果你不小心清理了几个碰巧共享同一个NAT或代理的合法客户端(从而被识别为与DoS攻击来自的地址相同的IP地址),那么这就是问题。你无能为力。您必须不惜一切代价保护服务的完整性,如果真正的攻击者没有保留cookie,您就无法做其他事情。
如果您选择尝试自己实施此类保护,那么您可以尝试在应用程序服务器中实现它(并接受一些性能损失)或者您可以在同一主机上部署中介,例如NGINX作为DoS攻击的缓解措施。这是一篇关于使用NGINX的文章:Mitigating DDoS Attacks with NGINX and NGINX Plus。