介绍
前面介绍了利用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; # 网站首页文件 }
|
随后在本地客户端只需要配置中添加路径名称即可连接。
封面