巧用国外大厂VPN做『出海专线』的那些事
老实说,本文前面偏题的部分太多了,大部分都是在闲扯在我眼中『广义上的VPN』不得不扯那些事,如果感兴趣的,不妨阅读一下。
当然,如果你需要直达标题所指的重点,也就是如何使用大厂的VPN作为虚拟出海专线的落地节点,请空降到『属于自己的海外专线』。
前言
上一篇文章里提到,像这样的的大厂VPN其实并不建议直接用作科学上网,原因很多,简单说来就是,这些服务商的服务器IP大多数都已经被封禁,极大概率无法连接至服务器
当然还有一个重要的原因是,VPN协议并不适合用来翻墙,毕竟它本来的设计用途就不是用来科学上网的,仅仅是注重加密(如果VPN都不安全的话,第一个急的应该是大公司,而不是你),但是并不注重混淆等。在科学上网这个环境下,加密固然重要,但混淆其实比它更重要,毕竟如果你直接把协议特征写在脸上,那么你加密再牛逼也没有任何作用,防火墙一下子就可以把你拦下来。
在08年到11年的这一段时间里,是互联网发展的高峰期,也正好就是VPN科学上网最辉煌的那一段时间。但是,在2023年的今天,用传统VPN协议翻墙的日子已经过去了,正如现在已经没有人用铅来做铅笔一样。而且都一样的是,铅笔的名称得以保存,你说石墨笔人家还不习惯——同样地,VPN的名称也得以保存,人们(尤其是一般人)现在也通常会以VPN来指代加密代理软件
但是,凡事都有例外,注意到上面几段话里面加粗的字了吗?VPN的协议不适合用来科学上网,但是并不代表着VPN的工作方式就也跟着不适合。事实上,现在比较新兴的科学上网工具,比如clash,在PC端都支持tun模式。这玩意说白了,就是在你的电脑上安装一张虚拟网卡,拦截应用程序所用的所有流量,进行混淆加密处理后再送出去。很显然,这种方式的覆盖面是要比传统的设置代理的方式要广的。因此,很多傻瓜式clash订阅转换器都会使用tun模式,为的就是进一步的方便小白用户。
发生这个现象的主要原因是,PC端(包括WINDOWS和linux)的代理设置实际上只是一个君子协定,浏览器大概率会读取它,但是别的软件就不一定了,全看作者的心情(甚至包括浏览器也可以手动设置为不读取这个代理设置)。假如某天作者心情不好,不读取这个设置而直接发送数据包的话,直接设置代理的科学上网软件就失效了。采用虚拟网卡模式工作的科学上网软件就可以完美的避开这个限制。
当然了,凡事都有两面,虚拟网卡模式虽然说方便,但是配置难度也相应的提高了很多,搞不好可能会流量回环,DNS泄露等等,所以设置代理服务器的模式虽然说通用面会窄一点,但是因为配置比较简单,至今仍然占有一席之地。
TUN模式不万能
如果有对科学上网协议稍微了解过一点的读者可能会知道,
包括shadowsocks在内的代理协议,无论说的再底层都好,他也只是一个代理协议,专注于把TCP数据包内的数据抠出来之后,再代理出去,而不是像VPN那样原封不动的把数据包传递过去。
这样做的最直接结果就是,即使你连上了代理软件,即使你用的是TUN/TAP模式,也没办法通过ping命令来测试代理服务器和目标网站的延迟,因为此类代理协议没有任何原生的实现(或者是,现成的实现)去代理ICMP协议。ICMP如此,其他的三层协议(比如IP-50,IPSec加密要用到的协议)自然也没有办法被代理出去了。
与之相反的是,传统的VPN协议并不存在这个问题,毕竟人家最低也要完完整整的模仿整个三层,有一些比较好的,也能做到二层,比如OpenVPN的TAP模式,等等
所以还是那句话,你先别急,让大公司先急(
关于隐私...
大约从十年前开始,科学上网(不知道那时候这个名字出来没有?)就开始逐渐的脱离了『科学』这两个字
起初,网上冒出来了各种公司开设网站或者(早期一点的)直接在淘宝里面出售PPTP/L2TP或者SSH账号,GreenVPN就是这么个例子:
那时候写的VPN是货真价实的VPN,配置的门槛并不在低,要是自己搭建的门槛就更高的,哪有像今天那样这么多一键脚本/一键软件包/安装教程的。
再后期一点,包括到现在都是这样,网上各种打着加速器名义的代理软件纷纷冒出了头。如果身边有那种轻度翻墙的人,比如说某些平时也就上上推特或者ins,看看自己最喜欢的明星更新了没有的人,不妨试着问一下他用的是什么软件,大概率会问出来以下回答:
老王VPN,粒子加速器,银河加速器,蚂蚁加速器,比特VPN,极光VPN,快连VPN,云帆VPN....
你可能会注意到,这个列表里面并没有写出来蓝灯和赛风和VPN Gate,以及某些圆滚滚组织所开发的软件。我的观点是,如果能认识并使用过以上这几个(当然还有类似的)的软件快乐冲浪过的朋友,估计也不会去使用上面的各式『VPN』『加速器』(下面就统一叫加速器了,以表示和传统VPN的区分)了
从客观上来说,这样的加速器确实是起到了方便的作用。毕竟就事实而言,很多此类用户都是对科学上网一窍不通的,此时如果有个软件可以一键连接到服务器,那么确实是非常方便的一件事。
但是如果从另一方面来看,这些加速器的隐私泄露问题其实不容小觑。最简单的,比如记录访问日志等
以及可能存在的李鬼李逵:
严重些的可能有收集客户端信息(比如你的电话号码,真实IP)之类的。这个问题尤其见于在只能使用他提供的客户端的平台上,毕竟他自己的客户端可以随便下料,要么不用,要么全用。
即使是『相对正儿八经』的机场,也有可能难逃此运,毕竟相当一部分小机场的运营商人在墙内,假如一个不小心被请喝茶了,为了将功补过一般都会完整地供出来用户列表和数据库什么的,争取按『认罪态度良好』去判。这样的例子有很多,我就不再赘述了,各位看官可以自行搜索一下。
退一万步来讲,即使是暂时没有发生这样的情况,机场也是有能力记录你的访问日志的。虽然说看不到具体内容,但是完全可以记录你的访问目标:
而且机场为了防止被找麻烦,通常也会做审计,比如屏蔽银行网站(防止涉及金融),屏蔽BT(防止被吃版权),屏蔽圆滚滚,屏蔽目标为25端口的出站(反SPAM)等,老实说,不可否认有些规则是好的,但是有些规则确实是有点棘手了(比如屏蔽银行,付款都付不了)
另外一个相对比较致命的例子是,某些圆滚滚组织开发的软件会屏蔽色情网站,然后这就成为了一个比较棘手的问题(性需求也是需求!)
翻墙之后的翻墙
来思考这么一个问题,翻墙的本质是什么?
很显然,它的本质是通过加密混淆等方式,使数据包对于第三方来说『没办法判断是否应该阻挡』或者『不应该被阻挡』。前者的例子是SS/SSR/V2的裸协议;后者的例子是SSR那一大票的混淆,以及给数据包外面套websocket等行为;两者兼有的例子就是TLS(既能保证不被第三方窃取,又因为是网络中最常见的流量,而受到的关照会少一点)
上一章节中举到的例子,比如各种小厂VPN,圆滚滚组织的软件,以及带有审计规则的机场,他们其实都有一个共同特点:
- 允许你访问绝大多数的网站
- 在黑名单中的网站无法访问
- (可能有)记录访问地址日志
- 监控能力没有GFW那么强
最后一点,其实并不是废话,如果你比GFW还强,那你去当GFW好了。抛开最后一点不谈,这几类软件提供的连接环境,就相当于普通网络中的防火墙环境。所以自然而然的,要绕过这一种审查,只需要用普通的加密或者混淆就可以了,比如HTTP代理,比如ssh代理,比如VPN,随便你选。
专线专不专?
有些所谓的『专线机场』,价格开得特别便宜,用起来似乎也不错。但是每逢大节日以及特殊时期,老是会卡那么一两下,商家给出的原因是因为价格太低,被同行嫉妒了,所以被打了
老实说,这种说法当然是姑妄听之姑妄言之,还有一个更可能的原因是,这根专线实际上并不是真正意义上的专线,只是国内国外两台服务器之间用加密的协议连起来了,就成为了一条加密隧道,然后再在隧道里面跑各种协议而已(隧道具体怎么搭,咕噜咕噜找一下,人见人爱的GOST就是一个例子)
这种隧道的安全性没有问题,隧道内确实也不过墙,同样可以实现跑什么协议都很舒服。但是整条隧道就是在公网的基础上建立的,不可能不过墙,所以到特殊时期该封禁的封禁,该断流的断流,在商家及时更换IP之前,就只能自求多福了。
上面这段话为了照顾连续性写的有些抽象,一会又说过墙,一会又说不过墙的。实际上应该这么理解:
- 隧道本身是在公网环境下建立的,肯定要过墙
- 隧道对里面传输的数据进行了加密
- 因此,里面的数据不管你怎么样,都能成功的翻过去
- 对于这种情况,就可以抽象的看成为,只要经过这条隧道,传输里面的数据就是不过墙的,你以为岁月静好,实际上是有人在为你负重前行
当然,实际上隧道数据不过墙的前提是,隧道本身要能建立,如果隧道落地节点都被墙了,那还何谈建立隧道以及不过墙呢?
不过有一句话说得好,人家能干,我们也能干。现在假设你手头已经有了这样的一份订阅,可以访问谷歌油管什么的了,但是又受制于上面所说的一些限制,那么.....
属于自己的海外专线
前面提到过,大厂VPN不稳定,但是保护隐私没啥问题(人家就是吃这碗饭的,只要不是什么『中资VPN』问题都不大);小厂代理(包括但不限于各种机场,各种小代理软件)适合中国宝宝体质,但是恐怕有隐私问题.....
....想到什么了吗?
本着1+1大于2的精神,我们可以把这两个东西结合起来,用小厂代理过墙,在其中跑大厂的VPN!
(注意,这个已经是高阶玩法了,本文假设你已经有能用的代理环境,熟悉Xray配置文件的格式和修改方法。如果还不会的话.....建议是先学习一下,毕竟技多不压身)
1. 前提
凡事都有前提,在这么做之前,最好先看看自己的机场支不支持:
- 目标端口可以是非80,443
- 支持传输UDP流量
- (建议)不是原版SS协议
第一点,是基本上都满足的,如果满足不了我建议你换个机场
第二点,涉及到VPN本身的一个设计理念,即尽可能避免TCP in TCP情况的出现,因此很多VPN协议在涉及到过NAT的时候都会选择用UDP封装,此时UDP基本上就是『带端口号的IP协议』了
第三点,是唯一一个和第二点相矛盾的地方,因为我们最好是在外层跑TCP。原版SS协议对于UDP流量的代理用的是原生UDP,也就是直接用UDP发UDP,用TCP发TCP。由于实在是不确定GFW对于UDP流量的处理会如何,再加上各地不同的对UDP流量的一刀切QoS,因此最好是采用UDP-over-TCP(UoT)的方式处理UDP流量。支持这么干的有改版SS(现在已经被Sing-Box和Xray支持),Vmess,VLESS等。
此外要注意,对于『底层协议+TLS(+WS什么的,都一样)』的方式,输出的传输层只能是TCP了,因此对于UDP,要么是不支持,要么只能UoT。一大票小机场用的后端是XrayR,基本上就是Xray改,不刻意关闭的话是支持UoT的。当然凡事无绝对,最好还是实测一下
以下的试验环境:
软件:Xray 1.8.4
『小厂代理』:Justmysocks
『大厂VPN』:SurfShark
VPN协议:WireGuard(OpenVPN实在是太慢了)
隧道入口:部署在路由器上,IP是10.0.0.233只是手边有就拿来用了而已,不是打广告,也没有AFF
笔者鼓励读者尝试别的提供商。
实现这个专线有两种方式:
- 分开使用代理软件和WireGuard软件,让WireGuard连接到代理软件暴露的一个隧道转发的入口,开放一个虚拟网卡给该机器的其他软件用(下称端口转发的方式)
- 只用Xray或者Clash等一个软件,让他来处理WireGuard流量和代理协议流量,开放一个代理端口给其它软件用(下称一个软件实现的方式)
特别注意:如果你使用端口转发的方式,上面提到的『隧道入口』(下面要讲)并不建议用安装WireGuard的本机来做。理论上可以是可以,但是这也意味着你需要手动倒腾一下路由表。具体来说是,假设这么个拓扑图:
WireGuard(虚拟网卡) --> 代理软件 --> 机场节点 --> VPN节点
如果议用安装WireGuard的机器来做隧道入口,不手动倒腾路由表的话:WG的流量发给代理软件,代理软件发往机场节点的流量又会被WG捕获,WG的流量发给代理软件....然后就是妥妥的流量回环了
为了简便起见,如果使用方式1来实现,还是分开机器防止这俩软件比较好,实体机或者虚拟机都可以,保证『去往代理节点的流量』要能够直连,而不走VPN就行。 放在软路由上就是个不错的选择**。
2. 获取VPN地址
由于SurfShark的节点地址已经被DNS污染了,所以要么你有无污染的DNS,要么直接输入IP地址。我是推荐后者的,毕竟比较方便,少一个节点也少一个故障的可能性。
进入SurfShark后台,打开手动配置页面,找到WireGuard,找到你需要的节点,可以看到节点的一些信息
先把IP复制一下,然后把配置文件下载下来,分别保存好。
3. 实现
两种实现方式,可以看着趁手的来选
3.1 端口转发的方式
一般的代理软件都是暴露了一个Socks/HTTP代理给其它软件连接,这很好。但是在我们的这个用途里,不妨改成dokodemo-door,名字很高大上,本质上就是端口转发而已,将这个端口收到的所有流量,用代理协议加密混淆后交给远端服务器,再由远端服务器转发到目标服务器。
本例中,不妨假设内网中有个机器(比如你的软路由),IP是10.0.0.233
,上面运行了一个可以正常使用的Xray,原来的配置文件的inbound配置块是这样的
{
"tag":"http-in",
"protocol":"http",
"port":"1081"
},
{
"tag":"socks-in",
"protocol":"socks",
"port":"1080",
"settings":
{
"udp":true,
"ip":"10.0.0.233"
}
}
就在下面依葫芦画瓢添加一个:
{
"port":<LISTEN_PORT>,
"protocol":"dokodemo-door",
"settings":
{
"address":"<REMOTE_IP>",
"port":<REMOTE_PORT>,
"network":"udp",
"timeout":60
}
},
<LISTEN_PORT>
就是监听的入口,不同入口的要不一样,这里就假设是6200端口了<REMOTE_IP>
就是上面记下来的VPN服务器IP,比如图中的138.199.62.24<REMOTE_PORT>
是VPN服务器的端口,在下载下来的配置文件里面就有写的,SurfShark用的是默认的51820端口,照写就是了
如果需要添加更多的入口,依葫芦画瓢继续添加就是了,注意修改LISTEN_PORT,有设置tag的话还要改改tag,你懂的,应该不用多说了
修改完之后保存,重启Xray,此时如果没有报错的话,Xray已经开始监听6200端口收到的UDP流量,加密混淆后通过远端服务器代理,原样转发给设定好的VPN服务器138.199.62.24:51820
了
此时打开下载下来的WireGuard配置文件,找到Peer下面的EndPoint,将他改为10.0.0.233:6200
[Interface]
Address = 10.14.0.2/16
PrivateKey = <insert_your_private_key_here> #这里替换成你自己的私钥,详情请看SurfShark官方教程
DNS = 162.252.172.57, 149.154.159.92
[Peer]
PublicKey = JYHdktdtuM7inbtsxRKSDpnBVTWQ5+QLZ/cWWmf4VRg=
AllowedIPs = 0.0.0.0/0 #SurfShark不支持IPv6,只能用v4了
Endpoint = 10.0.0.233:6200 #在这里改动
保存好,把这个文件导入到你喜欢的WireGuard客户端中,然后按下连接键
恭喜,你已经成功实现了双剑合璧
由于VPN是三层代理,因此此时可以用任何你喜欢的三层协议,比如ping一下Google?
3.2 一个软件实现的方式
方式1最大的优点是全局代理,最大的缺点也是全局代理。如果你懂得配置路由表什么的,自然可以继续折腾下去,实现国内外分流或者其他高级功能,但是这样多少点复杂了。
其他的缺点包括:需要另外的一台机器来运行Xray等代理软件,稍微有点麻烦了。如果你也这么想,不妨试试方式2,也就是用一个软件来实现上面的两个功能:WireGuard客户端+代理客户端。
支持这么干的软件有不少,比如Xray(要求版本1.7.0+,才支持WireGuard出站),比如Clash(需要不开源的Premium版,或者另一个分支Clash.Meta版)等等。这些软件说白了就是把WireGuard节点当作普通的代理节点用,只是不能用来直接过墙,需要配合一下隧道而已
为了演示方便,以下的配置就用笔者日常用的1.15.1版Clash.Meta,配合Clash-Veger这个GUI界面来用了。Xray的配置方法请参考文档,使用proxySettings
或者像是方式一那样的dokodemo-door都可以
Clash对于这种『链式代理』的实现有三种方式:
- proxy-groups配置项中的一个type为relay的组
- proxies配置项中一个dialer-proxy为前置代理(隧道入口)的代理
- tunnels配置项中设定隧道端口转发(类似方式一的dokodemo-door)
第一种是不支持UDP流量的,直接过掉。用第二种或者第三种都可以,我这里就用第三种了,毕竟地址排在一起写起来很爽
打开Clash.Meta配置文件,在和proxies同级的地方加入:
tunnels:
- udp,127.0.0.1:<LISTEN_PORT>,<REMOTE_IP>:<REMOTE_PORT>,前置代理
『前置代理』是你之前能正常使用的一个代理节点或者节点组,注意修改成你实际的名字,不要傻乎乎照抄。<LISTEN_PORT>
之类的和上面的意思是一样的
同样的,如果需要添加更多VPN落地节点,按照yaml的语法规则复制粘贴改端口就是了
写完之后往下拉,在proxies块里面添加同样数量的WireGuard节点,记得修改参数,具体的参数请参考从VPN网站下载下来的配置文件的内容,不要照抄下面的内容
- name: 起一个直观点的名字
server: 127.0.0.1
port: <LISTEN_PORT>
type: wireguard
ip: 10.14.0.2
mtu: 1300
remote-dns-resolve: true
dns: [162.252.172.57,149.154.159.92]
private-key: <YOUR_PRIVATE_KEY>
public-key: JYHdktdtuM7inbtsxRKSDpnBVTWQ5+QLZ/cWWmf4VRg=
udp: true
<LISTEN_PORT>
还是上面设定的那个
写好之后,继续拉,找Proxy-group,添加一个块,以方便切换节点
- name: 你喜欢的这个组的名字
type: select
proxies:
- 填写刚刚加的WireGuard代理的名字
- 如果有多个,照写就是了
写好之后保存,在Clash-Veger中刷新一下配置,可以看到我们刚刚加进去的节点信息:
测一下延迟,有延迟就能用了,就当成普通的代理节点去用就好
当然这个时候就没办法用ping命令了,因为这么做的话单纯是把WireGuard作为代理节点用,只能代理TCP/UDP流量了。不过好处自然就是你可以通过修改Clash配置文件实现URL分流什么的,更加方便了
总结
啰啰嗦嗦写了一大堆,看起来很复杂,其实万变不离其宗,懂得原理之后可以根据自己的需要来修改配置,实现安全又快速地上网
先写到这里吧,有不明白的地方欢迎留言
累得要死,我最好去喝杯咖啡什么的....
(全文完)
感謝分享,期待您分享更多優秀的翻牆技術!
可以给一个完整的例子吗,弄了两天了没连接上
抱歉,我也很久没用这个方法,文件也丢了
但是核心思想是:(1)通过加密代理软件创建一个端口转发(加密隧道),可以监听一个TCP/UDP端口然后把数据加密之后扔给远端。(2)VPN软件不直连原来的服务器,而是连接本机或者局域网内的开了加密隧道的机器(注意防止流量回环),让他加密数据后再发送
对于第一点的话,可以看看Xray/V2Fly软件的官方文档中关于dokodemo-door入站协议的介绍
proxy-providers:
jichang-dingyue1: #名称,默认即可
type: file
path: xxx #机场订阅文件下载后的文件名及文件地址,默认即可
health-check:
enable: true
interval: 600
url: https://www.gstatic.com/generate_204
proxies:
- name: WARP
type: wireguard
server: hk-hkg.prod.surfshark.com
port: 51820
ip: 192.168.2.158 #本地ipv4
private-key: xxx
public-key: xxx
udp: true
reserved: [0,0,0]
remote-dns-resolve: true
dns: [ 1.1.1.1, 8.8.8.8 ]
dialer-proxy: "前置节点"
proxy-groups:
# 这个名字为前置节点的策略组可以选择是用自建节点还是机场节点作为前置节点
- name: 节点选择
type: select
proxies:
- WARP #给机场套warp之后的节点
- 机场负载均衡 #机场节点的负载均衡,下同
- 机场自动选择
- 机场手动选择
- name: 前置节点
type: select
proxies:
- 机场负载均衡 #机场节点的负载均衡,下同
- 机场自动选择
- 机场手动选择
- name: 机场负载均衡
type: load-balance #负载均衡
use:
- jichang-dingyue1
url: 'http://www.gstatic.com/generate_204'
interval: 300
#lazy: true
#disable-udp: true
strategy: round-robin #作为前置节点⽤这个⽐较好
- name: 机场自动选择
type: url-test #选出延迟最低的机场节点
use:
- jichang-dingyue1 #proxy-providers中的名字,默认即可
url: "http://www.gstatic.com/generate_204"
interval: 300
tolerance: 50
- name: 机场手动选择
type: select #手动选择
use:
- jichang-dingyue1
能帮忙看看吗,我正在使用第二种方法(clash-verge),通过dialer-proxy的方式尝试前置代理,但是这样子做没有网络
YAML对于缩进有要求,可以看看缩进有没有影响
此外的话,不确定你是不是用WARP,据说WARP会在某些地方使用reserved参数作为routing_id什么的(他自己私有的一个实现),这个可能也是原因
其次的话,dialer-proxy的方法似乎也是有些毛病的,可以试试Tunnel?
Tunnels也不行,搞了一周了,大佬哪天有空可以再试试这个东西吗(代理没有问题已经使用netcat成功转发了51820端口的udp数据)
最近有在写相关内容,兴许可以作为参考
proxies: 中日本亚马逊 节点是可以连接的,现在通过这个节点连接一个socks5,但根本没起作用啊,s5依然连接不上,有解不??dialer-proxy还有什么地方要设置?
- {name: s5, server: 45.8.85.71, port: 50101, type: socks5, username: *******, password: *******, udp: true, dialer-proxy: 日本亚马逊}
大哥你账号密码露出来了,我先给你打码了
看你的设置问题不大,理论上可以直接用。不过你说连不上,可能有这几个原因:
1. 你的前置代理封了非80/443的端口(部分机场会这么干的)
2. 你的Socks5服务器有问题(反正我看到这条评论时,服务器是没有反应的)
1. 你的前置代理封了非80/443的端口(部分机场会这么干的)
就是这个原因,之前发的账号信息是修改后的,并不是真实的,所以你那边连接不上。可否给我邮箱发个信,我这边跨境电商的,现在还有个问题,webrtc检测到local ip 192.168.8.240和ipv6地址,泄露了,这样社交app还是可以检测到本地ip地址,试了很多方法也没法隐藏,可否抽空帮忙看看。红包奉上。
想请教下大佬。假设机场的速度只能跑1mbps,大厂wireguard能跑100mbps。如果用文中clash的实现方式,速度的峰值取决于快者还是慢者?理论上科学上网速度是1mbps还是100mbps?
根据短板效应来说,是1Mbps
大佬这文章信息密度很高.
正是我最近想搞的,我得逐字逐句研读研究.