blog:linux_system_manage:install_v2ray

搭建v2ray

install v2ray

从如下地址下载v2ray安装脚本 git clone https://github.com/v2fly/fhs-install-v2ray

这是v2fly社区写的用于安装v2ray的脚本,需要运行在使用symstemd的系统上 此符合FHS (Filesystem Hierarchy Standard)

安装后的文件路径如下:

installed: /usr/local/bin/v2ray
installed: /usr/local/share/v2ray/geoip.dat
installed: /usr/local/share/v2ray/geosite.dat
installed: /usr/local/etc/v2ray/config.json
installed: /var/log/v2ray/
installed: /var/log/v2ray/access.log 
installed: /var/log/v2ray/error.log
installed: /etc/systemd/system/v2ray.service
installed: /etc/systemd/system/v2ray@.service

执行安装脚本: sudo ./install-release.sh

v2ray 配置文件格式

{
  "log": {},
  "inbounds": [],
  "outbounds": [],
  "routing": {},
  "transport": {},
  "dns": {},
  "reverse": {},
  "policy": {},
  "stats": {},
  "api": {}
}

要理解v2ray的工作模式,首先要抛开客户端和服务器的概念,以中转节点的概念来理解更好。

v2ray只是一个转发数据的软件,从入口接口到数据,然后把数据从出口发出去。

v2ray的传入协议: HTTP, SOCKS, VMess, Shadowsocks, Dokodemo-door

v2ray的传出协议: SOCKS, VMess, Shadowsocks, Blackhole, Freedom

在inbounds 和 outbounds 当中,无论使用了什么协议,inbounds 或者 outbounds 的 配置格式都是一样的,区别只在于不同的协议对应的 settings 内容不一样。

"log": {
	"loglevel": "warning",
	"access": "/var/log/v2ray/access.log",
	"error": "/var/log/v2ray/error.log"
},  
loglevel:
    debug:  最详细的日志信息,专用于软件调试
    info:   比较详细的日志信息,可以看到 V2Ray 详细的连接信息
    warning:警告信息。轻微的问题信息,经我观察 warning 级别的信息大多是网络错误。推荐使用 warning
    error:  错误信息。比较严重的错误信息。当出现 error 时该问题足以影响 V2Ray 的正常运行
    none:   空。不记录任何信息

access:将访问的记录保存到文件中
error: 将错误的记录保存到文件中
error、access 字段留空,并且在手动执行 V2Ray 时,V2Ray 会将日志输出在 stdout 即命令行中(terminal、cmd 等),便于排错

inbounds and outbounds

v2ray使用 inbound (传入) 和 outbound (传出) 的结构,体现数据包的流动方向。

V2Ray 做客户端,则 inbound 接收来自浏览器数据,由 outbound 发出去(通常是发到 V2Ray 服务器);

V2Ray 做服务器,则 inbound 接收来自 V2Ray 客户端的数据,由 outbound 发出去(通常是如 Google 等想要访问的目标网站)。

VMess

vmess协议的官方文档: https://www.v2ray.com/developer/protocols/vmess.html

VMess 协议是由 V2Ray 原创并使用于 V2Ray 的加密传输协议,如同 Shadowsocks 一样为了对抗墙的深度包检测而研发的。

在 V2Ray 上客户端与服务器的通信主要是通过 VMess 协议通信。

VMess 协议的认证基于时间,一定要保证服务器和客户端的系统时间相差要在90秒以内。

无论是客户端还是服务器,配置文件都由两部分内容组成: inbounds 和 outbounds。

V2Ray 没有使用常规代理软件的 C/S(即客户端/服务器)结构,它既可以当做服务器也可以作为客户端。

于是我们可以从另一个角度来理解,认为每一个 V2Ray 都是一个节点, inbound 是关于如何与上一个节点连接的配置,outbound 是关于如何与下一个节点连接的配置。

对于第一个节点,inbound 与浏览器连接;对于最后一个节点,outbound与目标网站连接

inbounds 和 outbounds 是 inbound 和 outbound 的集合,意味着每一个 V2Ray 节点都可以有多个入口和出口。

{
	"inbounds": [
	{
		"port": 1080, // 监听端口
		"protocol": "socks", // 入口协议为 SOCKS 5
		"sniffing": {
			"enabled": true,
			"destOverride": ["http", "tls"]
		},
		"settings": {
			"auth": "noauth"  //socks的认证设置,noauth 代表不认证,由于 socks 通常在客户端使用,所以这里不认证
		}
	}
	],
	"outbounds": [
	{
		"protocol": "vmess", // 出口协议
		"settings": {
			"vnext": [
			{
				"address": "serveraddr.com", // 服务器地址,请修改为你自己的服务器 IP 或域名
				"port": 16823,  // 服务器端口
				"users": [
				{
					"id": "b831381d-6324-4d53-ad4f-8cda48b30811",  // 用户 ID,必须与服务器端配置相同
					"alterId": 64 // 此处的值也应当与服务器相同
				}
				]
			}
			]
		}
	}
	]
}

vmess user id的作用类似于shadowsocks的密码, vmess id的格式必须与UUID格式相同。

