使用TLS+WS方式的V2Ray简单搭建说明:一个目前较为稳定的科学上网方式




根据 V2Ray 官方网站 的介绍,V2Ray 是一个可以打造专属的基础通信网络的工具集合,功能很强大,是目前主流的科学上网工具之一。

前言

关于 V2Ray 就不做过多说明,在此就简单说一下这些工具的发展流程,可以了解一下 V2Ray 会成为主流工具的原因。

以前的墙只能通过解析传输的数据内容进行判断,如果发现流量请求的内容包含黑名单网站,则会被墙,SS 使用加密混淆的方式进行代理,让墙解析不到内容,这在前期墙还不高的时候很有用,因为解析不出来就理所当然没法判断是否该墙了。

但是随着 SS 使用人数上升,这种被加密的数据包越来越多,无法解析情况越来越明显,于是墙改变了判断标准,无法解析的就干扰,同时加大解密力度,所以那段时间的使用感受就是:刚搭建好还能用,但是很慢,过几天就挂了。

后来 SSR 出现了,在 SS 的基础上加上了混淆,也就是不单对数据包加密,还伪装成其他的数据流量,例如伪装成访问普通网站 / 微信视频通话的流量,这种伪装见效明显,解决了加密数据包目标太明显的问题,但是依靠简单伪装终究不是真正解决问题的办法。

而 V2Ray 在伪装可以做得比 SS/SSR 更好,因为 V2Ray 可以直接使用 web 服务器作为前置代理(现在ss/ssr其实也支持此功能了),如果墙发现了这个访问境外网站的数据包,然后按照普通网址的方式溯源,就会访问到作为障眼法的虚假网站,或者直接得到 404 网页(这一点取决于有没有设置网站目录) ,同时数据包经过 https 加密,又无法将数据内容解密 (准确的说是就算解密一个数据包都需要耗费大量的资源) ,所以就无法判断这个用户是否在翻墙,而且这些流量看起来就像在访问正常网站一样,所以墙的成本变高了,稳定性就提升了。

不过,道高一尺魔高一丈,之前就有人提出过要实行白名单制,也就是说现在是指定了一些网站不能访问(Google、Facebook等),要改成只能访问官方指定的外网(如指定只能访问微软的网站),如果这样的话,这种用nginx作为前置代理的方式又会无法使用了。

目前来说 V2Ray 确实最稳定的,我个人已经用了两年时间没挂过。 (甚至在墙加强时期因为被墙的人变多,网速还因为带宽没那么拥堵而变快了)

其实 V2Ray 这么稳定,也有一个不算原因的原因,那就是因为部署难度较大,不是安装上去就可以完事了,还需要一系列较为复杂的配置,所以用的人相对较少,被关注的也少,也间接降低了被墙的概率。

而也正是因为配置多样复杂,所以本文也无法面面俱到,只是挑其中较为推崇也是最稳定的一种方式:TLS+WS 进行说明,至于其他很实用的限速、路由表等功能不是刚入门就能搞懂的,就不多做说明了。

准备

在安装 V2Ray 之前需要简单做些环境准备,保证安装完后可以跑起来,没有特殊说明的情况下,以下命令均在 root 权限下运行。

关闭防火墙

防火墙可用来减少网络侵入的风险,不过规则设置复杂,许多人都不愿过多了解,所以以下提供直接禁用的方法,但还是建议学习防火墙的使用。

不同的 Linux 发行版的防火墙可能不一样,Debian/Ubuntu 的防火墙是 ufw

1
ufw disable

如果是 CentOS ,则是 firewalld

1
2
systemctl stop firewalld
systemctl disable firewalld

关闭selinux

CentOS、RedHat、Fedora一般都会默认安装 SELinux ,Debian 默认不安装,而 SELinux 配置起来比防火墙更麻烦,如果只是简单使用一些服务,能够使用好防火墙就足够了,SELinux 可以直接关掉:

1
2
setenforce 0
sed -ri 's/.*(SELINUX).*/\1=disabled/' /etc/selinux/config

根据服务商不同,除了这些之外可能还需要其他的设置,这些设置就需要自己去查了。

域名

