Files
trojan-go/docs/content/advance/websocket.md
T
2020-04-13 22:13:00 -04:00

3.1 KiB

title, draft
title draft
使用Websocket进行CDN转发 false

Trojan-Go支持使用TLS+Websocket+TLS(多重TLS)承载Trojan协议,使得利用CDN进行流量中转成为可能。这个特性的同时考虑了将来GFW部署大规模HTTPS中间人攻击的情景。开启Websocket后,因为Trojan-Go使用了多重TLS,即使遭受GFW的HTTPS中间人攻击,在正确的配置下,连接的安全性依然能得到保证。

服务器和客户端配置文件中同时添加websocket选项,并将其enabled字段设置为true,并填写path字段即可启用Websocket支持。下面是一个完整的Websocket选项

"websocket": {
    "enabled": true,
    "path": "/imaurlpath",
    "hostname": "www.your_awesome_domain_name.com",
    "password": "another_password"
}

客户端hostname是可选的,填写你的域名。如果留空,将会使用remote_addr填充,服务端可以省略hostname。

path指的是websocket所在的URL路径,必须以斜杠("/")开始。路径并无特别要求,满足URL基本格式即可,但要保证客户端和服务端的path一致。path应当选择较长的字符串,以避免遭到主动检测。

服务器开启Websocket支持后可以同时支持Websocket和一般Trojan流量,未配置Websocket选项的客户端依然可以正常使用。

由于原版Trojan并不支持Websocket,因此,虽然开启了Websocket支持的服务端可以兼容原版Trojan客户端,但是如果要使用Websocket承载流量进行CDN中转等,请确保双方都使用Trojan-Go。

因为Trojan-Go与CDN进行了TLS握手,对于CDN而言,TLS流量内容是明文。为了保证安全性,Trojan-Go默认将在Websocket连接上再建立一次TLS连接。此时传输实际上经过了两次TLS连接,并且这个TLS隧道的证书校验被强制开启。

如果你使用了国内的CDN,建议设置password字段进行二次加密,Trojan-Go将使用该密码对Websocket承载的流量再进行一次加密(AES-128-CTR)。注意这个字段的作用仅仅是混淆TLS的特征,防止被国内的CDN识别和封锁Trojan流量。无论是否使用二次加密,传输的安全性都可以由第二层TLS隧道保证。注意确保服务端和客户端混淆密码一致。

CDN转发的场景和在GFW在2020年3月29日进行的HTTPS流量劫持和中间人攻击类似。它们的共同点是,第一层TLS承载的流量明文均可以被第三者窃听。如果你使用了websocket模式,你可以将客户端的verify字段填写为false,并指定cert字段。在这样的设置下,即使第一层TLS传输的明文遭到审查,由于第二层TLS的保护(证书校验强制开启),传输的内容依旧安全。

下面是一个客户端配置文件的例子

{
    "run_type": "client",
    "local_addr": "127.0.0.1",
    "local_port": 1080,
    "remote_addr": "your_server",
    "remote_port": 443,
    "password": [
        "your_password"
    ],
    "websocket": {
        "enabled": true,
        "path": "/imaurlpath",
        "hostname": "www.your_awesome_domain_name.com"
    }
}