服务器与客户端的id必须相同。

生成随机uuid的方法: cat /proc/sys/kernel/random/uuid


原理解析:

客户端配置中的 inbounds,port 为 1080,即 V2Ray 监听了一个端口 1080,协议是 socks。

浏览器代理设置:(SOCKS Host: 127.0.0.1,Port: 1080),

假如访问了 google.com,浏览器就会发出一个数据包打包成 socks 协议发送到

本机(127.0.0.1指的本机,localhost)的 1080 端口,这个时候数据包就会被 V2Ray 接收到。


在客户端配置的 inbounds 中,有一个 “sniffing” 字段,V2Ray 手册解释为“流量探测,

根据指定的流量类型,重置所请求的目标”,这话不太好理解,简单说这东西就是从网络流量中识别出域名。 这个 sniffing 有两个用处:

  解决 DNS 污染;
  对于 IP 流量可以应用后文提到的域名路由规则;
  识别 BT 协议,根据自己的需要拦截或者直连 BT 流量(后文有一节专门提及)。

再看outbounds,protocol 是vmess,说明 V2Ray 接收到数据包之后要将数据包打包成 VMess 协议

并且使用预设的 id 加密(这个例子 id 是 b831381d-6324-4d53-ad4f-8cda48b30811),

然后发往服务器地址为 serveraddr.com 的 16823 端口。服务器地址 address 可以是域名也可以是 IP,只要正确就可以了。

{
	"inbounds": [
	{
		"port": 16823, // 服务器监听端口
		"protocol": "vmess",    // 主传入协议
		"settings": {
			"clients": [
			{
				"id": "b831381d-6324-4d53-ad4f-8cda48b30811",  // 用户 ID,客户端与服务器必须相同
				"alterId": 64
			}
			]
		}
	}
	],
	"outbounds": [
	{
		"protocol": "freedom",  // 主传出协议
		"settings": {}
	}
	]
}

id 是 b831381d-6324-4d53-ad4f-8cda48b30811,所以 V2Ray 服务器接收到客户端发来的数据包时

就会尝试用 b831381d-6324-4d53-ad4f-8cda48b30811 解密, 如果解密成功再看一下时间对不对,对的话就把数据包发到 outbound

outbound.protocol 是 freedom (freedom 的中文意思是自由,在这里姑且将它理解成直连吧),数据包就直接发到 google.com 了。

{浏览器} <--(socks)--> {V2Ray 客户端 inbound <-> V2Ray 客户端 outbound} 

    <--(VMess)-->

        {V2Ray 服务器 inbound <-> V2Ray 服务器 outbound} <--(Freedom)--> {目标网站}

配置中还有一个 alterId 参数,这个参数主要是为了加强防探测能力。

理论上 alterId 越大越好,但越大就约占内存(只针对服务器,客户端不占内存),

所以折中之下设一个中间值才是最好的。那么设多大才是最好的?

根据经验,alterId 的值设为 30 到 100 之间应该是比较合适的。alterId 的大小要保证客户端的小于等于服务器的。

排错指引


打开客户端闪退

可能原因:客户端的配置文件上不正确。

修正方法:请仔细检查配置文件并修改正确。


客户端提示 Socks: unknown Socks version

可能原因:客户端配置的 inboud 设置成了 socks 而浏览器的代理协议设置为 http。

修正方法:修改配置文件使客户端的 inboud 的 protocol 和浏览器代理设置的协议保持一致。


客户端提示 Proxy|HTTP: failed to read http request > malformed HTTP request “\x05\x01\x00”

可能原因:客户端配置的 inboud 设置成了 https 而浏览器的代理协议设置为 socks4 或者 socks5。

修正方法:修改配置文件使客户端的 inboud 的 protocol 和浏览器代理设置的协议保持一致。


服务器执行 systemctl status v2ray 输出提示 Main: failed to read config file…

可能原因:服务器的配置文件不正确。

修正方法:请仔细检查配置文件并修改正确。


执行 cat /var/log/v2ray/error.log 或者 systemctl status v2ray 出现 rejected Proxy|VMess|Encoding: invalid user

可能原因:服务器与客户端的系统时间或者 id 不一致或者 alterId 不一致。

修正方法:请校准系统时间或将 id 以及 alterId 修改一致。


access log中出现如下log

2023/01/31 10:27:56 111.181.19.37:45288 rejected common/drain: common/drain: unable to drain connection > EOF > proxy/vmess/encoding: invalid user: VMessAEAD is enforced and a non VMessAEAD connection is received. You can still disable this security feature with environment variable v2ray.vmess.aead.forced = false . You will not be able to enable legacy header workaround in the future.

解决办法: alterID 设置为0

启动v2ray

sudo systemctl start v2ray

sudo systemctl enable v2ray # 加入到开机自启

浏览器代理设置

mannual proxy configuration:

SOCKS Host: 127.0.0.1 Port: xxx 选择SOCKS_v5

选中 Proxy DNS when using SOCKS v5

  • blog/linux_system_manage/install_v2ray.txt
  • 最后更改: 2025/02/02 23:10
  • 127.0.0.1