上节的话 我们学习了trojan协议和tls协议的原理

详细了解了什么是网站证书 以及如何颁发证书 同时搭建了trojan节点 实现科学上网

本节的话 我们就来学习一个比trojan出现时间更早 也使用更广泛的协议:vmess

在讲解vmess之前 首先要给大家科普一下vmess和v2ray的关系

因为我发现有一些朋友还没有弄清楚二者的区别

之前还有个朋友问我v2ray和trojan哪个好

他们两个根本就不是同一类东西 所以不能拿来进行比较

和之前讲过的shadowsocks trojan一样 vmess也是一个协议

就像我们平时浏览网页最常见的http协议一样

只不过他们的功能是不一样的 http协议主要应用于网站

vmess协议的话 他主要用来代理我们发出的http请求

而v2ray 它是一个网络工具 它原创了并支持vmess协议 同时也支持shadowsocks trojan

vless等代理通讯协议 就像浏览器一样 浏览器它支持http协议

也同时支持websocket的协议 也就是我们常说的ws协议

你可以把v2ray和vmess的关系想象成浏览器和http的关系

v2ray和claesh又是什么关系呢 你可以理解成谷歌浏览器和火狐浏览器的关系

经过上面的科普 我相信大家已经知道了v2ray和vmess之间的关系

所以你现在明白了clash和trojan哪个更好了吗

本节的话我们主要是来讲解vmess协议 不会过多的设计v2ray工具的使用

而像dns和路由这些功能的话 都是v2ray才有的

vmess协议 他本身并没有这些功能 而且这些功能的话一般都在客户端进行设置

和我们节点搭建关系不大 所以说我们不会涉及

如果大家对v2ray工具本身比较感兴趣的话 欢迎在评论区留言反馈

我们作为使用者的话 vmess协议的实现细节并不是我们关注的重点 我们关注的重点是如何去使用它

但是不讲的话 又对vmess协议的一些特性无法有深刻的认识 比如vmess协议为什么和系统时间有关

当我们的电脑系统时间不对的时候 无法连接节点 又比如为什么加密方式可以使用自动选择

按照之前讲shadowsocks 对称加密算法必须让两边存在相同的密钥和加密方式 才能正常的加解密

vmess他是怎么做到的 再比如额外id到底是个啥

针对上面的这些问题的话 所以说我们还是要先来讲解一下vmess协议的通讯过程

希望大家能弄清楚刚才我们说的这几个问题

大家看到这个原理图的话 其实跟我们第三节讲的ss协议是非常类似的

2023-06-06T10:48:09.png

红色的这边的话就是我们的客户端 这边的话就是我们搭建了v2ray的服务器

里面配置了一条vmess的节点 设置了一些参数

同时我们的客户端如果要连接的话也需要有设置这么一些参数

这些参数的话我们可以对照一下这个软件

这个地址的话就是我们这个ip地址 端口的话就是这个8388

用户id的话就是我们的uuid 我们这里是随便给了一个正确的id的话 它应该是这个样子

然后有一个额外ID 这里的话 我们给的是1 等会我们会讲这个东西 然后加密方式的话 它是一个自动类型

传输协议的话就是默认的tcp 假设我们在客户端配置了这么一些参数 当我们在谷歌上搜索内容的时候 比如说

我们搜索了这么一个字符串 已经讲过很多次了 这个数据包的话将会来到这个系统代理

这个系统代理的话是v2ray在监听这个端口

v2ray拿着这个数据之后 根据我们配置的协议类型 我们配置了一个出站节点 是vmess的节点

v2ray会用这里面的配置信息 然后将这个数据封装成vmess协议的数据包

vmess协议呢 他具体干了这么一些事情

和我们之前讲的ss协议有点不太一样 首先他在前面加了这么一块东西 里面写了

它的加密方式 比如说aes 这是因为我们这里用的加密方式是自动 所以说它就会自动选择一种

在这里面自动选择一种 要么是aes 要么是chacha20 假设他选了一种aes

同时也会生成一个随机的密钥 比如说111

有了这个密钥和加密方式之后 就可以对这一串数据进行加密了 这里面还有一些其他的参数 我们就不管

好了 vmess就会用这个密钥和这个加密方式对这一串数据进行加密 这是vmess妹子干的第一件事

做完这一步之后 vmess还会用用户id来对这一串数据进行加密

也就是使用这个111对这一串进行加密

他的加密方式的话是固定的 也就是说和这台服务器商量好了 假设这是加密后的数据

