在上一篇文章获取真相的第一步:防火墙的工作原理是什么?中,我讲到了为什么“防火长城”能阻拦中国网民访问世界互联网,它背后的原理是什么,因为只有知晓其具体原理,我们才能真正学会如何“翻墙”,即知其然也要知其所以然。
在文章获取真相的第一步:防火墙的工作原理是什么?的最后我讲到突破网络封锁的唯一办法是让境外的一台服务器(代理服务器)代理你去访问被封锁的网站(例如Google),然后再将返回的结果转交给你。利用此原理的软件从传统的VPN,再到Shadowsocks/Shadowsocksr,再到最新的V2Ray、Xray、Trojan、Clash等等。
VPN
VPN是中国网民用来翻墙的最早的工具。在大约10余年前,市面上能使用的绕过“防火长城”的办法基本上只有通过VPN工具。VPN设计最初的目的并不是用来翻墙,它常常被用来在外部连接公司、学校或金融机构的内网,这是因为公司、学校或金融机构的某些内网因为安全性的需要通常禁止的外部网络访问,而又需要满足特定用户外部访问的需求,所以把内网的一台计算机作为代理服务器,在外部的用户通过连接这台代理服务器从而能和内网的其他计算机通讯,这就是VPN最初设计的目的。
你可以发现上述的过程与绕过中国共产党为控制中国网民而设立的“防火长城”的流程在本质上是一样的,所以VPN就被用来进行“翻墙”。但是使用VPN翻墙并不是一个好的解决方案,下面我会详述其原因。
特征性强
在文章获取真相的第一步:防火墙的工作原理是什么?我讲到,互联网上最常用的协议是http/https协议。VPN作为连接外网和内网的一道桥梁,并没有采用通用的http/https协议,相反采用的是PPTP/L2TP/IPSec/OpenVPN等等。这些协议具有明显的特征,在像海一样的数据流中可以被轻松的发现,这就叫特征性强。虽然VPN协议是加密的(尽管部分加密协议存在漏洞可以被破解,但本质上还是密文),“防火长城”并不清楚你具体的浏览内容,但是“防火长城”却知道你使用了VPN。那么,事情就变得简单了,“防火长城”会不分青红皂白的全部封锁VPN流量。这样,绕过网络封锁的企图就失败了。

不能国内外分流
使用过Shadowsocks、V2ray等等软件“翻墙”的网民,一定知道这些软件可以对国内外的流量进行分流——就是只让国外的流量通过代理服务器连接,国内的流量则直接连接。这样的好处可以使得在打开“翻墙”软件的同时又可以保证国内网站的访问速度。VPN在设计之初并不是用于“翻墙”,其不具有国内外流量分流的功能,故使用VPN上网需要经常的开启与关闭。
Shadowsocks/Shadowsocksr
Shadowsocks是由一名昵称为Clowwindy的程序员开发的“翻墙”软件。Shadowsocks协议是加密的,这意味着“防火长城”无法知道访客具体的访问内容。Shadowsocks/Shadowsocksr采用TCP数据包的形式传递数据,并没有http/https流量的特征,虽然不像VPN那样特征性那么强,但是大量的无特征的TCP数据包也可能会引起“防火长城”的警觉,这种感觉就像下面这张图片。

