V2Ray使用Nginx实现WebSocket+TLS+Web代理

由于近期TCP阻断频繁,于是部署基于WebSocket+TLS+Web的v2ray,将代理流量通过TLS加密,以此达到通过V2Ray访问任何网络都显示访问一个HTTPS网站,隐蔽性更高,也更安全。当然,这本来就是完整、真正的TLS流量。另外,这种TLS代理在速度或者说效率上对比TCP并没有什么优势,大家酌情部署!

申请域名和填写DNS记录

首先你要注册一个免费域名,这个可以到Freenom上免费搞一个,不多讲。

域名注册好后,需要添加两条DNS记录,建议使用Cloudflare的DNS解析,如果IP被墙可以使用它的CDN复活,没被墙就不建议使用了,毕竟减速CDN不是白叫的。添加两条DNS解析记录,如果没有v6IP的话,就填一个v4IP,如下:

Name (prefix) Type TTL Target
A 3600 这里填写vps上的v4IP
AAAA 3600 这里填写vps上的v6IP

上面完成后,就开始服务端的配置了。

服务端配置Nginx

安装Nginx

apt-get install nginx

配置Nginx的Server文件

vi /etc/nginx/sites-available/default

修改配置如下:

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
server {
listen 80;
listen [::]:80; //这是IPv4和IPv6的80端口监听
server_name xxxx.com; //域名
// 下面是真正的ws转发给v2ray
location /ray { //与V2Ray配置中的path保持一致
proxy_redirect off;
proxy_pass http://127.0.0.1:10086; //假设WebSocket监听在环回地址的10086端口上
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $http_host;
}
}