这是第二次加密 还没完 除了这两次加密之后

他还会在头部插入其他数据

这里面插入的数据是我们当前的系统时间的一个时间戳加上用户id组成的这么一个hash字符串

我们先来了解一下什么是时间戳 时间戳的话它是一个

从这个时间点开始计算的这么一个数字 它会一直往上加 每秒加一次

而且这个时间戳的话它跟时区没有关系 也就是说现在

我们和美国取到的时间戳是一样的

这是我们当前的时间说 假设我们渠道的时间说是0000120渠道的这么一个时间戳

然后再加上我们的用户id 我们这里假设就是1111

对这一个字符串进行hash处理 这个hash又是什么呢 它是一个算法

你可以把它理解成一个指纹 对于这个字符串来说唯一的指纹

比如说我们拿到这里去进行加密 把这个字符串放进去 点一下加密

它会计算出 这些都是hash算法 VMESS的话 用的是MD5 也就是这一串

我们复制一下 也就是说这一串字符串经过hash处理之后得到了这么一串md5的数据

这个数据的话 它是不可逆的 也就是说 你不能从这一串数据推断出它的原文

比如我们在这里随便修改一位的话 它就是完全不一样的hash值了

有了这串hash值之后 它就会塞到这个头部里面去 那太长了 我们就截取一小段吧

这就是经过vmess处理后的数据

最后的话 我们将会在头部加上我们的服务器的IP地址 6.6.6.6

这个数据包就会从我们的电脑里面发出来 经过防火墙的时候

2023-06-06T10:51:41.png

防火墙他只知道你要访问这个ip地址 并不知道你要干什么 于是乎 这个数据包放行通过来到这里

来到这里之后 前面的ip头部被删掉 然后这一串数据交给v2ray来处理 v2ray这边设置了一个入站协议

vmess 也就是说 他进来的数据包会使用vmess协议来进行解析

他拿到这个数据之后 他要验证这个是不是一个合法的vmess数据

他是怎么验证的呢 他验证的方式就是对比头部的这一串数据到底是不是合法的

我们刚才也说过了这一串字符串 他是不可逆的

也就是说 你不能通过这一串字符串来算出这个字符串 刚才讲这个时间戳这里的话漏了一点

我们的客户端会在当前的系统时间假设我们的当前系统时间的时间戳是这么一串120

他会在±30秒取一个随机值 也就是可能是90或者是150

他会取这么一个随机值 当做这个数据包发送时候的时间戳

假设他刚好取到的时间戳 就是当前的系统时间戳 相应的这台服务器的系统时间戳也是这个

这是要先补充的一点 现在这个服务器要验证这个数据包的合法性 至于这一段 它是不可逆的

首先 这台服务器的v2ray收到这个vmess的数据包 以后 它会在当前系统的时间戳生成一个大数组

假设它会从-120秒取到+120秒 也就是减去120秒就是000

到正的120秒 也就是240总共的话有240个数据 也就是一直加一加二加三

这样一直加下去 取到这个范围之内所有时间戳的数据

然后在后面加上服务器这边配置的用户id

当然 这个用户id必须和这个客户端的用户id是一模一样的

加到后面去 也是加四个一跟前面一样 聪明的朋友可能已经看出来了

拿到这241个数据之后 他会挨个对其进行hash算法 也就是塞到这里去

第一个数据的hash值是这么一串值

得到这串hash值之后 他会跟这一串进行比较 一比较 发现对不上 于是乎他就会拿第二个hash值

计算 这个第二个hash值又会跟这一串进行对照

发现还是不对 于是乎 他会一直算下去 直到得到这个hash值之后

得到这一串hash值跟这一串进行比较的时候 就会发现你这个数据是合法的

就确定了这个数据是这个用户发来的合法数据

他就会把这个头部去掉 去掉头部之后就会解密这一串数据 这一串数据我们刚才在这边的时候就讲了

他是用这个用户id以一种固定的加密方式进行加密的

我们这边的话就用这个id对这一串数据用固定的方式进行解密 解密之后就是这么一串数据

得到这串数据之后 我们就可以用这种加密方式和这个密钥

对这一串内容进行解密 因为这一串内容的话是用这个加密方式和这个密要进行加密的

这是一个对称加密算法 解密之后将会得到这么一算数据

这个数据的话就是我们在浏览器里面 在谷歌里面搜索的内容

于是乎 这个服务器得到了我们的意图 他就会帮我们去访问谷歌

