搭建v2ray
v2ray 配置指南: https://github.com/ToutyRater/v2ray-guide
v2ray官方手册: https://www.v2ray.com https://v2ray.cool
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
"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 越大越好,但越大就约占内存(只针对服务器,客户端不占内存),
所以折中之下设一个中间值才是最好的。那么设多大才是最好的?
根据经验,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