防止恶意连接攻击需nginx与应用层协同防御:nginx用limit_conn按ip限并发、校验握手头、提取真实ip;后端per-connection限速、心跳管控、关闭缓冲与缓存。

防止恶意连接攻击不能只靠前端控制或后端单点防御,必须在 Nginx 层和应用层协同设防——Nginx 拦住海量握手请求,后端管住每个连接的行为。
用 limit_conn 限制单 IP 并发连接数
Nginx 是第一道防线,在 HTTP Upgrade 阶段就拒绝超额连接,避免无效请求抵达后端进程浪费资源。
- 使用 $binary_remote_addr(而非 $remote_addr)做哈希键,兼容 IPv4/IPv6,避免地址哈希冲突
- 配合 map 指令提取真实客户端 IP(如通过 X-Forwarded-For 或 CF-Connecting-IP),并配置 set_real_ip_from 和 real_ip_header 防伪造
- 示例:单 IP 最多允许 5 个并发 WebSocket 连接,超限直接返回 503
严格校验握手请求头
不是所有 Upgrade 请求都合法,Nginx 可提前拦截明显异常的握手,减轻后端压力。
- 检查 Connection: upgrade 和 Upgrade: websocket 是否同时存在,缺一即返回 400
- 拒绝空 Origin、HTTP 协议 Origin 或未授权域名(如 Origin: http://evil.com)
- 禁止 token 放 URL 参数(如 ?token=xxx),这类参数易被日志、代理、Referer 泄露
后端为每个连接独立限速与心跳管控
连接建立后,攻击者可能发送高频小帧耗尽 CPU 或维持“僵尸连接”占用 fd 和内存,必须 per-connection 约束。
- 为每个新连接初始化滑动窗口限流器(非全局共享),例如每秒最多 3 条业务消息,超限立即关闭并返回状态码 4408
- 设置 ping 超时(如 35 秒):服务端发 ping 后未收到 pong 就断开,防止静默占资源
- 连接建立后 2 秒内必须收到认证帧(如 {"type":"auth","token":"..."}),否则强制关闭
关闭缓冲与缓存,避免干扰帧流
默认缓冲机制会攒帧、延迟甚至粘包,不仅影响实时性,还可能被利用放大攻击效果。
- 在 location 块中显式设置 proxy_buffering off,禁用响应缓冲
- 加 proxy_cache off,防止 Upgrade 请求被缓存命中返回 200(导致握手失败)
- 启用 tcp_nodelay on,绕过 Nagle 算法,确保小帧(如心跳、指令)即时透传