2023-06-06T10:54:50.png

通过刚才的讲解的话 我相信你已经知道了 为什么vmess他会和系统时间有关

以及为什么它的加密算法可以填写自动

因为如果时间不对的话 也就是说 如果你的系统时间和服务器的时间相差超过了90秒

他们算出来的时间戳就不在一个范围之内 时间戳不在一个范围之内的话 他计算出来的哈些值就不对

所以说他就没办法认证通过 所以说我们客户端的系统时间和服务器的系统时间

不能相差90秒 至于加密方式的话 他是在发送数据的时候才会给你

所以说填写自动的话 这个客户端就会随机选择一种加密方式

我们服务器拿到加密方式和密钥之后 直接解密就可以了 不过我们的用户id两端必须设置一样

才可以正确的解密这一串数据 可以看到vmess协议的话 它还是比较复杂的

还有一个问题是这个额外id又有什么作用 可以看到我们这里的额外id两边数字的是不一样的

我们之前也讲了 假设当前的时间戳是这个

我们的客户端会随机取一个+-30秒的这么一个时间戳

如果我在短时间之内发送了大量的请求的话 比如说 假设我第一次请求使用的是121

第二次请求使用的是125但是我同时发了好多次请求 假设这个随机值不够用了

这两个出现了重复 这两个数据包头部计算出来的hash值是一模一样的

可能会被防火墙探测到一些特征 于是乎引入了这个额外id

这个额外id的作用呢 就是在这个id的基础上

额外的再生成一个id 比如说这个是111在这个基础上 我生成了一个1112

相当于我现在有两个id了 我就可以用这个id来跟这一算数据来进行组合了

就不会出现hash值一样的情况 我们的服务器就要跟着把这

个额外id设置成1或者比1大 因为大是没关系的 就是不能小 为什么大没关系

大家可以思考一下 当我把这个额外id设成二之后

这个用户id就相当有三个id了 比如说有一个1112还有一个1113

这就是vmess协议的基本通讯过程

可以看到他传输的内容其实跟ss节点是差不多的 都是无规则的字节流

但是他的话比ss协议更复杂一点 另外 我们刚才讲了这么多 其实这种方式的话已经被淘汰了

被淘汰的原因是他存在被精准探测的漏洞

因为我们头部的这个数据的话 他在一定时间内他是可以重复使用的

并且 这一串数据的加密方式的话 它并不是使用AEAD 也就是说 这个数据包它可以被重放攻击

比如说 这个数据包从我们的本机里面发到这里

防火墙拿到我们的数据之后 它可以修改这里面的数据内容

然后发动一个重放攻击的数据包到这台服务器

经过篡改后的数据包来到服务器服务器会产生一些不正常的行为

防火墙的话他就通过这个行为来判断你这个服务器里面运行了vmess的节点

所以说防火墙就把你的服务器给强了 发现这个漏洞的人就是我们上一节讲的trojan-go的开发者

要解决这个问题的话 就必须要引入AEAD的加密方式

也就是说 把这一串数据的加密方式改成AEAD的加密方式

防火墙就没办法对这一串数据进行修改了 经过修改后的数据包发到这个v2ray的服器

他是可以知道数据已经被修改了 于是乎会直接丢弃掉这个数据包 同时的话 头部的这个md5的认证方式也取消了

改成了这里解密的话 需要用到的这么一串数据放在这个头部位置 这样一通操作的话就无法向下兼容了

也就是说 你要么用AEAD的加密方式 要么用以前的md5的认证方式

两种方式的话它是不能交换使用的 否则会连接不上

为了让大家能够慢慢的过渡到AEAD阶段 在V4.28.1版本之后

如果说这个额外id等于0的话

则表示你发送的vmess协议里面是使用AEAD的加密方式

如果不是0的话 则表示你使用的是原来的这种MD5的认证方式

并且这种MD5的认证方式在2022年1月1号也就是元旦的时候彻底被淘汰了

也就是到了这个时间点 这个v2ray服务器 它会强制开启AEAD的认证方式

所以说 如果刚好你的服务器额外id

不是0的话 就会导致客户端和服务器无法建立连接的情况

所以说以后我们搭建vmess节能的话 全部都用AEAD的加密方式就行了 也就是说这个额外id给0就行了

原来的这种md5的认证方式已经不推荐

在使用了了解了vmess的基本通讯流程之后 我们就要来实操搭建一个最基础的