server {
listen 443 ssl http2; //这是IPv4和IPv6的443端口监听及ssl和http2支持
listen [::]:443 ssl http2;
server_name xxxx.com; //域名
ssl_certificate /etc/letsencrypt/live/xxxx.com/fullchain.pem; //证书路径,xxxx.xxx改成你的域名
ssl_certificate_key /etc/letsencrypt/live/xxxx.com/privkey.pem;
location /ray { // path路径
proxy_redirect off;
proxy_pass http://127.0.0.1:10086;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $http_host;
// 下面是realip日志,在access.log里面,可留可删除,随意
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}

对于已经用nginx搭建网站的用户,就更简单了,只要在443端口下添加以下ws转发就好了。

1
2
3
4
5
6
7
8
9
// 下面是真正的ws转发给v2ray
location /ray { //与V2Ray配置中的path保持一致
proxy_redirect off;
proxy_pass http://127.0.0.1:10086; //假设WebSocket监听在环回地址的10086端口上
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $http_host;
}

下面是nginx.conf完整配置实例,注意修改域名和证书文件夹名。

vi /etc/nginx/nignx.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
49
50
51
52
53
54
55
56
57
58
59
60
user nginx;
pid /run/nginx.pid;
worker_processes auto;
worker_rlimit_nofile 51200;

events {
worker_connections 1024;
multi_accept on;
use epoll;
}

http {
server_tokens off;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 120s;
keepalive_requests 10000;
types_hash_max_size 2048;
include /etc/nginx/mime.types;

access_log off;
error_log /dev/null;

server {
listen 80;
listen [::]:80;
server_name xxxx.com;

location /ray {
proxy_redirect off;
proxy_pass http://127.0.0.1:10086;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $http_host;
}
}

server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name xxxx.com;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_prefer_server_ciphers on;
ssl_certificate /etc/letsencrypt/live/xxxx.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/xxxx.com/privkey.pem;
location /ray {
proxy_redirect off;
proxy_pass http://127.0.0.1:10086;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
}

如果你只用80端口的话是没必要去申请证书的,配置好v2ray的config.json文件就可以直接用的,当然这就只能是ws代理,不支持tls加密了。443端口需要申请ssl证书,往下看。

申请免费SSL证书

安装certbot

apt install certbot

注: 生成证书前请关闭服务器的Apache或Nginx,否则会生成失败。

certbot certonly --standalone --email 你的邮箱 -d xxxx.com(域名) -d www.xxxx.com

在完成Let’s Encrypt证书的生成之后,我们会在/etc/letsencrypt/live/xxxx.com/域名目录下有4个文件就是生成的密钥证书文件。

1
2
3
4
5
6
7
cert.pem -  used for OCSP stapling in Nginx >=1.3.7.

chain.pem - will break many server configurations, and should not be used without reading further documentation 

fullchain.pem - 在大多数服务器软件中使用的证书文件。

privkey.pem - 证书私钥

在Nginx环境下,那就需要用到fullchain.pemprivkey.pem两个证书文件,在部署Nginx的时候只要将对应的ssl_certificatessl_certificate_key路径设置成生成的2个文件就可以。

打开/etc/nginx/sites-available/default填入如下内容:(上面的nginx的配置文件已经添加进去了)

1
2
ssl_certificate /etc/letsencrypt/live/xxxx.com/fullchain.pem; //xxxx.com是你的域名
ssl_certificate_key /etc/letsencrypt/live/xxxx.com/privkey.pem;

Let’s Encrypt免费SSL证书有效期为90天, 需要我们自己手工更新续期才可以,手工续期如下命令:

1
2
3
4
5
systemctl stop nginx

certbot certonly --renew-by-default --email 你的邮箱 -d xxxx.xxx -d www.xxx.com

systemctl start nginx

看到这里是不是发现,俺在搭建一个完整的https网站,不错,到这一步你只要写一个html静态页面放在根目录下,这个站点就可以通过浏览器正常访问了。闲话不多说,往下看。

V2Ray服务端配置

证书申请好了以后,配置好nginx后,就要安装v2ray和修改服务端的配置文件了。

安装v2ray:

1
2
3
4
5
// 下载脚本
$ wget https://raw.githubusercontent.com/v2fly/fhs-install-v2ray/master/install-release.sh

// 安装v2ray
$ bash install-release.sh

修改v2ray配置如下:

vi /usr/local/etc/v2ray/config.json

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
{
"inbounds": [
{
"port": 10086, //同nginx上的环回地址端口保持一致
"listen":"127.0.0.1", //只监听 127.0.0.1,避免除本机外的机器探测到开放了 10086 端口
"protocol": "vmess",
"settings": {
"clients": [
{
"id": "b831381d-6324-4d53-ad4f-8cda48b30811",
"alterId": 64
}
]
},
"streamSettings": {
"network": "ws",
"wsSettings": {
"path": "/ray" //同nginx上的路径一致
}
}
}
],
"outbounds": [
{
"protocol": "freedom",
"settings": {
"domainStrategy": "UseIP"
}
}
],
"dns": { //开启DoH
"servers": [
"https+local://1.1.1.1/dns-query",
"1.1.1.1",
"8.8.8.8",
"localhost"
]
}
}

systemctl start nginx //启动nginx

systemctl start v2ray //启动v2ray

bash install-release.sh //更新v2ray

bash install-release.sh --remove //移除v2ray

到此就可以开启Nginx和V2Ray了,服务端也就全部完成,下面就是折腾客户端了。另,这些配置文件建议先在本地修改好后再scp到服务端,因为服务端上的vi编写js文件容易遇到缩进问题。

V2Ray客户端设置

首先从V2Ray官网下载软件。

客户端config.json文件配置:

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
{
"inbounds": [
{
"port": 1080,
"listen": "127.0.0.1",
"protocol": "socks",
"sniffing": {
"enabled": true,
"destOverride": ["http", "tls"]
},
"settings": {
"auth": "noauth",
"udp": false
}
}
],
"outbounds": [
{
"protocol": "vmess",
"settings": {
"vnext": [
{
"address": "xxxx.xxx", //域名
"port": 443,
"users": [
{
"id": "b831381d-6324-4d53-ad4f-8cda48b30811",
"alterId": 64
}
]
}
]
},
"streamSettings": {
"network": "ws",
"security": "tls",
"wsSettings": {
"path": "/ray" //路径
}
}
}
]
}

客户端白话配置如下,主要就是选择ws传输协议,填上type路径,还有打开tls传输。

80端口配置,不需要打开tls传输,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
地址(address) : xxxx.xxx	//这里填写你的域名或IP

端口(port) : 80

用户ID(uuid) : 这里填写你的UUID

额外ID(alterid) : 64

加密方式(security) : auto

传输协议(network) : ws

伪装域名(host) : cloudfront.com //可选项

路径(type) : /ray

443端口配置,443端口需要打开底层tls传输,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
地址(address) : xxxx.xxx	//这里填写你的域名或IP

端口(port) : 443

用户ID(uuid) : 这里填写你的UUID

额外ID(alterid) : 64

加密方式(security) : auto

传输协议(network) : ws

伪装域名(host) : cloudfront.com //可选项

路径(type) : /ray

底层传输 :tls

80和443端口都可以使用,到这也就全部完成了。有建站经验的网友应该很容易上手。提醒一下,用之前清理一下浏览器缓存。

参考: