WebSocket连不上时,应分层排查:先用telnet验证TCP连通性;不通则检查云安全组和系统防火墙(firewalld/iptables/nftables)是否放行对应端口;再用conntrack和tcpdump定位拦截位置。

WebSocket 连不上,但 Nginx 配置看起来没问题,服务端也正常监听——这时候要重点怀疑防火墙在 TCP 层就拦住了连接请求。Linux 系统级防火墙(firewalld/iptables/nftables)和云平台安全组是两个最常被忽略的拦截点,必须分层排查。
确认请求是否真正抵达服务器
先排除“连都没连上”的情况。WebSocket 握手始于 TCP 三次握手,如果 SYN 包根本到不了服务器,后续所有 HTTP 头、Upgrade 协议都无从谈起。
- 在客户端执行:telnet your-server-ip 80 或 telnet your-server-ip 443(根据你实际用的端口)
- 能通 → TCP 层通畅,问题在更高层(如 Nginx 配置、WAF、证书)
- 不通 → 请求被拦截在路径中,需继续查防火墙或安全组
检查系统防火墙规则是否放行端口
Linux 主机自带的防火墙可能默认拒绝非白名单端口。注意:WebSocket 用的是 HTTP(S) 端口(80/443),但如果你自定义了后端服务端口(如 8586、2346),这个端口也必须开放。
Linux 性能分析与调优专家,覆盖 CPU、内存、磁盘 I/O、网络、内核参数、编译优化、容器/K8s。适用场景:系统卡顿/高负载、内存不足/OOM/Swap 高、CPU 异常/iowait 高。
- firewalld(CentOS/RHEL/Fedora):sudo firewall-cmd --list-ports 查看已开放端口;若缺失,运行 sudo firewall-cmd --add-port=8586/tcp --permanent && sudo firewall-cmd --reload
- ufw(Ubuntu):sudo ufw status verbose;如未启用则 sudo ufw allow 8586/tcp
- iptables:sudo iptables -L INPUT -n -v,重点找是否有 DROP 规则匹配目标端口,且计数器在增长
别忘了云厂商的安全组(比系统防火墙更优先)
很多开发者调了半天 firewalld,却忘了阿里云、腾讯云、AWS 的安全组才是第一道网关。它工作在网络层,早于系统防火墙生效。
- 登录云控制台,找到对应 ECS 实例的“安全组”配置
- 检查入方向(Inbound)规则:是否允许 TCP 协议、目标端口(80/443 或你的自定义端口)、源 IP(建议先设为 0.0.0.0/0 做临时验证)
- 修改后无需重启服务器,策略秒级生效
用 conntrack 和 tcpdump 辅助定位拦截位置
当 telnet 不通又不确定是哪一环的问题时,这两个工具能帮你缩小范围。
- sudo conntrack -L | grep "dport=8586":如果完全查不到记录,说明 SYN 没进内核;如果看到状态是 INVALID,可能是反向路径校验或早期丢包
- sudo tcpdump -i any "tcp port 8586 and (tcp-syn or tcp-rst)" -nn:在服务器上抓包,看是否收到 SYN;没收到 → 拦截在上游(安全组或网络设备);收到 SYN 但没回 SYN-ACK → 本机防火墙或服务未监听

