vmess+tcp组合的节点了 vps的话我们这边已经准备好了

如果说你还不知道怎么注册vps的话 可以看我第三节的教程内容

首先的话我们要来搭建v2ray 在第三节讲解搭建ss的时候 我们介绍了在仓库直接安装SS

第四节搭建trojan-go的时候 我们介绍了直接下载二进制文件进行运行

这次的话我们就通过一键脚本来进行安装

2023-06-06T10:58:49.png

这个脚本的话 它是官方的安装脚本 所以说我们是信得过的

这种一键脚本的话 你一定要使用信得过的脚本

否则的话里面执行了一些恶意指令你也不知道

我们现在要安装的话 直接选中这一条复制 然后在这里直接粘贴上去

回车就可以了 他就会开始执行脚本里面的内容

其实脚本的话也就是一条一条的命令 他已经安装好了

你要说这个脚本里面干了一些什么 其实我也是不知道的 你就可以打开这个脚本里面 看一下里面有什么内容

当然前提是你有一定的shell脚本基础才能看得懂

其实他闪现这么多东西的话我也是看不懂的 这个时候要看的话 咱就借助翻译工具就可以了

那他说 巴拉巴拉 巴拉巴拉 这里提示我们要运行这个指令

这个指令的话就是设置他开机自启

然后这个指令的话就是启动v2ray的服务 他这里释放了这么一些文件 在这些目录下面

我们先来看一下这个v2ray的一些状态

可以看到他目前是没有启动的 然后也是开机 没有自启

这个时候的话 我们就可以使用命令来启动它 启动之后我们再来查看一下这个状态

可以看到 已经启动成功了 它的启动命令是这个 它加载了一个配置文件 配置文件就是这个

我们可以看一下当前的默认配置文件里面是什么 可以看到它里面就一对括号什么都没有 那肯定是不行的

所以说我们要先进到这个目录里面去

我们先把这个退出进到目录里面去 我们双就打开这个json文件 我们这里的话就要把这个

vmess节点的配置信息给他放进去

这个就是服务端的配置信息 对比这个原理图的话

就是这一块的内容 他监听一个8388的端口 然后协议是vmess 监听IP的话他是四个0

这里没有的话 也就代表他默认监听四个0 然后这里设置了一个id 也就是我们的这个用户id 额外id的话 我们给了个0

表示协议头部使用AEAD加密 确认配置没问题 之后我们点一下保存 这个时候它会自动上传

上传成功之后 我们这里要重启一下 重启下v2ray之后 我们再来查看一下他的状态

他现在是正常运行了 这个时候我们就可以来连接这个节点试一下了 比如 我们打开这个v2rayN

添加一个别名的话 随便给一个就行了 然后地址的话我们就填一下这个ip地址 端口的话就是8388

用户id的话 我们填写要跟服务器填写的一样 额外ID的话就是0其他的都不用改

这个节点已经创建成功了 我们可以尝试测一下真连接 可以看到操作超时

为什么呢 因为我们这个防火墙老是忘记关了 这次我们就直接给它关闭吧

因为我们后面会经常对端口进行一些操作

关闭之后我们的所有的服务都会暴露在公网 那我们再测一下

那这个时候就通了 我们测一下下载速度

可以看到它是有速度的 也就是说这个节点确实是没问题的

这就是最基本的vmess节点搭建方式 这种组合方式和我们第三节讲ss协议的时候一样

传说的数据都是无规则的字节流

这样的话会引起防火墙的注意 所以我们需要和第四节讲trojan一样

引入tls对数据进行加密

这样传输的数据从表面看上去就和https流量一样

加上tls之后 这个网络拓扑其实是没多大变化的

2023-06-06T11:01:14.png

主要是修改了两边都加上了tls 然后加密方式的话改成了zero 为什么要改成zero 我们等会再说

还有这个额外id我们已经改成0了 也就是说 他协议头的加密方式使用AEAD

然后我们这里的ip地址我们改成了域名

对应了tls里面要用到的证书 关于tls 我在上一节讲解trojan的时候已经详细的介绍过了

包括他的证书申请过程 以及他的握手协商流程

这一块的话非常重要 如果说你没看过的话 建议先看一下上一节的教程

这里的话我们就不会再浪费大家的时间去介绍了 首先的话还是一样 我们在谷歌搜索不良林

搜索了这么一个请求 这个请求会发送到这个v2ray 使用vmess协议进行传输

