关于『VPN混淆』的不完全介绍

warning: 这篇文章距离上次修改已过63天,其中的内容可能已经有所变动。

『使用VPN混淆,绕过VPN块,快速隐私地无法窥视来自ISP,现在按下按钮,轰!推推,网上冲浪!』

前言

笔者并不是什么VPN高手,但是只是想把自己总结的东西都介绍一下,让更多人对此有点认识。尤其是当笔者看到『用VPN混淆绕过流媒体网站的限制』这样的错误说法的时候....反正是忍不住了

咕噜咕噜搜索VPN混淆的知识,假设你是用中文搜索的,那么能找到的结果大多数有以下两个来源:VPN厂商本身的介绍文,以及各路博主的评测。因此这就存在一个问题:关于VPN混淆的介绍必定是不太全面的,因为,评测推广嘛,肯定是看准了其中一个牌子来介绍的。而VPN混淆其实是一个很宽泛的说法,具体实现和技术细节因人而异,因此很多推广文章都是介绍的是他的结果:

『采用了先进的xx技术,让VPN流量得到混淆,绕过VPN限制』
『让VPN流量混入到日常上网流量中....』
『绕过VPN限制,让上网冲浪更畅快.....』

但是笔者总觉得,应该有那么一个地方,把这些底层知识都汇总一下,好让愿意深究的人能够学习到

于是,就是这里了。

VPN混淆是什么

VPN混淆是『VPN obfuscation』或者说『obfuscated VPN』的直译。

介绍这玩意之前先来点基础知识:

使用VPN上网前,我们的流量是:

你 => 运营商 => 目标服务器

一般情况下,使用之后就是:

你(VPN加密) => 运营商1 => VPN服务器(VPN解密) => 运营商2 => 目标服务器

当然所谓的什么双跳VPN,无非是多几个VPN服务器转发罢了,原理是相通的

我们平时说VPN流量是有特征的,指的是VPN流量虽然无法知道其中携带的具体信息,但是却可以用DPI的方式来获取到一些特征值,从而判定这个流量就是VPN流量。而且,实际上这个做法并不需要什么太高级的工具,一个WireShark就足够判断了。

其次,你上网的流量必定是要经过ISP的,甚至还可能需要经过GFW。像这样的机构都可以轻松地检测到VPN流量,从而采取限速或者直接掐断等措施。这么做的原因有很多,比如对UDP流量看不顺眼,比如为了反反审查,等等。上面示意图中的『运营商1』就是这样的一个角色,可以有针对性地屏蔽VPN流量

话题回到VPN混淆上。所谓的混淆,主要的作用就是把VPN流量通过额外加密层等方式去除特征,或者更进一步的是,伪装成HTTP/HTTPS等流量,骗过一些比较低级的防火墙,以实现绕过审查的目的

VPN混淆的种类

上面也提到过了,这玩意的实现因人而异,具体技术细节并不一样,有的是采用现成技术,有的是采用自研技术,大致说来,可以分为以下这几类比较常见的:

协议(可能)自带混淆

Lightway

Lightway是ExpressVPN基于wolfSSL实现的一个私有协议,其核心部分在GitHub上开源。官方宣称是『比OpenVPN更快,更轻量,更具有穿透防火墙的能力.....』

....吗?

事实上,笔者对于是否要把Lightway写进来是比较犹豫的。因为Lightway实际上主推的还是使用UDP模式,对于UDP-QoS而言并无益处。此外,其混淆的实现实际上也是不太清楚的。虽然说官方开源了核心实现,但是实际用的是不是这个呢?无从得知。

翻阅官方对于lightway的介绍可见,其中提到了一个『Post-quantum protection』(后量子信息保护)。出现这个东西的原因是,目前的非对称加密技术基本上是基于『大质数分解难』和『椭圆曲线分解难』等技术实现的安全。到目前为止,还没有一个高效的算法能够快速的暴力破解,因此暂时还是安全的。但是科学家推测,在量子计算机出现之后,即使算法不变,也有可能会大大的提高破解速度,原本安全的东西就不安全了。

业内目前对于实现『后量子时代安全』的方式一般是,添加一个对称加密层,通过预共享的密钥(PSK)加密握手过程(甚至通信全过程)。这样,即使真有这么一个方法可以快速破解非对称加密,也还有一个对称加密层可以撑一段时间。

