VPN和正向代理(socks,httpproxy)可以说是整个设计目的和设计思路都是完全不一样的,但它们都能做到同一件事,就是加密流量路由到另一端进入公网,而且从用户的角度来看最终的结果是一样的,就是可以访问谷歌了,很多代理在宣传的时候都会写vpn,因为中国人看到vpn会更加容易理解那是做什么的,哪怕那个理解是错的,所以很多人会搞混其中的区别,还有手机上会显示要添加vpn什么的,那是因为安卓没有root想要全局接管流量只有用安卓的vpn接口这一个办法,root了就可以用更底层的方法去路由流量了。
我打算用最通俗的语言将这个问题讲一下,很多地方都是一堆网络专用术语,我不认为没学过网络的人能看得懂,不仅如此还有很多半懂不懂的人在科普,这让错误的观念更加错误了。
先直接说一个简单的结论,从翻墙的角度来说,代理毫无疑问比vpn更好用,不是因为那些伪装协议用得是代理协议,而是因为代理协议的设计理念就是为了代理,而且代理不需要用到管理员权限,这意味没有管理员权限的企业用户是可以自行用代理的,VPN由于特性问题必须要有虚拟网卡,没有管理员权限是做不到的,如果你发现翻墙客户端从头到尾都不需要管理员权限,那就不可能是vpn。
代理的优势
代理可以传输www.google.com:443,而vpn只能传输142.251.42.164:443,会发现代理可以自己解析,而VPN必须先解析好,这使得代理有了相当大的优势。
举个例子,比如我叫了个5公里外跑腿的,告诉他我要买百事可乐和可口可乐,跑腿的去查地图,然后知道了哪里有百事可乐和可口可乐卖,买完回到自己的基地,然后送到我家,这是全流量代理。
又比如我叫了个5公里外跑腿的,我告诉他我要买我家旁边1.2公里处的超市里的2楼13号货架第2排的百事可乐,和距离我10m的楼下小卖部的可口可乐,然后跑腿的从5公里外跑到我家旁边给我把百事可乐和可口可乐买来了,然后回到自己的基地,再从5公里外给我把百事可乐和可口可乐送了过来,这是自行dns解析全流量vpn。
又比如我叫了个5公里外跑腿的,我让他帮我查哪里有卖百事可乐和可口可乐,他查到距离他1公里处的超市1楼5号货架上第2排有百事可乐,距离他2公里的超市3楼17号货架上第3排有可口可乐,然后告诉了我结果,我就让跑腿的去距离他1公里处的超市1楼5号货架上第2排买百事可乐,距离他2公里的超市3楼17号货架上第3排买可口可乐,然后他就去买了,回到自己的基地,给我把百事可乐和可口可乐送来了,这是远端dns解析全流量vpn。
从上面几个例子可以看出用vpn我无论如何都必须知道目的地,而代理我只需要告诉他需要什么就行了,查地图的这个过程会造成相当多的额外延迟,而且分流vpn最大的问题在于怎么分流解析,而不是考虑ip是否在国内,我可以在vpn里把cnip全加上规则不走vpn,这是vpn本来就能做到的,但是问题在于我要采用哪端的dns,无论我采用哪端的,VPN只认识ip,不认识域名,如果你认为可以查到百事可乐比较远,再去用远端解析,那就还是一样的问题,vpn用的是系统dns,系统dns不存在这么精细的操作,会让事情变得很复杂,会产生很多没有必要的请求,本来google.com可以直接走代理的,但vpn必须解析出来,有了ip才能看路由表。但这个复杂只来自于国内,因为国外为啥要做这么精细的分流,国外vpn全部采用远端dns解析,因为他们不需要怕流量回国会更容易被墙。
那么为什么代理没有这个问题,实际上代理是有这个问题的,但是RFC标准代理服务端本身就要内置dns,意味着在不影响标准化的情况下更加有操作空间,在用户无感知的状态下做完美分流。
翻墙所使用的客户端实际上是代理服务端,真正的代理客户端是不具备出站能力的,只能将请求发送给代理服务端,clash监听一个端口作为代理服务端,代理客户端(比如浏览器)将流量发给clash,然后clash把域名解析出来国内的自己访问,国外的将流量发到服务器,国外流量发送到服务器的这个过程称之为请求上游,而不是单纯的客户端访问服务端。
所以翻墙客户端正确的例子是这样的,我雇佣了一个管家(翻墙客户端),告诉他我要买百事可乐和可口可乐,他去查地图,然后他发现可口可乐就在我家楼下10m外,而百事可乐在我家1公里处,所以管家自己去买了可口可乐送到我手里,他叫了个跑腿的去买百事可乐,然后跑腿的自己去查地图就近买百事可乐,回到基地,送到管家手里,管家送到我手里,这是国内外分流客户端。
你会发现我还是只发送了一个请求,就是要买可口可乐和百事可乐,然后翻墙客户端帮我把事情全部都做好了,这就是目前翻墙客户端所使用的逻辑。
VPN是什么
那么VPN到底是什么,我上面的例子其实是非常不准确的,因为VPN的用处根本不是这个,他的中文名叫虚拟专用网络,简单来说就是跑在公网上的局域网,去掉虚拟两个字,专用网络就是普通的局域网,对于系统来说,在家里上网,流量路由到光猫出去,和用vpn把流量路由到境外出去,没有区别。
VPN的例子应该长这样,我希望和一个在日本的朋友通信,于是我们就打了个电话,这样我们就可以互相通信了,我让他帮我去谷歌查东西,他查完了告诉我,然后他让我在百度上查点东西,我查完了告诉他,这就是VPN最初设计出来的用途。
那么上面这个例子里很明显有一个地方很类似于代理,就是我和日本人之间的通信是直接的,而且谷歌不知道查东西的其实是我,但是有一个代理没法实现的东西就是日本人也让我查了百度,也就是说VPN其实是双向通信的,双方通过一个连接(打电话),传输任何数据,电话始终是拨通的。
而我上面代理的例子中,我用得是让跑腿的去买东西,买东西是一次请求,不是一个长效连接,这次请求后是下一次请求,每一个请求是否成功不影响下一次请求,他没买到可口可乐不影响给我把百事可乐买来了,代理明确知道这是两件事,前后没有关联性。
而VPN必须要维持打电话的这个过程,一旦断开就必须重新打电话,VPN也不知道具体请求的过程,如果我发了两个数据包给1.1.1.1:443,VPN不知道这是同一次tls握手还是两次,他只会把数据包发给1.1.1.1:443,其他什么也不管。
反向代理
还有一个不会搞混的东西是反向代理,比如我去小卖部买可口可乐,我不知道这东西在哪里生产的,小卖部就是反向代理,他将可口可乐从供应商反向代理给了我,反向代理是反过来的,我不知道是谁在真正的卖可乐,我只知道是小卖部在卖可乐。
正向代理就像之前所说,小卖部不知道真正买可乐的是谁,他只知道我的管家到他那儿买了可乐。