websocket能穿透企业防火墙,关键在于其握手阶段复用http协议并伪装成https流量。需配置frp的websocket传输、有效tls证书、sni域名、应用层心跳及路径伪装,并遵守内网端口限制、token认证和日志脱敏等安全规范。

WebSocket代理穿透企业级防火墙,关键不在“强攻”,而在“伪装”。企业防火墙通常只放行80/443端口的HTTP/HTTPS流量,而WebSocket在握手阶段完全复用HTTP协议(通过Upgrade: websocket头),后续数据帧虽为二进制,但整体流量形态与普通网页访问高度一致——这正是它能绕过多数深度包检测(DPI)和策略拦截的核心原因。
为什么传统TCP穿透在企业网失效
企业防火墙普遍采用以下策略,直接封杀常规TCP隧道:
- 默认屏蔽所有非80/443/53等白名单端口的入站和出站连接
- 对长时TCP空闲连接主动中断(TCP keep-alive被忽略或重置)
- 基于流量特征识别非HTTP协议(如frp默认TCP模式的固定包头、心跳节奏)
- 禁止未携带合法Host头或SNI信息的TLS连接
选用frp + WebSocket协议的配置要点
frp从v0.50起原生支持transport.protocol = websocket,无需额外中继或改写。重点配置如下:
WebSocket 8.18.2 是该协议规范的一个重要迭代版本,主要优化了连接稳定性与数据传输效率。它通过全双工通信机制,允许客户端与服务器在单一长连接上实时交换数据,大幅降低传统 HTTP 轮询的开销。该版本增强了心跳保活、自动重连及二进制帧传输能力,适用于即时通讯、在线游戏及金融行情推送等低延迟场景,为开发者提供更可靠的实时网络交互基础。
- 服务端(frps)必须监听443端口并启用TLS:仅用HTTP+WS不足够,企业网常拦截无证书的HTTPS请求;需配置有效域名证书(推荐Let’s Encrypt ECDSA证书)
-
客户端(frpc)开启WebSocket传输并指定server_name:
tls_server_name = your.nas.example.com——触发SNI扩展,让流量看起来像访问真实网站 -
禁用默认心跳,改用应用层ping/pong:在frpc配置中设
heartbeat_interval = 0,由上层WebSocket库维持连接,避免frp心跳被识别为隧道特征 -
路径伪装(可选但推荐):在frpc中配置
custom_domains = your.nas.example.com,并在frps的vhost_http_port上反向代理到一个静态页面,使/ws路径与正常Web服务共存
绕过终端设备限制的实操技巧
部分企业笔记本预装EDR或网络准入系统,会拦截非常规进程的出站连接。此时需注意:
- frpc进程名建议改为
chrome_updater.exe或onedrive.exe(仅限Windows测试环境,生产慎用) - 使用
--user参数以标准用户权限运行,避免触发提权告警 - 若DNS被劫持,可在frpc中硬编码服务端IP,并关闭
dns_proxy - 首次连接失败时,先用curl模拟一次HTTPS请求:
curl -vk https://your.nas.example.com,确保证书和SNI能通过基础校验
安全边界必须守住的三条线
穿透不是越狱,企业环境尤其要平衡可用性与合规性:
- 绝不暴露内网原始服务端口:frpc只能映射到本地127.0.0.1:端口,禁止绑定0.0.0.0
- 服务端frps必须启用token认证+加密通信:避免未授权客户端接入形成跳板
-
日志中过滤敏感字段:关闭frps的
log_level = info,至少设为warn,防止连接详情泄露内网结构