有趣的一点来了:这个对称加密层,如果你仔细思考一下可以发现,实际上变相地起到了混淆的效果。而上一个通过加密实现混淆的代理协议是什么呢?
Shadowsocks!
因此,Lightway的混淆方式可能和这个也是八九不离十的。有用肯定是有用,也不会损坏原本的安全性。但是大量加密UDP流量能不能骗过高级一点的防火墙(比如GFW)呢?只能交给时间去证明了。

Wireguard (with PSK)

和上面的实现差不多,通过PSK的方式去除WireGuard本身的特征。

但是因为笔者对源码的了解并不深入,因此也不敢下定论这个PSK到底作用于哪里,如果有了解的大牛,烦请告知小弟,谢谢。

根据笔者抓包发现:PSK无法达到混淆效果,其并不改变握手特征(比如说:以01 00 00 00开头的握手包)

外置混淆(流量隧道)

有点类似于给现成的协议打补丁,虽然说不是最优雅的实现,但是却是最灵活的实现,出了点什么事,再打个补丁,或者换一个打,就好了

XOR

XOR本来指的是异或算法,其真值表是:

图源互联网图源互联网

采用数学知识不难证明得出,异或运算可以作为加密算法来使用(事实上,现在很多加密算法的核心之一就是xor),粗略来看的话,此时输入的两个值,其中一个可以定义为明文,另一个就可以认为是密钥,输出的内容就是密文。暂且不论这个方法安全性如何(这就是涉及到密码学的深层知识了,此处不过多涉及),但是你应该已经看出来了,这个东西也可以被用作混淆VPN的流量。

于是,就引出了本题目所说的XOR:OpenVPN的XOR补丁,在收发数据之前做一次XOR处理(配置文件中设定好密钥),就可以增加DPI的难度了。

这个方法确实行之有效,简单XOR处理之后确实也无法再被WireShark等抓包软件分析出来。但是问题就出在这:XOR算法本质上还是很简单的,而且最大的问题是,无法抵御频率分析已知明文攻击。以后者为例,攻击者只需要进行明文 xor 密文的操作,得出的结果就是密钥。明文哪来的?像OpenVPN这种东西肯定有固定协议头什么的,对于有心人而言,分析出密钥到底是多少,也就成了易于反掌的事情。

当然,对于简单一些的防火墙,这种混淆问题不大。但是当咱的对手变成了GFW时,恐怕已经不太适合了

obfsproxy

听说过Tor(洋葱网络)吗?就是那个经常被用来上暗网的东西


obfsproxy正是出自Tor Project之手,属于他们的Pluggable Transports(可插拔传输层...翻译有点怪怪的)的成果之一。具体是怎么混淆流量的,并不清楚(笔者没有仔细读源码),但是其原本的目的是为了让在网络屏蔽较严重的地区的人们可以成功连接上Tor网桥。再后来,人们发现这玩意的适用性实在是太广了(毕竟是Pluggable嘛),因此聪明的人又想出了一个好办法:用它来混淆OpenVPN的流量。

obfsproxy没有进入到OpenVPN的主线中,如果要配合使用,大多数都是用TCP Socket来套娃,也就是obfsproxy先连接到服务器,然后监听一个本地端口,然后让OpenVPN去连接这个本地端口,还不要忘记配置一下路由表,防止流量回环。

麻烦吗?麻烦是麻烦,但是这么做了之后至少能用 —— 放在七八年前,能用这两个字比什么都重要,至少能用了才能谈速度谈质量的不是?

SSH

不知道还有多少朋友用过这个东西:

ssh -N -D 1080 user@host

# -N:不分配shell
# -D <port>:建立动态端口转发,开启一个socks服务器
#    并监听在指定端口

SSH的动态端口转发功能,通过在本地建立socks服务器然后用SSH把数据加密后送到远端的方式实现。

其实如果留心观察的话,就单单凭加密这一点,就已经实现了我们的目标之一。在VPN日渐憔悴而Shadowsocks尚未出现之前(大概也就是10-12年)的时候,SSH曾是很多网友『瞬间看地球』的好工具,甚至也是很多朋友第一条学会的cmd/shell命令。在当时,淘宝有SSH账号出售,各个论坛都有SSH账号提供。各种Linux主机,包括提供了ssh权限的虚拟主机,都可以用作代理

既然有动态端口转发,那么也必然有『静态』转发。没错,虽然说人家不叫这名字,但是确实是有这么一个东西:远程端口转发和本地端口转发。用在VPN混淆上,就是用本地端口转发:

ssh -N -L 11940:localhost:1194 USER@HOST

这个命令也很好理解,把本地的11940端口映射到远端1194端口,然后本地VPN客户端访问127.0.0.1:11940(TCP),就可以让数据先让SSH加密之后再发给服务器,由服务器SSH解密之后再转给VPN服务器处理

