VLESS + 多 HTTPS 站点共存,复用 443 端口(更新 v4.27.4 版)

VLESS 是 V2Ray 的一个新型传输协议,有点类似 Trojan ,可以前置监听 443 端口处理 SSL 握手,再 Fallback 回落到其他端口或路径。具体查看项目介绍。

如果有多个 HTTPS 站点,如何配置与 VLESS 共存复用 443 端口?

方法还是用的 Nginx 的 stream_ssl_preread 模块,根据 https 域名中的 sni 进行分流,大概方法如下:


Nginx 配置

由于默认安装的 Nginx 不会构建stream_ssl_preread模块,如果有安装过,请先卸载 Nginx,并手动添加--with-stream_ssl_preread_module参数再编译安装 Nginx,以宝塔面板为例,添加后勾选上点击提交安装。(经测试 Nginx 1.19.2 已默认包含此模块,nginx -V查看已安装的模块)

在主配置文件nginx.confeventshttp之间插入stream_ssl_preread模块,插入后的配置文件示例

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
...
events {
...
}
stream {
map $ssl_preread_server_name $name {
vless.exp.com vless;
1.exp.com https1;
2.exp.com https2;
}
upstream vless {
server 127.0.0.1:350; #vless服务端
}
upstream https1 {
server 127.0.0.1:352; #https网站1端口
}
upstream https2 {
server 127.0.0.1:353; #https网站2端口
}
server {
listen 443 reuseport;
listen [::]:443 reuseport;
proxy_pass $name;
ssl_preread on; #开启 ssl_preread
}
}
http {
...
}

端口 352、端口 353、V2Ray 回落到 351 端口站点的 Nginx 配置文件请自行配置。

V2Ray 回落到 351 端口的站点不用开启 SSL 就可以支持 HTTPS 访问。


编译安装 VLESS 服务端

编译安装支持 VLESS 协议的 V2Ray 最新版。(或者直接到Releases下载发行版本。)

V2Ray 基于 GO 语言,首先安装 GO 环境

1
2
3
4
5
## 下载安装GO编程语言
wget https://golang.org/dl/go1.15.linux-amd64.tar.gz

## 解压至/usr/local/
tar -xf go1.15.linux-amd64.tar.gz -C /usr/local/

/etc/profile中添加 Go 环境变量:

1
2
export GOROOT=/usr/local/go
export PATH=$GOROOT/bin:$PATH

使修改的配置文件立即生效source /etc/profile

检查是否配置成功go version

开始编译安装 V2Ray

1
2
3
4
5
6
7
8
9
10
11
12
13
## 拉取 V2Ray 源代码
go get -insecure -u github.com/v2fly/v2ray-core

## 构建v2ray
cd $(go env GOPATH)/src/github.com/v2fly/v2ray-core/main
env CGO_ENABLED=0 go build -o $HOME/v2ray -ldflags "-s -w"

## 构建v2ray工具v2ctl
cd $(go env GOPATH)/src/github.com/v2fly/v2ray-core/infra/control/main
env CGO_ENABLED=0 go build -o $HOME/v2ctl -tags confonly -ldflags "-s -w"

## 回到用户根目录
cd ~

构建完成会在用户根目录有个v2rayv2ctl的文件

1
2
3
4
5
6
##检查v2ray版本
./v2ray -version

## 显示
V2Ray 4.27.4 (V2Fly, a community-driven edition of V2Ray.) Custom (go1.15 linux/amd64)
A unified platform for anti-censorship.

VLESS 服务端配置

v2rayv2ctl文件移动保存到同一个文件夹下,并新建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
44
45
{
"log": {
"loglevel": "warning"
},
"inbounds": [
{
"port": 350,
"protocol": "vless",
"settings": {
"clients": [
{
"id": "你的UUID",
"level": 0
}
],
"decryption": "none",
"fallbacks": [
{
"dest": 351
}
]
},
"streamSettings": {
"network": "tcp",
"security": "tls",
"tlsSettings": {
"alpn": [
"http/1.1"
],
"certificates": [
{
"certificateFile": "/path/to/fullchain.crt",
"keyFile": "/path/to/private.key"
}
]
}
}
}
],
"outbounds": [
{
"protocol": "freedom"
}
]
}

Fallbacks 的进阶玩法

为回落的网站启用 h2,解决 Nginx 的 h2c 服务不能同时兼容 http/1.1 的问题。

VLESS 配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
{
...
"fallbacks": [
{
"dest": 351
},
{
"alpn": "h2",
"dest": 354
}
]
},
...
"tlsSettings": {
"alpn": [
"h2",
"http/1.1"
],
...
}

回落站点的 Nginx 配置

1
2
3
4
5
6
7
8
server {
listen 351;
listen 354 http2;
server_name vless.exp.com;
index index.php index.html 404.html;
root /www/wwwroot/vless.exp.com;
...
}

VLESS 配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
{
...
"fallbacks": [
{
"dest": 351
},
{
"path": "/yourpath",
"dest": 355
}
]
},
...
}

利用 VLESS 强大的回落分流特性,只需运行一个 V2Ray 程序、一个配置文件,实现 VLESS+TCP+TLS 和 VMess+WebSocket+TLS 共存,且可以同时连接同时工作,WebSocket 也意味着可以套 CDN。

以往 VMess+WebSocket+TLS 需要 Nginx 反向代理,现在 VLESS 可以直接根据 path 回落分流至 VMess 了,效率更高。