我们先画上vmess式的协议的数据 前面这里的话 它是有一个加密方式的

这里的话我们改成了zero zero的话 也就是说对这一算数据内容不进行加密

因为我们开启tls之后 最后会将整个vmess协议进行加密

如果说我们这里还对这一串数据进行加密的话 那就多了一层加密

效率的话就比较低 所以说我们要改成zero 那有的朋友可能会有疑问

那为什么不使用这个none呢

这个那也是不加密的意思呀 这两个还是有点区别的

这个none的话 他其实会对这个vmess的数据包进行一些校验

虽然说他不会对这一算数据进行加密 但是进行校验的话还是有点影响性能的

这个zero的话 他就是既不加密 也不进行校验 是这里面最快的一种 我们就选择这种就行了

另外 虽然说这一串数据不会进行加密的 但是这一串数据的话还是同样的会进行加密的

这是协议头部分的数据 vmess协议头在任何时候都是进行加密的

这里的加密方式 因为我们这个额外id是0也就是说它这里会使用AEAD的方式进行加密

然后头部的话还会填充一些这里面AEAD用到的 解密需要用到的那个密钥

比如说叫111吧 这一算数据的话 就是经过vmess协议处理后的数据

可以看到数据部分 它是没有进行加密的 现在就直接出去的话

防火墙就直接给你干趴了 这个时候我们套了tls 之后

我们的客户端就会先和这台服务器建立一个tls的连接 然后建立好连接之后就会使用tls对这一串数据进行加密

整个vmess协议都进行了加密 加密后的数据的话前面还会套一个头部

这个头部的话就是我们这个tls里面的证书里面的域名

这个数据将会从我们的客户端发送到网络上面去

防火墙拿到这个数据 一看看上去它就是一个正常的https流量

于是乎放行通过来到这边 这边的服务器拿到数据之后 经过层层的解密 最终会得到

我们的请求 然后他就会帮我们转发数据流量 这就是加了tls之后的通讯流程

也就是传说中的vmess+tcp+tls

怎么让它变成经典的vmess+ws+tls呢

非常的简单 我们只需要将传输协议这个tcp改成ws就可以了 这边也要改

它就变成了vmess+ws+tls我们要注意的是 vmess协议 它只有这些功能

而这些传输协议和传输安全是v2ray的功能

vmess是最原始的状态就是vmess+tcp

然后我们可以使用v2ray这个强大的网络工具

让它变成vmess+tcp+tls

或者把它的传输协议改成ws 它就会变成vmess+ws+tls

协议的话还是原来的这个协议

而具体通过什么协议去承载这个vmess的流量

我们是可以使用v2ray来进行自定义的

这也是v2ray强大的地方 这里的话 我们再来拓展一下承载和伪装的区别

这个图的话我们第一节就讲过了

这个网际层的话主要是有一个ip

传输层的话主要有两个协议 一个是tcp 一个是udp

你应用层下来的数据 要么由tcp来承载 要么由udp来承载

那比如 这里我们的传输协议是tcp 也就是说 tcp来负责承载我们上面的vmess协议

比如说应用层里面 一个协议的数据外面往下面传 传 到

了传输层的时候 是由tcp来承载这个数据 然后再发送到互联网上去的

包括应用层的http协议或者tls协议都是基于tcp

但是当我们的传输安全改成了tls之后 这个承载关系就变了

也就是这个tls承载了vmess的数据

比如说这样子的 tcp又承载了tls的数据

也就是这样子的 然后数据的话再通过网卡出去 同样的

http数据要变成https的话 那就要将数据交给tls来承载

tls又交给tcp来承载 同样的从这里出去

我们可以在这个软件这里面看到 我们的传输协议有这么多种

我们只要记住一点 传输层 它 就只有两个协议 一个是tcp 一个是udp 这些协议的话

要么是基于tcp 要么是基于udp 像这个kcp的话 它就是基于udp

udp的话 它又是一个

不可靠的传输协议 你就是他只管发 不管你到了没有

所以说 如果要可靠的进行传输的话 他就封装了一个kcp 他实现了可靠的传输

也就说在这个udp之上 他又出了个kcp 这个kcp的话 他就可以承载我们的vmess数据

所以说 我们如果把这里改成kcp的话 就是这么样一个样子

然后udp的话 他又从这个网卡出去

我们待会要讲的这个 呃 ws 它是一种什么呢 它是基于tcp的

也就是说 这里有一层ws 当我们这里传输协议改成了ws之后

