You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
2.2 KiB
2.2 KiB
Browser Dialer
Background
基于 一年前的想法 ,利用原生 JS 实现了简洁的 WSS Browser Dialer,达到了真实浏览器的 TLS 指纹、行为特征。
不过 WSS 仍存在 ALPN 明显的问题,所以下一步是浏览器转发 HTTP/2
,QUIC
。
Xray & JS
创造了一个非常简单、巧妙的通信机制:
- Xray 监听地址端口 A,作为 HTTP 服务,浏览器访问 A,加载网页中的 JS。
- JS 主动向 A 建立 WebSocket 连接,成功后,Xray 将连接发给 channel。
- 需要建立连接时,Xray 从 channel 接收一个可用的连接,并发送目标 URL 和可选的 early data。
- JS 成功连接到目标后告知 Xray,并继续用这个 conn 全双工双向转发数据,连接关闭行为同步。
- 连接使用后就会被关闭,但 JS 会确保始终有新空闲连接可用。
Early data
根据浏览器的需求,对 early data 机制进行了如下调整:
- 服务端响应头会带有请求的
Sec-WebSocket-Protocol
,这也初步混淆了 WSS 握手响应的长度特征。 - 用于浏览器的 early data 编码是
base64.RawURLEncoding
而不是StdEncoding
,服务端做了兼容。 - 此外,由于 Xray-core#375 推荐
?ed=2048
,这个 PR 顺便将服务端一处MaxHeaderBytes
扩至了 4096。(虽然好像不改也没问题)
Configuration
这是一个探索的过程,目前两边都是 Xray-core v1.4.1 时的配置方式:
- 准备一份可用的 WSS 配置,注意 address 必须填域名,若需要指定 IP,请配置 DNS 或系统 hosts。
- 若浏览器的流量也会经过 Xray-core,务必将这个域名设为直连,否则会造成流量回环。
- 设置环境变量指定要监听的地址端口,比如
XRAY_BROWSER_DIALER = 127.0.0.1:8080
。 - 先运行 Xray-core,再用任意浏览器访问上面指定的地址端口,还可以
F12
看Console
和Network
。 - 浏览器会限制 WebSocket 连接数,所以建议开启
Mux.Cool
。