使用 TLS 加密方式需要用到域名,域名的投入不需要太大,如果原本就有网站域名,那么可以直接使用,如果没有,需要另行购买,挑最便宜的下手即可。

我目前使用的是 NameCheap,可以找到相对便宜的域名。搜索域名之后可以点击 Exlpore More ,然后选择 $2 or less 就可以看到不少很便宜的域名 (以前还是 $1 or less,最近才涨价的)

$2 or less

低价域名

不推荐使用 freenom 的免费域名,问题太多,用没几天突然被收回的帖子也是一搜一大把,而只要花了钱,基本上 10 块钱左右可以安心用一年,还是不要贪图便宜的好。

如果域名一年到期了,续费就需要 $10+ 了,只是用来挂代理的话没有必要续费,到期前重新低价买个新的即可。

域名购买完成后需要添加 A 记录解析。

时间校准

V2Ray 数据包的加密用到了当前时间,所以需要确保服务端和客户端的时间同步,否则连接上也无法认证成功

1
ntpdate 1.pool.ntp.org

开启 BBR(可选)

BBR 可以优化 V2Ray 的网络传输,也就是可以提高网速,在 Linux 4.9 以上,BBR 已经默认集成在内核中了,所以只要保证内核在 4.9 以上即可直接启用,可以使用以下命令查看内核版本:

1
uname -r
升级内核

如果内核版本较低,则需要升级内核,一般 debian 10 以上已经满足条件,而 CentOS 使用的是 3.x 版本,则需要另外升级内核:

1
2
3
rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm
yum --enablerepo=elrepo-kernel install kernel-ml -y

然后启用内核

1
2
3
4
5
6
7
sudo egrep ^menuentry /etc/grub2.cfg | cut -f 2 -d \'

# 例如最新内核是第一个
sudo grub2-set-default 0

# 重启生效
reboot

更多说明可见 CentOS加入BBR内核模块,极大提高服务器网络速度 | 温锦瑜的博客

启用 BBR

1
2
3
echo 'net.core.default_qdisc=fq' | sudo tee -a /etc/sysctl.conf
echo 'net.ipv4.tcp_congestion_control=bbr' | sudo tee -a /etc/sysctl.conf
sudo sysctl -p

服务端部署

实际上 V2Ray 不区分服务端和客户端,如果两端都是使用 Linux,则可以使用同样的方法安装,只不过配置文件有所不同。

需要说明的是,原本的 v2ay/v2ray-core 项目的作者已经停更很长时间了,目前由社区的 v2ly/v2ray-core 继续更新,可以说是原有项目的延续,不过习惯上还是称为 V2Ray。

V2Ray 可以使用多种方式配置,具体可参见 Project V 官方网站 (已被墙) ,比较流行的方式包括:

  1. TCP
  2. mKCP (最快)
  3. WS+TLS (最稳定)

实际可用的方式不止这些,其中的 mKCP 速度较快,不过是需要消耗更多的冗余流量来保证速度,而 WS+TLS 的方式是最稳定的,不过在速度上会慢一些,以下只以 WS+TLS 方式作为举例。

思路

WS+TLS 方式较为复杂,概括来讲就是使用 Nginx 作为前置代理,如果有代理请求,则将流量转发给 V2Ray,访问流程大体如下:

请求Nginx (443)Nginx (WS路径)Nginx (42348)V2Ray (42348)V2Ray (用户验证)

其中,括号内的数字为端口号。所以,虽然 V2Ray 中设置的代理端口为 42348,但实际上在客户端需要填写的端口号是 443,因为需要先访问 Nginx。

V2Ray 配置

可通过一键脚本安装:

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

将安装以下文件:

文件 说明
/usr/local/bin/v2ray 主程序
/usr/local/bin/v2ctl 辅助工具
/usr/local/share/v2ray/geoip.dat 路由规则文件,以IP为准
/usr/local/share/v2ray/geosite.dat 路由规则文件,以域名为准
/usr/local/etc/v2ray/config.json 配置文件
/var/log/v2ray/access.log 访问日志
/var/log/v2ray/error.log 错误日志
/etc/systemd/system/v2ray.service systemd守护进程,以nobody权限运行
/etc/systemd/system/v2ray@.service systemd守护进程,可自定义运行用户