配置文件示例

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
61
62
63
64
65
66
67
68
69
{
"log": {
"loglevel": "warning"
},
"inbounds": [
{
"port": 350,
"protocol": "vless",
"settings": {
"clients": [
{
"id": "你的UUID",
"level": 0
}
],
"decryption": "none",
"fallbacks": [
{
"dest": 351
},
{
"path": "/yourpath",
"dest": 355
}
]
},
"streamSettings": {
"network": "tcp",
"security": "tls",
"tlsSettings": {
"alpn": [
"http/1.1"
],
"certificates": [
{
"certificateFile": "/path/to/fullchain.crt",
"keyFile": "/path/to/private.key"
}
]
}
}
},
{
"port": 355,
"listen": "127.0.0.1",
"protocol": "vmess",
"settings": {
"clients": [
{
"id": "你的UUID",
"level": 0,
"alterId": 4
}
]
},
"streamSettings": {
"network": "ws",
"wsSettings": {
"path": "/yourpath 和上面一样"
}
}
}
],
"outbounds": [
{
"protocol": "freedom"
}
]
}

VLESS 也支持 WebSocket,各种GUI客户端支持情况未知,配置文件示例:

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
{
...
{
"port": 355,
"listen": "127.0.0.1",
"protocol": "vless",
"settings": {
"clients": [
{
"id": "你的UUID",
"level": 0
}
],
"decryption": "none"
},
"streamSettings": {
"network": "ws",
"security": "none",
"wsSettings": {
"path": "/yourpath 和上面一样"
}
}
}
...
}

VLESS 的回落,传递给后端的IP是 127.0.0.1,Nginx 的stream_ssl_preread模块也是如此。设置xveracceptProxyProtocol以启用 PROXY protocol,可以让后端接收到的IP为访客真实IP。

Nginx 需要http_realip_module模块支持,nginx -V查看已安装的模块,如果没有此模块需要添加--with-http_realip_module重新编译安装 Nginx。

V2Ray 的 TCP 和 WS 入站均已支持接收 PROXY protocol

VLESS 配置,确保已设置xveracceptProxyProtocol

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
{
...
"fallbacks": [
{
"dest": 351
},
{
"alpn": "h2",
"dest": 354,
"xver": 1
},
{
"path": "/yourpath",
"dest": 355,
"xver": 1
}
]
},
"streamSettings": {
"network": "tcp",
"security": "tls",
"tcpSettings": {
"acceptProxyProtocol": true
},
...

// 如果是 WS

...
"streamSettings": {
"network": "ws",
"security": "none",
"wsSettings": {
"acceptProxyProtocol": true,
"path": "/yourpath"
}
}
...
}

Nginx 配置

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
...
stream {
...
server {
listen 443 reuseport;
listen [::]:443 reuseport;
proxy_pass $name;
ssl_preread on;
proxy_protocol on; ## 开启proxy_protocol
}
}
...
http {
...
server { ## 回落站点配置
listen 351;
listen 354 http2 proxy_protocol;
server_name vless.exp.com;
index index.php index.html 404.html;
root /www/wwwroot/vless.exp.com;

set_real_ip_from 127.0.0.1;
real_ip_header proxy_protocol;
...
}
...
server { ## 其他https站点配置
listen 352 ssl http2 proxy_protocol;
server_name 1.exp.com;
index index.php index.html 404.html;
root /www/wwwroot/1.exp.com;

set_real_ip_from 127.0.0.1;
real_ip_header proxy_protocol;

ssl_certificate /path/to/fullchain.crt;
ssl_certificate_key /path/to/private.key;
...
}
...

启用前和启用后的日志文件对比


运行 VLESS 服务端

使用 pm2 运行和进程守护

1
2
3
4
5
#下载和安装pm2
wget -qO- https://getpm2.com/install.sh | bash

#启动
pm2 start ./v2ray -n v2ray -- -config config.json

pm2 常用命令

1
2
3
4
5
6
7
8
9
pm2 stop v2ray # 停止服务
pm2 status v2ray # 查看状态
pm2 restart v2ray # 重启服务
pm2 show v2ray # 查看服务的参数信息
pm2 log v2ray # 查看服务日志
pm2 ls # 查看已部署的服务列表
pm2 monit # 监控服务状态
pm2 flush # 清理所有日志文件
pm2 update # 更新 pm2 状态

VLESS 客户端配置

在本地安装客户端,如果是从 Linux 启动客户端,可以直接用上面编译好的v2rayv2ctl作为客户端。客户端配置文件示例( VLESS+TCP+TLS )

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
{
"log": {
"loglevel": "warning"
},
"inbounds": [
{
"port": 1083,
"listen": "0.0.0.0",
"protocol": "socks",
"settings": {
"udp": true
}
}
],
"outbounds": [
{
"protocol": "vless",
"settings": {
"vnext": [
{
"address": "vless.exp.com",
"port": 443,
"users": [
{
"id": "你的UUID",
"encryption": "none",
"level": 0
}
]
}
]
},
"streamSettings": {
"network": "tcp",
"security": "tls"
}
}
]
}

其他

  • 注意开启服务端防火墙的 443 和 80 端口,如果有另外的软件限制服务器内部端口之间的访问,请打开相应的端口。
  • 启动不了客户端或者服务端,可能是没有执行权限,chmod +x赋予v2rayv2ctl执行权限。