根据 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

1ufw disable

如果是 CentOS ,则是 firewalld

1systemctl stop firewalld
2systemctl disable firewalld

关闭selinux

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

1setenforce 0
2sed -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 数据包的加密用到了当前时间,所以需要确保服务端和客户端的时间同步,否则连接上也无法认证成功

1ntpdate 1.pool.ntp.org
  • 客户端也需要进行时间同步,Linux 可直接使用以上命令,其他设备直接打开同步时间即可。

开启 BBR(可选)

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

1uname -r
升级内核

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

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

然后启用内核

1sudo egrep ^menuentry /etc/grub2.cfg | cut -f 2 -d \'
2
3# 例如最新内核是第一个
4sudo grub2-set-default 0
5
6# 重启生效
7reboot

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

启用 BBR

1echo 'net.core.default_qdisc=fq' | sudo tee -a /etc/sysctl.conf
2echo 'net.ipv4.tcp_congestion_control=bbr' | sudo tee -a /etc/sysctl.conf
3sudo 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 配置

可通过一键脚本安装:

1bash <(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 )

1vim /usr/local/etc/v2ray/config.json

下面是一个较为简单的配置例子,需要更改的内容已经标明:

 1{
 2  "inbounds": [
 3  {
 4    "listen": "127.0.0.1",
 5    "port": 42348,
 6    "protocol": "vmess",
 7    "tag": "proxy",
 8    "settings": {
 9      "clients": [
10        {"id": "用户ID", "email": "邮箱", "level": 0, "alterId": 64},
11        {"id": "用户ID", "email": "邮箱", "level": 0, "alterId": 64}
12      ]
13    },
14    "streamSettings": {
15      "network": "ws",
16      "wsSettings": {
17        "path": "/路径"
18      }
19    }
20  }
21  ],
22
23  "outbounds": [{
24    "protocol": "freedom",
25    "settings": {}
26  }],
27
28  "log": {
29    "access": "/var/log/v2ray/access.log",
30    "error": "/var/log/v2ray/error.log",
31    "loglevel": "warning"
32  }
33}

需要更改的有3处地方:

  • 用户ID : 此 ID 为 UUID,可通过命令生成:cat /proc/sys/kernel/random/uuid
  • 邮箱 : 主要用来区分用户,需要填的不一定是邮箱,可以直接用名字代替,例如:wenjinyu ,一般在查询用户已使用流量时会用到
  • 路径 : 加了路径后,实际访问地址就变成了 example.com/path ,这样的话,主网址 example.com 可以用来放伪装网站,不过不放也行,访问的时候就是404页面

注意:如果需要添加 2 个以上用户,则要在用户配置项后面加上逗号,但最后一个不加,可比较上面高亮的 2 行

更改完成后重启 V2Ray 即可:

1systemctl restart v2ray
2systemctl enable v2ray

获取 SSL 证书

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

安装

1# CentOS
2yum install letsencrypt python2-certbot-nginx
3
4# Ubuntu 或者 Debian
5apt-get install letsencrypt python3-certbot-nginx

获取证书

1letsencrypt certonly --standalone --email 邮箱 -d 域名
  • 其中的邮箱用于证书过期的提醒,因为使用 Let’s encrypt 获取的证书有 3 个月的有效期,到期前需要续期,如果没有及时续期则证书会不可用

续期可以添加自动任务:

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

Nginx 配置

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

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

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

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

内容如下:

 1server {
 2  listen                     443 ssl;
 3  ssl                        on;
 4  server_name                域名;
 5  ssl_certificate            /etc/letsencrypt/live/域名/fullchain.pem;
 6  ssl_certificate_key        /etc/letsencrypt/live/域名/privkey.pem;
 7  ssl_protocols              TLSv1 TLSv1.1 TLSv1.2;
 8  ssl_ciphers                HIGH:!aNULL:!MD5;
 9
10  location /PATH {
11    proxy_redirect           off;
12    proxy_pass               http://127.0.0.1:42348;
13    proxy_http_version       1.1;
14    proxy_set_header         Upgrade $http_upgrade;
15    proxy_set_header         Connection "upgrade";
16    proxy_set_header         Host $http_host;
17    proxy_set_header         X-Real-IP $remote_addr;
18    proxy_set_header         X-Forwarded-For $proxy_add_x_forwarded_for;
19  }
20
21  access_log                /var/log/nginx-v2ray-access.log;
22  error_log                 /var/log/nginx-v2ray-error.log;
23}
  • 其中需要更改的有:
    • 第 4、5、6 行的域名:使用自己的域名
    • 第 10 行的路径:可以任意用一个单词,只要和 v2ray 中的一样即可

