Apache不原生处理WebSocket帧,但可通过分层协同防护:防火墙控制握手流量、Apache反向代理校验HTTP升级请求、ModSecurity拦截畸形握手、后端服务校验Origin与帧合法性。
apache 本身不原生支持 websocket 协议处理,也不直接解析 websocket 帧或拦截其消息层攻击(如恶意 payload、非法 opcode、超长帧等)。但你可以通过“分层协同”方式,让 apache 在网络层和应用层入口处配合系统防火墙与反向代理机制,对 websocket 流量实施有效过滤与防护。核心思路是:**用防火墙控连接、用 apache 控握手、用 waf 或前置规则控协议合规性**。
1. 防火墙层面:只放行合法 WebSocket 握手流量
WebSocket 连接始于一个标准 HTTP GET 请求(带特定 header),之后才升级为二进制帧通信。传统 iptables/ufw 无法识别帧内容,但可精准匹配握手特征:
- 用 iptables + string 模块只允许含
Upgrade: websocket和Sec-WebSocket-Key的请求进入端口(如 8080) - 示例命令:
sudo iptables -A INPUT -p tcp --dport 8080 -m string --string "Upgrade: websocket" --algo bm -m string --string "Sec-WebSocket-Key" --algo bm -j ACCEPTsudo iptables -A INPUT -p tcp --dport 8080 -j DROP - 避免开放全端口;若使用非标端口(如 8765),务必在 ufw 中限制来源 IP 网段,例如:
sudo ufw allow from 192.168.10.0/24 to any port 8765 proto tcp
2. Apache 层面:作为反向代理严格校验握手请求
Apache 不处理 WebSocket 数据帧,但可作为反向代理(mod_proxy_wstunnel)把合法握手转发给后端 ws 服务(如 Node.js、Websocat)。关键是在代理前做协议级筛查:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 启用
mod_proxy和mod_proxy_wstunnel:a2enmod proxy proxy_http proxy_wstunnel - 在
<Location>块中限制仅允许 WebSocket 升级请求,并拒绝非法方法:<Location "/ws"><br> ProxyPass "ws://127.0.0.1:3000/ws"<br> ProxyPassReverse "ws://127.0.0.1:3000/ws"<br> <LimitExcept GET><br> Require all denied<br> </LimitExcept><br> # 拒绝空 User-Agent 或异常 Upgrade 头<br> RequestHeader unset User-Agent early<br> SecRule REQUEST_HEADERS:User-Agent "^$" "id:1001,deny,msg:'Empty UA in WS handshake'"<br></Location>
- 关闭危险方法:
TraceEnable off,并禁用mod_dav等无关模块
3. 协议合规增强:集成 ModSecurity 拦截畸形握手
ModSecurity 可深度解析 WebSocket 握手阶段的 HTTP 请求(仍是标准 HTTP 报文),对常见协议攻击提前拦截:
- 启用 REQUEST-920 协议强化规则集,自动检测:
• 非法 HTTP 方法(如 TRACE、DEBUG)
• 超长 Host / Origin 头(防缓冲区溢出)
• 重复或矛盾的Sec-WebSocket-Version
•Origin头缺失或伪造(配合 CORS 白名单) - 添加自定义规则示例(防路径遍历试探):
SecRule REQUEST_URI "\.\./" "id:1002,deny,msg:'Path traversal in WS path'" - 注意:SecRequestBodyAccess 必须开启,否则无法检查 POST 类握手(极少见,但部分客户端会用)
4. 补充防护:结合后端服务自身控制
Apache 是入口,但最终安全依赖后端 WebSocket 服务的实现:
- 后端应校验
Origin头是否在白名单内(防跨域滥用) - 限制单连接最大帧长度(如 ≤ 1MB)、最大连接数、空闲超时时间
- 对消息内容做基础校验(如 JSON 结构合法性、opcode 合法性),而非完全信任 Apache 已放行的连接
- 若使用 Websocat,务必加
--restrict-uri /ws参数,避免任意路径升级

