到目前为止,看起来都还正常,毕竟SSH的加密可以去除VPN的特征,看起来是很好了。

不过,按下葫芦起了瓢,前文提到,SSH在老久之前被直接作为加密代理使用的,而且其本身的特征也很明显,因此这种方法和上面的一样,也是适合『限制了VPN,但是没有限制SSH』的场景。对于GFW而言,『22或者其他端口的大流量SSH』就已经有理由让他切断连接了

因此VPN over SSH对于GFW而言,至少在目前,意义不算很大,但是它的核心思想值得借鉴:让流量尽量变得常见

SSL

曾经有人提到过,OpenVPN具有很强的混淆能力,其原因是OpenVPN可以设置为443/TCP工作,这是在互联网上很常见的TLS流量。

怎么说呢,你笑我不懂混淆,我笑你不懂OpenVPN。

我们常说OpenVPN是SSL/TLS-VPN,这没错,但是问题在于OpenVPN用的标准SSL/TLS(至少握手不是),因此可以被DPI轻易检测出来(没错,还是我们的好朋友WireShark)

但是办法总比问题多,有人就要说了,既然OpenVPN的TLS并不标准,我们在外面加一层标准的TLS不就好了嘛,反正一加密就看不出特征来了?

这就是本节要介绍的TLS隧道混淆

info:其实此时称其为混淆已经不太合适了,因为外层就是标准的TLS协议,但鉴于其作用还是『混淆』了内层的协议,因此名称保持不变

目前有一部分VPN公司的『隐形』(Stealth)VPN就是用这种方法实现的,基本技术方案是OpenVPN(TCP)+ Stunnel。Stunnel是一个提供TLS加密层的软件,可以保护任意TCP连接,而且最主要的是这是货真价实的TLS,要检测出来就很难很难了(除非分析包头熵什么的了)。具体使用方法网上有很多文章介绍,此处不再复述。

当然,也不一定非得Stunnel不可,其他提供类似功能的都可以,比如GOST,比如V2Ray,比如Simple-TLS。

其他对称加密层

此处当然无法完全列举,但是人见人爱的Shadowsocks也包括在内,也有着很不错的效果

关于其的错误说法

人怕出名猪怕壮,一个概念最怕的是什么:被拿来炒作

『VPN混淆可以绕过流媒体网站的限制』

流媒体网站限制VPN的做法很常见,其主要作用是防止你跨区看版权片。但是,这毕竟是一场猫鼠游戏,流媒体网站使劲限制,VPN提供商使劲绕过,已经成了常态。绕过方法很多,包括使劲换IP的,包括买家宽线路的,甚至还有直接和流媒体网站谈判的(据说ExpressVPN就是如此)。

但是不管怎么样都好,VPN混淆和流媒体网站限制没有半毛钱关系

根据上面的流程图可知,VPN混淆仅作用于『你』到
『VPN服务器』这个范围内。而流媒体网站只能检测到『VPN服务器』到『他的服务器』这个范围,牛头不对马嘴,怎么可能有关系呢?

『VPN混淆可以让你在限制严重的国家连上』

这个说法半对半错

对的方面是,混淆确实可以降低被检测到的概率,这个无可厚非(之所以不是无可非议,是因为这个谁都说不准,除非你就是防火墙的开发者)

但是另一方面,这个问题我在上次的博文里讨论过,简而言之就是,一切的混淆,前提都是你可以连上这个服务器,如果是IP封禁等方式让你连都连不上,那么混淆再高级又有什么用呢?

『VPN混淆可以让你提高网速』

这说法也是半对半错的,主要取决于你怎么理解『提速』。

首先请记住,任何混淆和隧道技术都会减速,比如原来有100Mbps,加上VPN可能只有80,再加个混淆可能只有60Mbps了。

但是其次是,假如你的ISP上了QoS,或者你的对手是GFW,反正就是对于非常见流量限速的,那么混淆成常见流量确实可以绕过这个限制。还是上面100Mbps的例子,假如运营商把VPN流量限速到1Mbps,那么加上混淆之后运营商无法主动限速,当然也就不会轻易限速为1Mbps。但是你的速度也绝不会超过100Mbps,毕竟实际上限就在这

写在最后

猫鼠游戏是没有尽头的,我们能做的就是尽量拖久一点

或者,掰块奶酪吃吃?

深山踏红叶,耳畔闻鹿鸣,感谢您的阅读
(全文完)

none
最后修改于:2024年03月18日 20:19

添加新评论