【问题标题】:How to prevent web socket DDOS attacks?如何防止 web socket DDOS 攻击?
【发布时间】:2019-01-04 16:33:02
【问题描述】:

我刚刚从我的电脑上执行了一个基本的 DDOS:

websocket-bench -a 2500 -c 200 wss://s.example.com

这让我的服务器崩溃了! WS 通过连接到我的 nginx 代理来工作:

    location / {
            proxy_pass http://sock;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";
            proxy_set_header        X-Real-IP               $remote_addr;
            proxy_read_timeout 60;
    }

    upstream sock {
            server 127.0.0.1:1203 fail_timeout=1s;
    }

并且在服务器上的本地端口1203 上是ratchet。棘轮的设置是我允许任何连接,第一个onMessage 执行身份验证,如果无效则关闭连接。

我还尝试通过在第一个连接上传递标头进行身份验证,如果无效,套接字将关闭,但这根本没有帮助,nginx 仍然达到 100% 资源然后崩溃。

我应该分析什么来防止这些崩溃?

将上游更改为另一个关闭的端口(即禁用它)时,服务器仍然崩溃。

【问题讨论】:

  • 您无法通过“调整”某些配置变量或安装阻止 DDOS 的程序来阻止 DDOS。您的问题不在于 ddos​​,而在于一旦崩溃 - 服务就无法恢复。这就是我们使用supervisord 的原因。此外,使用 nodejs 代替棘轮会产生显着的收益。
  • 是的,但我的问题是 DDOS 是在不应该出现的时候引起的。我的网络以 6mb/s 的速度上传应该不能让千兆服务器崩溃——这意味着我的配置有问题。
  • 如果现在有 10,000 人访问我的 http web 服务器,它只会减慢服务器速度而不是崩溃。
  • 10k 对于 nginx 和 node 不会有问题。您可以使用 Cloudflare 之类的服务来阻止它。如果您需要 10k 人连接,则使用多个 nginx 实例(您的 DNS 指向处理您的域的多个 IP 地址)并且每个 nginx 负载平衡到处理 Web 套接字的多个棘轮/nodejs 实例。这就是缩放的方式。

标签: php nginx ratchet socketrocket


【解决方案1】:

要么改变你的认证逻辑让 Nginx 处理它,要么在 Nginx 中实现request and connection limits 来控制有多少连接被接受并传递给上游服务器

【讨论】:

  • 不幸的是,limits 似乎没有任何影响。我不敢相信是 nginx 让我的服务器崩溃了!我担心它可能是我的棘轮 php 脚本。
  • 嗯,好的。如果您完全删除您的上游块并将您的 proxypass 指令更改为 proxy_pass http://127.0.0.1:1203 会发生什么?您通常使用上游指令来定义一组服务器,如果您的棘轮实例失败,那么fail_timeout=1s 将使 Nginx 将服务器标记为关闭 10 秒。通常它会将请求路由到上游块中的其他服务器,但您没有任何请求。就个人而言,虽然我会为 Nginx 推荐 Nchan websocket 模块,但效果很好。
猜你喜欢
  • 2020-10-27
  • 1970-01-01
  • 2020-10-03
  • 1970-01-01
  • 2020-07-10
  • 2017-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多