V2Ray 的配置文件位于 /usr/local/etc/v2ray/config.json (旧版位于 /etc/v2ray/config.json )

1
vim /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
{
"inbounds": [
{
"listen": "127.0.0.1",
"port": 42348,
"protocol": "vmess",
"tag": "proxy",
"settings": {
"clients": [
{"id": "用户ID", "email": "邮箱", "level": 0, "alterId": 64},
{"id": "用户ID", "email": "邮箱", "level": 0, "alterId": 64}
]
},
"streamSettings": {
"network": "ws",
"wsSettings": {
"path": "/路径"
}
}
}
],

"outbounds": [{
"protocol": "freedom",
"settings": {}
}],

"log": {
"access": "/var/log/v2ray/access.log",
"error": "/var/log/v2ray/error.log",
"loglevel": "warning"
}
}

需要更改的有3处地方:

注意

如果需要添加 2 个以上用户,则要在用户配置项后面加上逗号,但最后一个不加,即:

1
2
{"id": "用户ID", "email": "邮箱", "level": 0, "alterId": 64},
{"id": "用户ID", "email": "邮箱", "level": 0, "alterId": 64} <- 注意这里没有逗号

更改完成后重启 V2Ray 即可:

1
2
systemctl restart v2ray
systemctl enable v2ray

获取 SSL 证书