我们的vmess数据将会交给ws来承载 ws的话又会交给tcp来承载

为什么要加这么一层呢 这个的话 我们待会再讲 当我们配置成vmess+ws+tls之后

它的承载关系就变成了 vmess给ws来承载 ws给tls承载

tls又给tcp承载 最后数据再从这里出去 这是关于这个传输协议的这些

2023-06-06T11:04:41.png

相关的知识 这里给了这么多协议 到底有什么用 到底哪个协议是最快的

这个的话就是为了满足不同人的需求和不同的网络环境 我们正常的话就选择tcp或者ws就可以了

其他的协议的话 你感兴趣的话就可以自行去搜索了解一下

反正他们要么就是基于tcp 要么就是基于udp 不同的是 有的协议可能延迟低一点

有的可能稳定一点 但是他总得牺牲一点 其他的东西 鱼与熊掌不可兼得

最终你会发现基于tcp

然后你的钱多一点就可以解决所有的问题

这是关于承载 什么是伪装呢 伪装的话 他并不会改变你当前的承载结构 他只是在你协议的数据部分

增加一点东西来达到伪装的目的 比如说加个http的头部数据 加到这里面去

让他看上去像http的流量 但实际上它是一个vmess的数据

这个数据也并不是以为http来承载 而是由ws来承载

比如说这里有个伪装类型 这个ws没有伪装 tcp的话 他可以把它伪装成http

也就是我们这个vmess数据 它实际上还是由这个tcp来承载的

但是它可以加入一点http的头部 让它看上去像http的流量伪装是这个意思

如果你选择kcp的话 他是基于udp的 所以说他有一些udp的协议可以进行伪装

接下来 就来配置vmess+tcp+tls的组合

要加上tls的话 我们就首先要有一个网站证书 事先我已经把这个域名做好了

dns解析到了这个ip地址

我们这边可以ping一下 可以看到确实是这个ip地址

具体的申请证书的一些原理的话 我在上一节讲解trojan的时候已经详细的讲解过了

这里的话我们就直接开始申请了

再安装一下这个依赖

然后再添加一个软链接 直接回车 然后再把这个CA机构切换一下 因为我发现那个

zeroSSL下发证书经常会卡住 然后这个时候我们就可以开始申请证书了

可以看到这个还是很快的马上就申请下来了

然后的话 我们要把证书安装到 跟配置文件在同一个目录下面

显示安装成功 当前的这个配置文件下应该会多出两个 一个证书文件 一个是私钥

这个时候我们搭建这种tls的话就要把那个配置文件改一下

主要的话就是增加了这个tls 设置了一下证书的位置 我们复制一下 然后粘贴到这里去 保存

重启一下那个v2ray 看一下状态可以看到这里显示启动失败了

这个时候先不要慌 我也看不懂 所以说我们要翻译一下他这里面说了些一些什么

他说无法读取配置文件

他这个权限不足 没办法加载那个私钥 其实这个问题我是知道怎么解决的

我主要是让大家看到这种情况的话

应该怎么想办法 就是直接把这一段全部翻译一下 看一下

是什么问题 然后再找响应的解决办法就行了

其实我也有很多东西不懂 这也是我解决问题的主要办法

有时候我会在评论区看到随便谷歌搜一下就能解决的小白问题

显然他没有理解我这个系列教程的目的

他其实就是由于这个系统服务的那个配置有点问题

在这个位置我们复制一下 用vim打开 来到这个

user 这里把这一段删掉 你如果不会使用vim的话 你就

在这个地方找到那个路径 打开 删掉它就可以了 那保存之后 我们要重新加载一下

这个时候 我们再重新尝试启动v2ray 再查一下他的状态

还可以看到 现在就已经启动成功了 启动成功之后 我们就可以来把这个改成基于

tls的传输方式 这个地址的话 跟着我们这个拓扑图 把它改成这个域名

那加密方式的话我们改成zero 其他的话就不用管了 点一下确认 这个时候我们在尝试进行连接

可以看到也是可以正常使用的 说如果你想改成vmess+ws+tls的话

也是非常的简单 我们只需要把这个传输协议改成ws

就可以了 相应的服务器这边也要修改 把这个tcp改成ws就可以了

然后保存 当然 我们这里要重启一下

查看一下状态 确定没问题之后 我们就可以来尝试连接 可以看到是没有问题的

这就是vmess+tcp+tls 以及vmess+ws+tls组合的配置方式

