Vmess搭建教程

介绍

前面介绍了利用Trojan进行搭建,本文采用Vmess实现搭建。

vmess原理

本地v2rayN客户端配置vmess服务器,需要确定:

  • 服务器ip地址
  • 端口
  • 用户id(直接生成)
  • 额外id(默认为0):在原id基础上,多生成id的数量,0表示启用AEAD
  • 加密方式
  • 传输协议

在服务器端的v2ray上需要确定:

  • 监听ip
  • 端口
  • 用户id(与本地相同)
  • 额外id
  • 传输协议

当本地在google上进行搜索的时候,通过系统代理将请求发送到v2rayN客户端,它会自动确定一种加密方式(aes)将搜索请求进行加密,并将加密方式(aes)和密钥加在头部。

随后,vmess会用用户id对加密方式和密钥进行加密,并在头部插入其他数据(为当前时间戳正负30秒范围内的随机值+用户id组成的hash字符串),最后在头部加上目标的ip地址后进行传输。

服务器端的vmess收到数据后,通过不同时间戳生成许多hash字符串验证头部的hash字符串是否合法,合法后,利用用户id进行解密,得到加密方式和密钥。

最后用加密方式和密钥进行解密得到请求。

但是它存在被精确探测的漏洞,一段时间内头部是可以一样的,通过重放攻击可以检测到服务器端运行了vmess。

为了防止用用户id进行加密的部分被篡改,因此将额外id改为0后默认采用AEAD加密

搭建Vmess+tcp

安装v2ray:

1
bash <(curl -L https://raw.githubusercontent.com/v2fly/fhs-install-v2ray/master/install-release.sh)

安装完后,找到配置文件目录/usr/local/etc/v2ray,在配置文件加入:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
{
"inbounds": [
{
"port": 8388,
"protocol": "vmess",
"settings": {
"clients": [
{
"id": "自动生成",
"alterId": 0
}
]
}
}
],
"outbounds": [
{
"protocol": "freedom",
"settings": {}
}
]
}

配置完成后启动v2ray,设定好防火墙即可连接。

搭建Vmess+tls

连接过程

由于tls可以直接全部进行加密,因此可以直接在搜索请求前面的加密方法和密钥改成zero即不需要加密。

但是由于额外id为0,因此这个zero也会被AEAD加密,头部再加上用与AEAD解密的密钥。

当本地与服务器进行tls连接,那么数据就会全部进行加密并且在头部加上证书中的域名。随后就可以传输到服务器并进行解密。

总结来说就是数据在应用层通过vmess协议进行加密后,在应用层通过tls进行承载(tls之前也可以加上ws承载),随后在传输层通过tcp传输。

搭建Vmess+tcp(ws)+tls

申请证书:

1
2
3
4
5
6
7
8
9
10
11
12
#安装acme:
curl https://get.acme.sh | sh
#安装socat:
apt install socat
#添加软链接:
ln -s /root/.acme.sh/acme.sh /usr/local/bin/acme.sh
#切换CA机构:
acme.sh --set-default-ca --server letsencrypt
#申请证书:
acme.sh --issue -d 替换为你的域名 --standalone -k ec-256
#安装证书:
acme.sh --installcert -d 替换为你的域名 --ecc --key-file /usr/local/etc/v2ray/server.key --fullchain-file /usr/local/etc/v2ray/server.crt

修改配置文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
{
"inbounds": [
{
"port": 8388,
"protocol": "vmess",
"settings": {
"clients": [
{
"id": "自动生成",
"alterId": 0
}
]
},
"streamSettings": {
"network": "tcp",
"security": "tls(可以改为ws)",
"tlsSettings": {
"certificates": [
{
"certificateFile": "/usr/local/etc/v2ray/server.crt",
"keyFile": "/usr/local/etc/v2ray/server.key"
}
]
}
}
}
],
"outbounds": [
{
"protocol": "freedom",
"settings": {}
}
]
}

出现报错,可以执行vim /etc/systemd/system/v2ray.service
删除其中的User=nobody

随后重新启动v2ray:

1
2
systemctl daemon-reload 
systemctl restart v2ray.service

启动完成后,在本地客户端v2rayN,将加密方式改成Zero并且启动tls之后即可使用。

搭建Vmess+ws+tls+web

在前面的基础上,在本地客户端增加传输路径,修改协议为ws。

在服务器端上,搭建ngnix监听端口443,当访问到路径时,会将数据传给本服务器的8388端口,此时8388端口有v2ray进行监听,上面执行vmess进行解密。

首先修改v2ray配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
{
"inbounds": [
{
"port": 8388,
"listen":"127.0.0.1",
"protocol": "vmess",
"settings": {
"clients": [
{
"id": "生成的id",
"alterId": 0
}
]
},
"streamSettings": {
"network": "ws",
"wsSettings": {
"path": "/ray"
}
}
}
],
"outbounds": [
{
"protocol": "freedom",
"settings": {}
}
]
}

接着下载Nginx:

1
2
3
4
#安装nginx:
apt install nginx
#重新加载nginx配置:
systemctl reload nginx.service

随后修改Nginx配置:

1
vim /etc/nginx/nginx.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
server {
listen 443 ssl;
listen [::]:443 ssl;

server_name your_servername; #你的域名
ssl_certificate /usr/local/etc/v2ray/server.crt;
ssl_certificate_key /usr/local/etc/v2ray/server.key;
ssl_session_timeout 1d;
ssl_session_cache shared:MozSSL:10m;
ssl_session_tickets off;

ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
ssl_prefer_server_ciphers off;

location / {
proxy_pass https://www.bing.com; #伪装网址
proxy_ssl_server_name on;
proxy_redirect off;
sub_filter_once off;
sub_filter "www.bing.com" $server_name;
proxy_set_header Host "www.bing.com";
proxy_set_header Referer $http_referer;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header User-Agent $http_user_agent;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto https;
proxy_set_header Accept-Encoding "";
proxy_set_header Accept-Language "zh-CN";
}

location /ray {
proxy_redirect off;
proxy_pass http://127.0.0.1:8388;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}

server {
listen 80;
server_name your_servername; #你的域名
rewrite ^(.*)$ https://${server_name}$1 permanent;
}

其中path在v2ray和Ngnix上要统一。

伪装网址也可以改成自己的网页,设置成:

1
2
3
4
location / {
root /var/www/html; # 你的网站文件目录
index index.html; # 网站首页文件
}

随后在本地客户端只需要配置中添加路径名称即可连接。

封面

封面