javascript - 如何使我的 Node.js websocket socket.io 服务器对 DoS 更具弹性?

标签 javascript node.js sockets socket.io

我的项目有一个使用 socket.io 在 Node.js 中构建的 WebSocket 服务器。

回顾最近一次中断的原因,我发现前端应用程序进入了一种状态,即它不断进行服务器拒绝的格式错误的连接尝试。它在没有后退的循环中这样做。

最终在此服务器上发生的是单个 Node.js CPU 线程最终被积压阻塞,并产生级联效应——无法发出新请求,无法进行其他处理,等等上。

解决这个问题的简单方法是在客户端上——弄清楚为什么它会进入快速循环并添加一些指数退避。

但是,这并不能解决将来发生类似问题的问题。因此,我需要找到一种方法让我的服务器更具弹性。

一种方法是在调用 server.listen 时使用 backlog 参数。然而,这可能会阻止合法的客户端请求通过。

我希望能够以某种方式识别失控的客户端。由于 NAT、代理和防火墙,IP 地址可能无法正常工作。

那么,保护我的服务器免受此类 DoS 攻击的好方法是什么?

最佳答案

拦截 DoS 攻击的理想位置是在连接到达您的应用程序服务器之前。这通常是在路由器、防火墙或负载平衡器中,您会依赖它对来自特定源的速率进行限制的方法。如果您为托管服务付费,这应该是托管服务必须提供的功能之一,因为许多更大或更显眼的租户会需要这种服务。

从一个意外行为不当的浏览器(就像你在问题中描述的那样),你可以 cookie 一个被拒绝的请求,然后限制任何呈现该 cookie 的客户端(限制它们不超过 N 个连接请求/分钟)。

您不能依赖 cookie 进行真正有目的的 DoS 攻击,因为如果 cookie 干扰了他们的攻击,攻击者可能不会保留 cookie。为此,任何基础设施所能做的就是在源中查找标识信息(通常是 IP 地址)。如果您不小心清除了一些恰好共享相同 NAT 或代理的合法客户端(因此被识别为与 DoS 攻击来源相同的 IP 地址),那么这就是问题的本质。你对此无能为力。您必须不惜一切代价保护服务的完整性,如果 cookie 没有被真正的攻击者保留,您真的无能为力。

如果您选择尝试自己实现这种类型的保护,那么您可以尝试在您的应用程序服务器中实现它(并为此接受一些性能损失),或者您可以在您的同一主机上部署一个中介,例如 NGINX以缓解 DoS 攻击。这是一篇关于为此使用 NGINX 的文章:Mitigating DDoS Attacks with NGINX and NGINX Plus .

关于javascript - 如何使我的 Node.js websocket socket.io 服务器对 DoS 更具弹性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48157191/

相关文章:

python - uwsgi/nginx 上的 Flask 应用程序 - 启动时不创建 unix 套接字文件

javascript - babel 没有转译异步等待(没有polyfill)

javascript - 如何默认隐藏可折叠表格(顶行除外)

regex - ExpressJS 路由正则表达式

c# - 套接字服务器 : Manage client connections

java-udp编程-从服务器向客户端发送消息

javascript - 如何使用 Flot Charts 制作简单的条形图而不是堆叠条形图?

javascript - Highcharts 无法动态添加系列

node.js - 在 Node.js SSH2 中发送终止 (Ctrl+C) 命令

node.js - Electron.js快速入门指南: Errors on “npm start”