Nginx安全WebSocket代理需四层防护:限连(limit_conn)、控时(proxy_read_timeout等)、TLS加固(TLSv1.2+、OCSP)、访问审计(map+429拦截+日志)。

要在 Nginx 中配置安全的 WebSocket 代理并有效防范拒绝服务(DoS)攻击,不能只靠基础的 proxy_pass 和升级头透传。关键在于:**限制连接行为、控制资源占用、切断异常长连接、叠加访问防护层**。下面从四个实用角度展开说明。
限制单 IP 并发连接数
恶意客户端可能建立大量空闲或低频 WebSocket 连接,耗尽后端连接池或 Nginx 工作进程资源。使用 limit_conn 指令可强制约束:
- 在
http块中定义连接限制区域:limit_conn_zone $binary_remote_addr zone=ws_perip:10m; - 在 WebSocket 的
location块中启用限制:limit_conn ws_perip 20;(单 IP 最多 20 个并发连接) - 配合
limit_req控制握手请求频率(防扫描式连接洪泛):limit_req zone=ws_handshake burst=5 nodelay;
设置合理超时与禁用缓冲
默认超时(60 秒)对 WebSocket 极其危险——攻击者可维持大量半开连接,长期占位不发数据。必须显式延长读写超时,并关闭无意义的缓冲:
-
proxy_read_timeout 86400;(24 小时,按业务实际设,如行情推送可设为 3600) -
proxy_send_timeout 86400;(同上,避免因心跳间隔误断) -
proxy_connect_timeout 10;(握手建连失败快速释放) -
proxy_buffering off;(禁用响应缓冲,防止大消息堆积内存) -
proxy_buffer_size 16k;和proxy_busy_buffers_size 32k;(显式控制缓冲上限)
启用 TLS 层防护与协议加固
WSS 不仅是加密,更是 DoS 防护的第一道屏障。Nginx 可在 SSL 握手阶段过滤低质量连接:
- 强制 TLS 1.2+,禁用弱协议:
ssl_protocols TLSv1.2 TLSv1.3; - 启用会话复用减少 CPU 开销:
ssl_session_cache shared:SSL:10m; ssl_session_timeout 4h; - 开启 OCSP Stapling 加速证书验证:
ssl_stapling on; ssl_stapling_verify on; - 搭配
ssl_prefer_server_ciphers on;防止降级攻击影响稳定性
结合访问控制与日志审计
单纯限流不够,需识别并拦截可疑行为:
- 用
map指令标记高频 Upgrade 请求的客户端:map $http_upgrade $is_ws_attack { default 0; "~*websocket" 1; },再配合if ($is_ws_attack) { return 429; }简单拦截异常 UA - 记录 WebSocket 握手日志,便于溯源:
log_format ws_log '$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" $request_time $upstream_response_time'; - 在
location块中启用:access_log /var/log/nginx/ws-access.log ws_log; - 配合 fail2ban 或自定义脚本,对 429/400 高频 IP 自动封禁


