但是由于vmess没有像trojan那样认证失败 他就跳转到一个正常的网页来进行伪装的这么一个机制

所以说 如果vmess妹子收到了一个正常的https请求的话 他是无法进行转发的 比如说我们现在

直接访问这个域名的8388端口 使用https的方式

可以看到他返回了一个错误的请求 因为他需要一个ws的请求 而我们使用的是基于tcp的https请求

他只能给我们展示这个页面 没办法把它伪装到一个正常的网站上去

如果防火墙这个时候来探测的话 就会发现你这个网站不正常

于是就把你这个服务器给墙掉了 为了解决这种无法伪装的问题呢 我们必须搭建一个网站来进行伪装

也就是vmess+ws+tls+web的一个组合 搭建网站的工具有非常多 比如有nginx

caddy apache 我们这里的话 就以nginx为例

配合nginx来搭建伪装站点的这么一个效果

2023-06-06T11:08:15.png

可以看到 这个的话是比之前要复杂一点 其实挺像我们上一节讲的搭建trojan的效果

首先的话 我们还是构建了一个

谷歌请求搜索的这么一个数据 vmess的话前面还会加上那个加密方式 也就是zero

不加密 但是这个协议头部分的话 他永远都会使用用户id来对这一串进行加密

这是这个vmess协议 定死了 你改不了 协议前面的话还会再加上一些内容

用于解密这一串数据内容 假设是这个样子 这个是vmess协议的数据

我们的传输协议改成了ws 为什么要改成ws呢 我们待会再说

也就是相当于这个vmess的协议是由ws协议来承载

这一传数据内容ws设置了一个路径/ray 最后的话我们设置了tls

也就是会对这一串数据进行加密 并且前面加上我们的网址

这一串数据将会从我们的本机发往

这个ip地址的443端口这个地址的话 我们解析到了这个ip

这个数据经过防火墙来到443端口

负责监听443端口是这个nginx 这个时候 我们的tls是交给这个nginx来进行处理的

我们的v2ray它是没有配置tls的 也就是这个数据包来到nginx之后

会解密 解密之后是这么一串数据

nginx拿到这一串数据之后 他一看你是ws的数据 这个nginx他是可以解析ws的数据的

同时知道了你要访问的ws的路径是这一个 刚好这台服务器配置了一个路径

访问这个路径的话 他就会把这个数据流量转给本机的8388端口

负责监听8388端口的话是这个v2ray的进程 这个数据就会发送到v2ray这边

v2ray拿到这个数据 之后 他根据传输协议和路径

跟这里对上了 所以提取了里面的vmess协议的数据内容

经过解析之后 他得到了我们的真实意图

这就是传说中的vmess+ws+tls+web

我们现在可以来解释为什么我们需要

将这个传输协议改成ws 因为如果你不改ws的话

那相当于承载这一串数据的话就直接变成了tcp

也就是经过tls解密之后 nginx拿到的是这么一串数据

这一串的话他直接就是vmess协议

那个nginx 他认识vmess协议的数据吗 显然他是不认识的

所以说要处理起来的话就比较麻烦 比较简单的做法就是封装一层

ws协议 这样的话 nginx就可以识别并且帮我们转交流量了

假设这个防火墙他现在要来对你进行主动探测

他发送了一个访问这个网址的一个https的请求 这个nginx拿到这个防火墙的请求之后

于是乎他直接就把这个网站的内容

跟上一节讲的trojan一样 把他的内容直接返回给防火墙 这样就达到了伪装的目的

你也可以直接在服务器上搭建一个网站 进行伪装 或者直接和你现有的网站进行共存

我这里偷懒 就直接反向代理到其他网站 只有当你访问了这个正确的路径之后

他才会把我们的请求数据转交给v2ray 而这个路径的话在tls里面是看不到的

经过了加密 所以说我们可以把这个路径设置的复杂一点

不要让防火墙猜到 这种方案有一个非常大的优势 就是暴露在外层的是这个

这一种伪装的话就比我们上一节讲的trojan要好

因为trojan的话 它是直接来处理这个主动探测的流量

万一他存在某些行为特征的话 还是有可能被探测的风险 而nginx就不一样了

主动探测的流量会交给这个nginx来处理

只要我们这个nginx里面配置的这个和v2ray通信的这个路径没有暴露

它的行为就和世界上千千万万使用nginx搭建网站的行为是一样的

这也是这种组合稳如狗的另一个原因

其实上一节我们讲的这个trojan也能使用这种搭建组合