仅仅怀疑是不够的,“防火长城”要做到不大面积的误杀还需要进行精准识别。Shadowsocks协议在设计之初并没有考虑到这么多,协议中有多个漏洞可被用于协议的识别,一旦识别成功,“防火长城”将进行IP与端口的封锁。
大约5年前,奇虎360核心安全团队就在Github上公布过对Shadowsocks协议重定向攻击研究报告,项目地址https://github.com/edwardzpeng/shadowsocks,报告Redirect attack on Shadowsocks stream ciphers.pdf。
具体探测细节本文不详述,感兴趣的可以自行搜索查阅,另附几篇对Shadowsocks协议探测识别的研究文章,供有需要的人员浏览学习。
- Shadowsocks是如何被检测和封锁的
- shadowsocks-rust 服务端实现缺陷可能导致主动探测
- The Random Forest Based Detection of Shadowsock’s Traffic(基于随机森林的Shadowsocks流量检测)
- 使用主动探测方法识别 Shadowsocks 服务
V2Ray/Xray/Trojan
V2Ray是继Shadowsocks之后新兴的新一代翻墙软件。与Shadowsocks不同的是,V2Ray更像是一个集合,V2Ray不仅支持Shadowsocks协议,也支持VMess、VLESS协议,也支持传统的非加密Socks5、http代理协议。在VMess/VLESS协议中有好几个子项,VMess + websocket + tls / VLESS + tcp + xtls等等可以将流量伪装成https流量的一种组合方式。然而,总是没有完美的办法,VMess/VLESS协议也面临被识别的风险。
对于VMess协议,在Github上已有网友爆出其协议最初设计的漏洞,从而导致被轻松识别的办法,详见vmess协议设计和实现缺陷可导致服务器遭到主动探测特征识别(附PoC),这个漏洞出现在只使用裸VMess的服务器上,即外侧不套tls(https)。对于使用https协议伪装的VMess/VLESS,“防火长城”经过不断“进化”,利用人工智能等AI技术,通过Client Hello/Server Hello指纹特征码来进行识别,下面详述。
TLS指纹
使用https协议并不一定万事大吉。研究者发现,不同浏览器、不同设备在与服务器开始通讯的密钥协商环节,他们所发送的数据包存在差异,这种差异被称为tls指纹。在连接初期,客户端需要发送Client Hello给服务端,而不同的客户端发送的Client Hello数据包的大小字节数、数据包的熵都不同。通过这些细微差别,结合人工智能技术,用他们的特征来生成特定的指纹,这样就能通过指纹来区别不同的客户端了。
V2Ray等“翻墙”软件大多使用Golang开发。显然,Golang发送的Client Hello数据包一定与常规浏览器发送的数据包有明显的区别,这种区别就可以用来识别“翻墙”软件。当然,这种识别方式存在着一定误差,“防火长城”可能会在“特殊时期”采用这种激进的识别策略。但随着其采集的指纹数量的增加,误差会越来越少,封锁“翻墙”的精准度将提升。
下面是几篇关于tls指纹识别的文章与讨论
- The use of TLS in Censorship Circumvention (NDSS 19)
- Summary on Recently Discovered V2Ray Weaknesses
- TLS握手指纹(JA3/JA3S)检测恶意软件流量
- 此讨论怀疑tls+ws已经被GFW精准识别的判断是否靠谱
Xray是V2Ray的替代方案,其设计者很多原先来自V2Ray,因与V2Ray开发者观点不和,另立门户故而产生Xray。Xray主推VLESS和xtls,提倡“减负”。VLESS是一个明文协议,相比VMess协议它更轻量化。xtls则用来解决tls in tls的问题,下面详谈。
目前大部分网站都采用了https加密,具体来说是采用了tls加密,如果“翻墙”协议再多一层tls加密(tls in tls),势必就会出现不必要的性能损耗,同时也会暴露更多的特征(由来自tls in tls所造成的数据包的大小、熵与常规浏览网站时的不同导致)。xtls则解决了这个问题,即当浏览https网页时不进行加密,这样即提高的效率,也减少了数据包的特征。
Trojan可以看作一个V2Ray的子集。起初网民刚接触V2Ray时,往往被V2Ray繁琐的配置选项所难倒,而使用Trojan配置起来就比较简单,所以大部分网民使用了Trojan。随着V2Ray的普及与增强,大部分网民又回到了V2Ray的怀抱。目前Trojan较少有人使用。
Clash
Clash作为后期之秀,一度成为最受欢迎的“翻墙”软件。可以说,现在“翻墙”的网民没有人不知道Clash。Clash与V2Ray最大的区别是它支持Shadowsocksr协议。由于Shadowsocksr的不安全性,V2Ray团队取消了对其的支持。然而,大部分购买“机场”节点来“翻墙”的网民,由于“机场”节点使用的协议为Shadowsocksr,故不得不使用Clash。同时,“机场”也在说明文档里面推荐使用Clash,这就造成Clash一度十分火爆。Clash有比V2Ray更加灵活的分流功能,它不仅可以国内外分流,还可以为不同的网站指定不同的节点。例如,如果你购买的机场提供的节点包含香港、日本、美国三个地区,其中美国地区节点费用最低,香港最高,你可以为YouTube、Netflix等流量消耗较大的视频网站指定美国的节点,访问这些网站的数据将被转交给美国的代理服务器从而节省你的流量费用。除此之外,Clash还提供了TUN模式。在Windows上,传统的V2Ray客户端V2RayN是通过配置系统代理来进行流量拦截的,是否遵守系统代理的配置取决于具体的不同软件,好在Chrome浏览器是遵守系统代理的,所以通过浏览器是可以“翻墙”的。但对于有YouTube直播需求的人员来说,仅仅通过配置系统代理是不够的。因为直播需要安装第三方软件,这些软件通常不会遵守系统代理的配置。TUN模式就解决了这个问题,TUN可以理解为一张虚拟网卡,相当于从物理上将所有的流量接管拦截,这样就真正实现了全局“翻墙”。
然而好景不长,Clash及其相关软件Clash for Windows等在2023年11月初相继删库跑路。这给“翻墙”软件生态造成重创。好在“翻墙”软件众多,有很多的替代方案,也有热心网民提前备份了Clash代码,网民还可以继续选择Clash,但开发者不再更新,后续安全性与bug的修复仍然是个问题。
sing-box
sing-box也是一个后起之秀,被称为网络代理平台的“瑞士军刀”。sing-box具有全平台的GUI客户端软件,尤其是iOS平台,它是少有的免费软件。sing-box支持的协议非常丰富,除了常用的Shadowsocks、VMess、VLESS还支持Hysteria2、WireGuard等等以UDP为基准的新协议。此外,sing-box的路由配置功能也十分强大和灵活,支持用路由规则集来配置路由,目前十分受欢迎。
总结
终于来到总结了,“翻墙”软件众多。如今,我更推荐大家选择较为新型的“翻墙”协议,比如Xray下的VLESS,结合xtls来进行加密与伪装,而客户端软件则可以根据各大平台不同来选择不同的软件,Windows可以使用v2rayN、nekoray,Mac OS可以使用V2rayU,Android可以使用NekoBox,iOS可以使用Shadowrocket等等。