Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

关于Trojan-Go引入混淆插件的初步设想和讨论 #71

Closed
p4gefau1t opened this issue Jun 3, 2020 · 8 comments
Closed

关于Trojan-Go引入混淆插件的初步设想和讨论 #71

p4gefau1t opened this issue Jun 3, 2020 · 8 comments
Labels
enhancement New feature or request

Comments

@p4gefau1t
Copy link
Owner

p4gefau1t commented Jun 3, 2020

如果不出意外,我们将在未来引入类似Shadowsocks的SIP003的可插拔传输层的混淆插件支持。

shadowsocks/shadowsocks-org#28

引入的目的,是让Trojan协议不再局限于TLS和伪装HTTPS网站,而可以伪装其他流量和服务器。如MySQL流量和MySQL服务器,HTTP流量和HTTP服务器,以及其他土制协议等等。你甚至可以将Shadowsocks,v2ray等作为插件。

此选项是可选的。如果用户选择开启插件功能,Trojan-Go将不再使用TLS作为传输层,而是使用插件作为传输层,内容全部明文传输。由插件来加密和混淆明文,保证信道的安全性和隐蔽性。 开启插件功能后,除了TLS选项失效以外,其他Trojan-Go特性完全可用。其中包括服务端抵抗主动探测的特性。

注意,一旦选择开启插件传输,Trojan-Go将完全信任用户提供的插件的可靠性和安全性,Trojan-Go仅仅做鉴权和抵抗主动探测的工作,而不进行任何加密。

下面是一些解释和设想


最近v2ray已有讨论制订新协议的issue。除去其中的情绪化的部分,我认为讨论的意义还是比较深刻的。

v2ray/v2ray-core#2526

个人的观点是,TLS非常可能是未来穿透防火墙的主力军。但是鸡蛋不能放在一个篮子里。我们不能将战线完全收缩到TLS上,完全放弃其他协议。各类土制协议(不保证密码学安全,但是完全私有的协议)应该得到支持。保持代理协议的多样性,可以大大阻碍防火墙的维护人员,研究学习各类代理,以及部署相应的探测机制,增加审查的难度。因为,防火墙不可能探测和识别一个未公开的、它从来不知道的协议;即使公开,也因为协议数量众多,无法进行有效审查。

简而言之,做一个可能不太恰当的比喻,如果说TLS是正规军,正面对抗防火墙,那么土制协议如同游击队,满地开花。我们的目的,是通过农村包围城市,让防火墙淹没在人民战争的汪洋大海中。

基于以上的观点,Trojan-Go可能在未来引入类似Shadowsocks的可插拔传输层混淆插件。但与其有一些不同。由于Trojan协议本身并不进行加密,且基于Trojan本身的抵抗主动探测的精神来看,合格的插件需要满足下面几个原则:

  1. 插件本身可以对传输内容进行加密,混淆和完整性校验,以及可以抵抗重放攻击

  2. 服务端的插件,在检验到内容被篡改/遭到重放时,必须将此连接交由Trojan-Go处理而不是直接断开,Trojan-Go将此连接重定向到配置文件中预设的端口上

其中第二点的设计目的,与HTTPS站点伪装的目的类似。

为了方便理解,举一个例子。

  1. 假设你的插件伪装的是MySQL流量。防火墙通过流量嗅探,发现你的MySQL流量大得异常,决定主动连接你的服务器进行主动探测。

  2. 防火墙连接到你的服务器并发送探测载荷,你的Trojan-Go服务端插件,经过校验,发现这个异常连接不是代理流量,于是将这个连接交由Trojan-Go处理。

  3. **Trojan-Go发现这个连接异常,将这个连接重定向到一个真正的MySQL服务器上。**于是,防火墙开始与一个真正的MySQL进行交互,发现其行为与真实MySQL服务器无异。

于是自始至终,防火墙无法判断你的服务器是否是Trojan-Go服务器。因为被动探测(流量嗅探)来看,你的流量是MySQL流量。主动探测来看,你的服务器行为就是MySQL的行为。

如果大家有更好的想法,建议或者意见,都可以在下方进行讨论。

@p4gefau1t p4gefau1t pinned this issue Jun 3, 2020
@p4gefau1t p4gefau1t added the enhancement New feature or request label Jun 3, 2020
@txdywy
Copy link

txdywy commented Jun 3, 2020 via email

@tomxiang1
Copy link

构想牛逼,非常赞同。

@ohperhaps
Copy link

ohperhaps commented Jun 3, 2020

个人的观点是,TLS非常可能是未来穿透防火墙的主力军。但是鸡蛋不能放在一个篮子里。我们不能将战线完全收缩到TLS上,完全放弃其他协议。各类土制协议(不保证密码学安全,但是完全私有的协议)应该得到支持。保持代理协议的多样性,可以大大阻碍防火墙的维护人员,研究学习各类代理,以及部署相应的探测机制,增加审查的难度。因为,防火墙不可能探测和识别一个未公开的、它从来不知道的协议;即使公开,也因为协议数量众多,无法进行有效审查。

早上看了半天v2ray的讨论,非常赞同这样的观点

@rapperx755

This comment has been minimized.

@kingofotaku
Copy link

kingofotaku commented Jun 3, 2020

如果这个构想能完全实现,那定是极好的。毕竟gfw再怎么说也不可能仅凭流量大小就判定服务器有异常。不过这样一来会否使得部署成本增加?

@p4gefau1t
Copy link
Owner Author

p4gefau1t commented Jun 3, 2020

如果这个构想能完全实现,那定是极好的。毕竟gfw再怎么说也不可能仅凭流量大小就判定服务器有异常。不过这样一来会否使得部署成本增加?

简而言之,这个插件功能,是留给想自己折腾的人的。既然想自己折腾,连协议都是自己实现的,为什么会在意部署麻烦的问题呢?

TLS作为传输层仍然是默认并且推荐的方式。

@kingofotaku
Copy link

如果这个构想能完全实现,那定是极好的。毕竟gfw再怎么说也不可能仅凭流量大小就判定服务器有异常。不过这样一来会否使得部署成本增加?

简而言之,这个插件功能,是留给想自己折腾的人的。既然想自己折腾,连协议都是自己实现的,为什么会在意部署麻烦的问题呢?

明白了,所以它才是可插拔的。

@moranno
Copy link

moranno commented Nov 27, 2022

很可惜现在tls已经不好用了,tls in tls基本上1天死。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement New feature or request
Projects
None yet
Development

No branches or pull requests

7 participants