也就是说 把这个trojan隐藏到后端 外层由这个nginx来进行处理

我们只需要和这个vmess一样 把这个tls交给这个nginx处理就行了

2023-06-06T11:11:13.png

感兴趣的话可以自己试一下 这是一个举一反三的过程

了解了原理之后 我们就来配置

vmess+ws+tls+web组合的节点

首先的话 我们来安装这个 只要这一条命令就可以了

后面可以加个-y代表他自动执行 没有什么需要问我们的 直接回车

安装完成之后呢 我们要编辑下这个配置文件 我们直接在下面这里打开来编辑吧

找到这个nginx.conf 打开之后我们要做的是把这个内容全部

复制到这个http这个大括号以下到这个大括号

也就是说 在这个大括号里面把它全部粘贴上去

这里的话就要改成你的域名包括这里 这里的意思呢 就是

他监听一个443端口 然后如果收到了https的流量的话 他访问的是首页的话 他就会把这个

bing的网站的数据返回给你 那如果你访问的是这个/ray的这个目录的话 就会把请求转发到

本机的10000端口 我们这里改成8388吧

这样便于理解 另外还配置了一个 如果说访问的是80端口的话

它就会跳转到这个https

也就是一个重定向 确认这个这个没问题之后 我们就点一下保存 然后

重新加载一下这个nginx的配置文件

也可以查看一下这个nginx的运行状态

他是正常运行的 我们这个v2ray还要重新配置一下

把这一串配置文件修改一下 可以看到我们这里的话是没有配置那个证书的

因为证书的话交给nginx来处理了 所以说我们这边的数据流量是

可以完全是明文的都没关系 同时我们的监听ip的话就改成了本机

也就是不允许供网来访问我这个8388的端口

确认配置没问题之后 我们点一下保存 然后重新运行一下那个v2ray

查看一下状态 确定没问题之后 我们这边就可以开始进行连接了

这里的话 我们就要开始修改 这个端口的话 我们要改成443

这是nginx监听的端口 其他地方的话就没什么要改的

按照之前配置的zero 然后ws tls 这个时候我们尝试连接

可以看到是不通的

这地方有一个地方忘了应该是/ray

配置好了这个路径之后 我们再重新尝试一下

还可以看到已经通了 那我们尝试测一下数 可以看到确实是没问题的 这个时候

当我们去访问这个网站的时候 他就会把必应的数据给你

我发现有的朋友搭建的vmess节点访问首页之后 还是nginx的默认欢迎页面

显然他没有明白加web的目的是什么 那你甚至可以在里面搜索内容

他都是在这个网址里面搜索 这也是一些镜像站的制作方式

只有当你正确的访问了那个/ray的目录 他才会

显示错误 所以说这个目录的话 不要让别人知道

以上的话就是使用vmess搭建节点的常用方式了

最后我们再来总结一下vmess 他是一个类似ss进行加密代理通讯的协议

配合v2ray 可以将vmess的数据交给各种传输协议进行承载

也可以对数据进行各种伪装

不过我们的主要目的还是稳定的科学上网

目前最稳定的就是vmess+ws+tls+web的这种组合方式

对比上一节讲的trojan自带伪装以及下节要讲的vless自带回落

vmess要做好伪装的话是比较麻烦的

随着时间的推移 目前vmess的位置有点尴尬

如果使用vmess+tcp的方式进行科学上网的话

就会和我们之前ss的时候一样存在被探测的可能

所以目前比较稳定的做法是套一层tls并配置伪装

但是这样的话 又会存在性能问题 我们都知道加了tls之后

协议本身没有必要对数据进行额外加密了

但vmess协议 不管你加没加tls 他都会对头部数据进行加密

虽然说加密的数据量很小

但我们总是喜欢追求极致的性能体验

所以针对这种情况 出现了vless这种轻量级的协议

和trojan一样 他的出生就是为了配合tls 所以不再对协议头部数据进行加密

加密完全交给了tls 再加上回落功能 实现伪装 可以说是非常方便

目前vmess协议的主要优势在于它的生态支持是最好的

各种客户端都适配了vmess协议的各种传输方式

对于机场主而言是一个不错的选择 可以满足使用不同客户端的用户

不过也得忍受vmess多用户计算头部时间戳hash值导致的内存占用过多

对于个人自建使用者而言 会有更好的选择

好了 以上就是本期给大家分享的全部内容

标签: 节点搭建系列

评论已关闭