使用 TLS 需要用到 SSL 证书,这个需要自己获取,可以通过 Let`s encrypt 获取:

安装

1
2
3
4
5
# CentOS
yum install letsencrypt python2-certbot-nginx

# Ubuntu 或者 Debian
apt-get install letsencrypt python3-certbot-nginx

获取证书

1
letsencrypt certonly --standalone --email 邮箱 -d 域名

续期可以添加自动任务:

1
2
touch /var/spool/cron/crontabs/root
echo "0 5 * * 6 /usr/bin/certbot --nginx renew" >> /var/spool/cron/crontabs/root

Nginx 配置

Nginx 通过源安装即可,没有版本要求:

1
2
3
4
5
# Debian/Ubuntu
apt-get install nginx

# CentOS
yum install nginx

安装完成后,添加一个配置文件:

1
vim /etc/nginx/conf.d/v2ray.conf

内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
server {
listen 443 ssl;
ssl on;
server_name 域名;
ssl_certificate /etc/letsencrypt/live/域名/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/域名/privkey.pem;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers HIGH:!aNULL:!MD5;

location /PATH {
proxy_redirect off;
proxy_pass http://127.0.0.1:42348;
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;
}

access_log /var/log/nginx-v2ray-access.log;
error_log /var/log/nginx-v2ray-error.log;
}

然后新建日志文件:

1
2
3
4
touch /var/log/nginx-v2ray-access.log;
touch /var/log/nginx-v2ray-error.log;
chown nginx:nginx /var/log/nginx-v2ray-access.log;
chown nginx:nginx /var/log/nginx-v2ray-error.log;

添加完成后即可启动 Nginx

1
2
systemctl start nginx
systemctl enable nginx

没有问题的话,这个节点现在就可以用了。

客户端配置

可用的客户端不少,可以参考官网列出的内容。

我目前在用 V2RayNG (安卓) + 原版 (Linux) + V2RayN (Windows)

客户端填写内容大同小异,基本包含以下几项,照着配置填就行了:

项目 内容
名称 随意
地址 上面使用的域名
端口 443
用户ID 上面生成的UUID
额外ID 64
加密方式 none
传输协议 ws
伪装类型 none
伪装域名
路径 上面所填路径
底层传输安全 tls
允许不安全连接 false
Linux 使用原版客户端

如果是 Linux 平台,可以考虑使用原版客户端,安装和服务端一样:

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

然后更改配置文件

1
vim /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
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
70
71
72
73
74
75
76
77
78
79
{
"inbounds": [{
"port": 10800,
"listen": "127.0.0.1",
"protocol": "socks",
"sniffing": {
"enabled": true,
"destOverride": ["http", "tls"]
},
"settings": {
"auth": "noauth",
"udp": false
}
}],

"inboundDetour": [
{
"port": 10801,
"listen": "127.0.0.1",
"protocol": "http",
"settings": {
"timeout": 0
}
}],

"outbounds":
[
{
"protocol": "vmess",
"settings": {
"network": "tcp,udp",
"vnext": [{
"address": "域名",
"port": 443,
"users": [{
"id": "用户ID", "level": 0, "alterId": 64, "security": "none"
}]
}]
},
"streamSettings": {
"network": "ws",
"security": "tls",
"wsSettings": {
"path": "/路径"
},
"tlsSettings": {
"serverName": "",
"allowInsecure": true
}
}
},{
"protocol": "freedom",
"settings": {},
"tag": "direct"
}
],

"routing": {
"domainStrategy": "IPOnDemand",
"rules": [{
"type": "field",
"outboundTag": "direct",
"domain": ["geosite:cn"]
},{
"type": "field",
"outboundTag": "direct",
"ip": [
"geoip:cn",
"geoip:private"
]
}
]
},
"log": {
"access": "/var/log/v2ray-access.log",
"error": "/var/log/v2ray-error.log",
"loglevel": "warning"
}
}

添加日志文件,否则启动会报错

1
2
3
4
touch /var/log/v2ray-access.log
touch /var/log/v2ray-error.log
chown nobody:nogroup /var/log/v2ray-access.log
chown nobody:nogroup /var/log/v2ray-error.log

然后重启并添加自启动

1
2
systemctl start v2ray
systemctl enable v2ray

此时使用的 SOCKS5 端口为 10800,HTTP 端口为 10801

对接 SSRPanel

之前写过一篇文章:ssrpanel:搭建shadowsocksr流量监控和用户管理面板 | 温锦瑜的博客 ,讲了如何使用前端面板 SSRPanel 管理 SSR/V2Ray 节点,不少人对如何对接 SSRPanel 不理解,所以这里添加一节说明。

如果只需要使用 V2Ray,而不用 SS/SSR 的话,可以直接使用针对 V2Ray 的面板:v2ray-web-manager

要对接 SSRPanel,需要先安装 v2ray-poseidon 插件:

1
curl -L -s https://raw.githubusercontent.com/ColetteContreras/v2ray-poseidon/master/install-release.sh | sudo bash

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
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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
{
"inbounds": [
{
"listen": "127.0.0.1",
"port": 42348,
"protocol": "vmess",
"tag": "proxy",
"settings": {
"clients": [
{"id": "用户ID", "email": "邮箱", "level": 0, "alterId": 64}
]
},
"streamSettings": {
"network": "ws",
"wsSettings": {
"path": "/路径"
}
}
},{
"listen": "127.0.0.1",
"port": 10085,
"protocol": "dokodemo-door",
"settings": {
"address": "127.0.0.1"
},
"tag": "api"
}
],

"outbounds": [{
"protocol": "freedom",
"settings": {}
}],

"log": {
"access": "/var/log/v2ray-access.log",
"error": "/var/log/v2ray-error.log",
"loglevel": "warning"
},

"stats": {},

"api": {
"tag": "api",
"services": [
"HandlerService",
"LoggerService",
"StatsService"
]
},

"routing": {
"rules": [{
"type": "field",
"inboundTag": [ "api" ],
"outboundTag": "api"
}],
"strategy": "rules"
},

"policy": {
"levels": {
"0": {
"handshake": 4,
"connIdle": 300,
"uplinkOnly": 2,
"downlinkOnly": 5,
"statsUserUplink": true,
"statsUserDownlink": true,
"bufferSize": 10240
}
},
"system": {
"statsInboundUplink": true,
"statsInboundDownlink": true
}
},

"ssrpanel": {
"nodeId": 2,
"checkRate": 60,
"user": {
"inboundTag": "proxy",
"level": 0,
"alterId": 64,
"security": "none"
},
"mysql": {
"host": "localhost",
"port": 3306,
"user": "ssrpanel",
"password": "ssrpanel",
"dbname": "ssrpanel"
}
}
}

需要添加的内容为 19-26 行、41-95行,添加完成后重启 V2Ray:

1
systemctl restart v2ray

SSRPanel 上的配置参考 ssrpanel:搭建shadowsocksr流量监控和用户管理面板 | 温锦瑜的博客 即可。





评论