本文是本人对于使用代理过程中的一些经验总结,并不是教程或者技术性文章,所以内容比较不全面很正常(
本文不会提供任何软件的下载链接,如有需求请自行查找相关下载源。

由于日常的开发以及娱乐需求,我们不得不在某些场景下使用代理连接网络。在各种平台都有各种代理软件供我们选择,有时候为了不同的需求我们会选择不同的软件。总体来说,原理都是把自己设备上的流量通过某种方式”转发”到远程设备上,但其中的能使用的具体方法却五花八门。

在路径上,我们可以把流量经过的地点分为三层:

  • 第一层:由你的流量发起段到代理软件的接入端,比如你的浏览器到你使用的Clash。
  • 第二层:由代理软件到远端服务器,比如由你使用的Clash到某香港的服务器。
  • 第三层:由远端服务器到目标服务器,比如由某香港的服务器到谷歌的服务器。

本文主要对第一层和第二层做适当的讨论,因为第三层也没啥好说的

你的流量如何接入代理软件

不管你使用什么代理软件,Clash也好,v2rayNG也好,这些软件都会在本地监听一个端口来作为代理的接入端。比如Clash大多监听7890端口,v2rayNG默认监听10809端口等等。你可以通过某些设置,使你当前某个软件的流量全部指向这个端口上。

通常情况下,这些监听的端口使用Socks5代理或HTTP代理。因为这两种代理协议都比较“纯粹”,占用的资源也少。区别在于,HTTP代理只能够代理HTTP协议的流量,比如你在浏览器中访问谷歌搜索,使用的就是HTTP(S)协议。而SOCKS5则支持代理几乎所有的TCP和UDP流量。所以在大部分场景下,代理软件监听的SOCKS5端口使用更多一些。

什么是系统代理

当你使用电脑上的Clash或者v2ray类软件时,通常有一个选项叫做「系统代理」。当你打开这个选项时,代理软件就会修改系统设置中的代理选项。但是,系统设置中的代理往往只可设置为HTTP代理(如Win10设置中的代理),而且这个HTTP代理只对当前系统上web浏览器有效。

这也就是为什么明明设置了系统代理,访问GitHub也很快,但在命令行里克隆一个GitHub的仓库却很慢的原因。在命令行下,执行git命令也就是直接执行git的二进制文件,跟你设置的系统代理是没有关系的。

因为很多人都遇到过这个问题就顺便提一下了。也不是没有解决办法,一个方法是git提供了设置代理的配置选项(git config –global http.proxy xxxx 支持socks5),但是这么一配置就会导致以后所有的克隆都会走这个代理,而问题我们无法保证设置的代理不会改变或者随处可用。另一个方法就是使用一些公共的GitHub镜像了,这种方法对于不懂代理的人比较省事。

其他软件中的代理设置

除了使用系统代理选项使浏览器用上代理之外,其他软件大多也提供了代理功能。比如当你登陆QQ的时候,点击右上角的小齿轮,便可以配置http或socks代理选项。那问题来了,我使用的软件确实没有能配置代理的地方,怎么办呢?看下面~

什么是TAP/TUN代理

一些老用户可能了解过一款软件:SSTAP。这是很久前一个为了让某些游戏走代理而设计的软件,它的原理也就是TAP模式。所谓TAP模式其实就是在设备上利用技术手段安装一个虚拟的”网卡”,从而使得系统所有的流量都能经过代理软件。

而TUN模式则和TAP模式异曲同工。与TAP相比,TUN工作在更高的网络层,不需要虚拟的TAP设备,也能实现跟TAP类似的效果。不仅如此,TUN的性能也比TAP要好。目前,Clash系的所有代理软件基本都有TUN功能,比如Windows上的 Clash For Windows 以及 Clash .NET (已停更)等,除此之外还有 tun2socks 等专门具有TUN功能的软件。

另外,除了使用TAP/TUN模式,还有一个比较特殊的东西:Proxifier。它是一款在Windows上实现接管所有系统流量的软件,你可以使用这个软件来使所有系统流量路由到某个Socks5代理上。至于原理,这款软件则是自己实现了一套基于驱动的流量劫持,由于是闭源商业软件,所以具体原理也不是很清楚。但是实测效果跟TAP几乎一样,如果不介意闭源的话也可以选择这款软件。

什么是透明代理

所谓透明代理,就是用户可以感知不到自己处于代理环境下。最常见的透明代理也就是搭建在软理由等设备上的代理。由于软路由可以作为一个局域网的网关,局域网内所有接入设备的流量都会指向网关,所以网关就具有了出来这些流量去处的能力。

代理软件如何处理你的流量

根据代理软件所使用的路由模式,我们可以暂时先把代理软件分为两种:使用了Clash内核的和没有使用Clash内核的。这两类软件各有优缺,下面会详细说说。

第一类软件大部分已v2ray(v2fly或xray)为核心,代表性的有Windows平台上的v2rayN,安卓平台上的v2rayNG,Linux平台上的v2rayA等(由于我没有ios设备也没有Mac所以就不提了)这些软件都有一个共同点:独立的路由模式。比如 Win10平台上的 v2rayN 的路由设置需要自己手动配,安卓上的 v2rayNG 干脆不提供自定义,只有绕过大陆和局域网的选项。不过安卓端的 SagerNet 提供的路由设置就比较丰富,但如果手动配置的话也及其麻烦。

第二类软件则是基于Clash核心的代理软件,Clash 最大的一个特点就是配置文件了。与v2ray系的软件相比,Clash 的配置文件不仅有节点信息,还有完整的路由规则及策略组。换句话说,使用v2ray系的软件每次只能选择一个节点作为代理,而使用Clash则实现了节点分流,针对不同的网站走不同的节点,就像是再同时使用多个节点一样。

不过 Clash 的缺点也很明显,由于完全使用自己的内核,所以也就意味着暂时只能支持一部分代理协议(ss,ssr,vmess,trojan),如果是比较冷门的代理协议(brook,tunnel等)就没法用clash了。而相比较,安卓端的 SagerNet 可以通过插件支持任何类型的代理协议,桌面平台上的 Qv2ray (已停更)也是可以安装插件来支持其他协议。

如何对流量进行分流

我们只有在访问特定网站时才需要经过代理服务器,大部分情况都是直连就可以的,所以便出现了路由模式。

对于v2ray系的软件来说,一般都会有这几种路由模式:GFWList,大陆白名单,全局。

  1. GFWList,顾名思义,就是一个被墙封锁的网站名单。这个名单由民间开发者共同维护,不定时更新。当你的流量经过代理软件时,代理软件会先判断你要访问的网站在不在这个名单里,如果在的话则交给代理服务器来处理了。

    不过问题是,并不是所有的网站都在GFWList里面,有些网站即使没被屏蔽,但由于ISP的一些原因访问就是特别慢,这种情况下就需要也走代理了。

  2. 大陆白名单,这种路由模式比较常用。首先一般我们会有 geoip 和 geosite 这两样东西,第一个 geoip 记录的是大陆的所有IP段,第二个则记录了大陆大部分常用的网站域名。它们与GFWList一样,也是由人们自行维护。当代理软件检测到你的流量是去往大陆内地的时候,则不走代理。

    不过这种方式也不是没有问题,代理服务器是需要成本的,我们访问的大部分不位于大陆的网站速度都还可以,如果所有境外网站都走代理的话就造成了浪费。有时候如果目标网站离我们本来就很近(比如ISP在香港),这时候再走代理可能速度就会被原来更慢了。

  3. 全局模式,就是所有流量都走代理咯,没啥具体要说明的。

而对于 Clash 内核的软件,分流就特别的灵活了。Clash 的规则支持不仅域名匹配,IP匹配,甚至支持IP段,域名关键字匹配。Clash 对所有节点分成不同的组,每条匹配规则都对应着一个策略组。如果对现有的配置文件不满意,完全可以DIY属于自己的分流规则。

举个例子,我们可以把带原生IP的节点分到一个组,然后写一条规则,让流媒体网站(如Netflix等)的流量全部走这个组里的节点。我们还可以把所有的台湾节点分到一个组,让所有动画疯(一个台湾的看番网站)的流量全部走这个组。只要你有相应的需求,就可以DIY自己的规则!

如果比较懒的话,大部分机场都提供现成的Clash规则,GitHub上也有不少写好的模板可以参考,基本是不需要动太多手就可以实现想要的效果。

进阶: 使用Fake-IP

防火墙不仅对某些特定的IP进行了阻断,还对相当一部分域名采取了DNS污染。简单来说,就是通过域名解析到的IP是错误的,所以我们还需要对DNS请求进行代理。但每次请求都先判断,再请求远程服务器DNS,再返回解析结果,客户端再请求,再代理,这样一来二去就极大浪费了时间。于是,Fake-IP 技术出现了。

所谓 Fake-IP,也就是虚假的IP。客户端进行的每次DNS请求,都会直接被代理软件劫持,然后代理软件不会先判断,而是立即返回一个假的IP。于此同时,代理软件再去判断并请求真实的IP,保存到自己的表中。而客户端向这个虚假的IP进行连接时,都会由代理软件直接从表中取出结果,然后对流量进行进一步处理。这样以来就节省了大约一半的时间。如果对更多技术细节感兴趣的话,可以去看参考文章2。

目前只有Clash内核支持Fake-IP模式,如果想使用的话可以在相关配置里把fake-ip设置为true,等待本地DNS刷新就可以正常使用了。

但是这种方式也不是没有缺点,不论是任何系统,都有着DNS缓存机制。假如某一天由于某些原因突然需要把代理软件关掉,这样一来客户端再去请求这个虚假的IP,就得不到任何响应了。这时需要手动刷新系统DNS缓存才能解决。

Fake-IP 比较常见的场景是在软路由上,毕竟软路由大部分时间都是24小时运行的,代理软件不会关,所以一般不会出现问题。目前软路由上支持Fake-IP的代理软件也只有OpenClash了。

附加章节: 代理线路与相关方案如何选择

这一部分会粗略的说一下代理服务器相关的选择。不过大部分人的手里应该都是别人建好的节点,能自己搭建的应该很少。

目前比较流行的代理方案大概有下面几种: vmess+ws直连,vmess+ws+国内中转/隧道,ss+隧道。其他的像IEPL啥的大部分都是ss了,这里就不说了。

如果仅仅是自用的话,选择vmess+ws直连就能满足大部分的需求了,如果想尝鲜,也可以考虑其他冷门协议或者混搭。之前笔者就使用了大半年的brook直连没有出现过问题。

不同协议间的区别

仅仅对于稳定而言,不同协议间的最大区别就是流量特征了。在很久之前ss直连都没有问题,但是由于ss自身的一些缺陷导致流量特征暴露,从而后来可以被精准屏蔽。

对于现在比较流行的vmess+ws或者再套一层tls,则是采取了流量伪装的办法,将代理流量伪装成websocket流量(也就是浏览网站的流量)以绕过检测。但是流量还可以分析行为特征,比如记录一段时间内的数据包量并建立模型等。这种检测手段对大型的机场节点往往比较有效。但是毕竟记录这个需要消耗很多资源,所以一般情况下防火墙很少用。

对于其他的一些冷门协议,大部分就是无特征协议,也就是说检测不出来你在干嘛。但是仍然可以通过一定的行为特征来实施封锁。由于没有更多详细的资料就不赘述了。

什么是隧道

隧道是当前很流行的一种代理方案,如果说中转是直接把流量转发到境外代理服务器,隧道则是把流量又装在了一个套子里转发给代理服务器。那么这样做有什么优点呢?与直接的中转相比,这样做往往能取得更低的延迟与更优秀的链接体验。由于流量已经被套了一层,所以接入层就可以使用有特征的ss协议。为什么非要用ss呢?因为ss与其他的现代协议相比,运行时消耗的资源要更小,性能也更好,所以也就有着更好的连接体验了。

目前实现隧道的方法主要有 Gost 和 WireGuard 等,经过这些隧道包裹的流量都是无特征的,从而就是不容易被防火墙检测。

总结

不知不觉写了这么多,但其实内容还是很乱,希望能对看到的人有点帮助吧。

参考文章

  1. 网络虚拟化技术(二): TUN/TAP MACVLAN MACVTAP

  2. 浅谈在代理环境中的 DNS 解析行为