apache不原生支持websocket ip白名单,但可通过mod_rewrite或require指令在握手请求阶段(get /ws/)校验%{remote_addr}或x-forwarded-for,配合proxy_wstunnel模块和ws://前缀代理实现路径级访问控制。
apache 本身不提供 websocket 连接层的原生 ip 白名单机制(如限制 ws:// 或 wss:// 握手请求来源),但可通过组合 mod_rewrite、mod_authz_host(或 mod_authz_core)与 mod_proxy_wstunnel 实现路径级访问控制。关键在于:白名单必须作用于 websocket 的 http 升级请求(即 get /ws/ 类初始握手),而非后续的二进制帧流。
在 ProxyPass 前拦截并校验客户端 IP
WebSocket 握手本质是一次带 Upgrade: websocket 头的 HTTP GET 请求,Apache 可在此阶段用 RewriteCond 判断 %{REMOTE_ADDR} 是否在允许列表中,不匹配则直接拒绝(返回 403),避免代理到后端。
- 确保已启用
rewrite和authz_host模块:a2enmod rewrite authz_host - 在
<virtualhost></virtualhost>或对应<location></location>块中添加规则:
RewriteEngine On
RewriteCond %{REMOTE_ADDR} !^192\.168\.1\.(10|20|30)$
RewriteCond %{REMOTE_ADDR} !^203\.0\.113\.5$
RewriteRule ^/ws/ - [F]
上述配置只允许来自 192.168.1.10、192.168.1.20、192.168.1.30 和 203.0.113.5 的请求访问 /ws/ 路径;其他 IP 发起的 WebSocket 握手将收到 403 Forbidden。
配合 X-Forwarded-For 处理代理链场景
若 Apache 前还有 Nginx 或 CDN,真实客户端 IP 会出现在 X-Forwarded-For 头中。此时需启用 remoteip_module 并配置可信代理段,使 %{REMOTE_ADDR} 解析为真实 IP:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 启用模块:
a2enmod remoteip - 在虚拟主机中设置:
RemoteIPHeader X-Forwarded-For和RemoteIPInternalProxy 10.0.0.0/8 172.16.0.0/12 192.168.0.0/16(按实际代理网段调整) - 之后 RewriteCond 中的
%{REMOTE_ADDR}即为用户真实 IP,白名单规则仍可复用
用 Require 指令做更清晰的声明式控制
Apache 2.4+ 推荐使用 <requireall></requireall> 配合 Require ip,语义更明确且兼容性更好:
Require ip 192.168.1.10 192.168.1.20 203.0.113.5
Require ip 2001:db8::1
注意:<location></location> 必须放在 <virtualhost></virtualhost> 内,且该路径不能被 ProxyPass 提前捕获(即 ProxyPass /ws/ ... 应写在 <location></location> 之后,或改用 ProxyPassMatch 避免冲突)。否则 Require 规则不会生效。
不要遗漏 WebSocket 专用模块和协议前缀
白名单只是访问控制一环,若底层代理不通,限制也无意义:
- 必须启用
proxy_wstunnel(仅proxy和proxy_http不支持 WebSocket) -
ProxyPass目标地址必须是ws://或wss://(小写),例如:ProxyPass /ws/ ws://localhost:8080/ - 禁用
ProxyBadHeader Ignore(默认值),防止白名单校验后某些握手头被意外丢弃