然后新建日志文件:

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

添加完成后即可启动 Nginx

1systemctl start nginx
2systemctl enable nginx

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

客户端配置

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

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

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

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

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

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

然后更改配置文件

1vim /usr/local/etc/v2ray/config.json

内容修改如下:

 1{
 2"inbounds": [{
 3  "port": 10800,
 4  "listen": "127.0.0.1",
 5  "protocol": "socks",
 6  "sniffing": {
 7    "enabled": true,
 8    "destOverride": ["http", "tls"]
 9  },
10  "settings": {
11    "auth": "noauth",
12    "udp": false
13  }
14}],
15
16"inboundDetour": [
17{
18  "port": 10801,
19  "listen": "127.0.0.1",
20  "protocol": "http",
21  "settings": {
22    "timeout": 0
23  }
24}],
25
26"outbounds":
27[
28  {
29    "protocol": "vmess",
30    "settings": {
31     "network": "tcp,udp",
32     "vnext": [{
33        "address": "域名",
34        "port": 443,
35        "users": [{
36        "id": "用户ID", "level": 0, "alterId": 64, "security": "none"
37        }]
38      }]
39    },
40    "streamSettings": {
41      "network": "ws",
42      "security": "tls",
43      "wsSettings": {
44        "path": "/路径"
45      },
46      "tlsSettings": {
47        "serverName": "",
48        "allowInsecure": true
49      }
50    }
51  },{
52    "protocol": "freedom",
53    "settings": {},
54    "tag": "direct"
55  }
56],
57
58"routing": {
59  "domainStrategy": "IPOnDemand",
60  "rules": [{
61    "type": "field",
62    "outboundTag": "direct",
63    "domain": ["geosite:cn"]
64  },{
65    "type": "field",
66    "outboundTag": "direct",
67    "ip": [
68      "geoip:cn",
69      "geoip:private"
70      ]
71    }
72  ]
73},
74"log": {
75  "access": "/var/log/v2ray-access.log",
76  "error": "/var/log/v2ray-error.log",
77  "loglevel": "warning"
78}
79}

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

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

然后重启并添加自启动

1systemctl start v2ray
2systemctl enable v2ray

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

对接 SSRPanel

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

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

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

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

V2Ray 的配置文件也需要做一些更改:

 1{
 2  "inbounds": [
 3  {
 4    "listen": "127.0.0.1",
 5    "port": 42348,
 6    "protocol": "vmess",
 7    "tag": "proxy",
 8    "settings": {
 9      "clients": [
10        {"id": "用户ID", "email": "邮箱", "level": 0, "alterId": 64}
11      ]
12    },
13    "streamSettings": {
14      "network": "ws",
15      "wsSettings": {
16        "path": "/路径"
17      }
18    }
19  },{
20    "listen": "127.0.0.1",
21    "port": 10085,
22    "protocol": "dokodemo-door",
23    "settings": {
24      "address": "127.0.0.1"
25    },
26    "tag": "api"
27  }
28  ],
29
30  "outbounds": [{
31    "protocol": "freedom",
32    "settings": {}
33  }],
34
35  "log": {
36    "access": "/var/log/v2ray-access.log",
37    "error": "/var/log/v2ray-error.log",
38    "loglevel": "warning"
39  },
40
41  "stats": {},
42
43  "api": {
44    "tag": "api",
45    "services": [
46      "HandlerService",
47      "LoggerService",
48      "StatsService"
49    ]
50  },
51
52  "routing": {
53    "rules": [{
54      "type": "field",
55      "inboundTag": [ "api" ],
56      "outboundTag": "api"
57    }],
58    "strategy": "rules"
59  },
60
61  "policy": {
62    "levels": {
63      "0": {
64        "handshake": 4,
65        "connIdle": 300,
66        "uplinkOnly": 2,
67        "downlinkOnly": 5,
68        "statsUserUplink": true,
69        "statsUserDownlink": true,
70        "bufferSize": 10240
71      }
72    },
73    "system": {
74      "statsInboundUplink": true,
75      "statsInboundDownlink": true
76    }
77  },
78
79  "ssrpanel": {
80    "nodeId": 2,
81    "checkRate": 60,
82    "user": {
83      "inboundTag": "proxy",
84      "level": 0,
85      "alterId": 64,
86      "security": "none"
87    },
88    "mysql": {
89      "host": "localhost",
90      "port": 3306,
91      "user": "ssrpanel",
92      "password": "ssrpanel",
93      "dbname": "ssrpanel"
94    }
95  }
96}

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

1systemctl restart v2ray

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