V2Ray
V2Ray 是 Project V 下的一个工具。Project V 是一个包含一系列构建特定网络环境工具的项目,而 V2Ray 属于最核心的一个。 官方介绍中 Project V 提供了单一的内核和多种界面操作方式。内核(V2Ray)用于实际的网络交互、路由等针对网络数据的处理,而外围的用户界面程序提供了方便直接的操作流程。 不过从时间上来说,先有 V2Ray 才有 Project V。
- 客户端:V2Ray 本身只是一个内核,V2Ray 上的图形客户端大多是调用 V2Ray 内核套一个图形界面的外壳,类似于 Linux 内核和 Linux 操作系统的关系;所以 v2rayN 需要配置 core类型
- 分流:也许大家第一反应是 PAC,V2Ray 本身不支持 PAC,都是客户端加进来的;V2Ray 使用自己实现的路由功能,孰优孰劣只是仁者智者的问题。
- 分享链接/二维码:V2Ray 不像 Shadowsocks 那样有统一规定的 URL 格式,所以各个 V2Ray 图形客户端的分享链接/二维码不一定通用。
- 加密方式:V2Ray(特指 VMess 协议)不像 Shadowsocks 那样看重对加密方式的选择,并且 VMess 的加密方式是由客户端指定的,服务器自适应。
- 时间:使用 V2Ray 要保证时间准确,因为这是为了安全设计的。
- 密码:V2Ray(VMess)只有 id(使用 UUID 的格式),作用类似于 Shadowsocks 的密码,但随机性远好于 Shadowsocks 的密码,只是不太方便记忆(安全和方便的矛盾)。
- UDP 转发:VMess 是基于 TCP 的协议,对于 UDP 包 V2Ray 会转成 TCP 再传输的,即 UDP over TCP。要 UDP 转发功能在客户端的 socks 协议中开启 UDP 即可。
V2Ray、Trojan、XRay
https://www.chengxiaobai.com/essays/v2ray-trojan-xray https://github.com/v2fly https://github.com/v2fly/v2ray-core
V2Ray 、XRay
起因是 V2Ray 项目创始人 Victoria Raymond 突然失联,由于其他维护者没有完整的项目权限,于是大家创建了新的社区:V2Fly,后续关于 V2Ray 的更新都由 V2Fly 社区负责。
v2fly 移除 XTLS 协议后,RPRX 分叉 v2fly-core 项目,建立了包含 XTLS 协议的 Xray-core 项目。不同于 v2fly 使用的 MIT 许可证,Xray-core 使用 MPL 2.0 许可证。 RPRX 因一己私利而促使项目分家的行为对开源社区造成了深深的伤害,他应该被永远钉在开源社区的耻辱柱上。
Trojan 工具
我觉得 Trojan 流行的一个很重要的外部因素是 HTTPS 的覆盖率大规模提升。
Trojan 设计的巧妙点在于它直接使用 HTTPS 通信,所以它从流量特征上看就和海量的 HTTPS 流量一样,「大隐隐于市」,点此可查看设计思路讨论。
由于它的设计很简单,只使用 TLS 做为可信通道,其他加密一概没有,在不增加附加功能的前提下,核心通信功能可以很稳定,从它的迭代周期也能看出来。
工作机制
工作机制 一个 V2Ray 服务器可同时支持多台设备使用不同的代理协议访问。同时,经过合理的配置,V2Ray 可以识别并区分需要代理以及不需要代理的流量,直连的流量不需要绕路。

- 需要配置至少一个入站协议(Inbound)和一个出站协议(Outbound)才可以正常工作。
- 入站协议负责与客户端(如浏览器)通信:
- 入站协议通常可以配置用户认证,如 ID 和密码等;
- 入站协议收到数据之后,会交给分发器(Dispatcher)进行分发;
- 出站协议负责将数据发给服务器,如另一台主机上的 V2Ray。
- 入站协议负责与客户端(如浏览器)通信:
- 当有多个出站协议时,可以配置路由(Routing)来指定某一类流量由某一个出站协议发出。
- 路由会在必要时查询 DNS 以获取更多信息来进行判断。
Inbound 和 Outbound 类似 交换线一样
安裝和更新 V2Ray
https://www.v2fly.org/guide/install.html#linux-%E5%AE%89%E8%A3%85%E6%96%B9%E5%BC%8F https://github.com/v2fly/fhs-install-v2ray
Linux 安装或更新都可
bash <(curl -L https://raw.githubusercontent.com/v2fly/fhs-install-v2ray/master/install-release.sh)其配置文件: vim /usr/local/etc/v2ray/config.json
管理 V5
- 如果你使用 Linux 并开启了 systemd,可以使用
journalctl -u v2ray查看 V2Ray 退出时的日志。 - 一般情况可以手动运行
v2ray -config=<config-file> -test来查看错误信息。 - 启动和停止
systemctl restart v2ray
systemctl status v2ray
systemctl stop v2ray
/usr/local/bin/
v2ray run -config /usr/local/etc/v2ray/config.jsonvim /usr/local/etc/v2ray/config.json
{
"log": {},
"api": {},
"dns": {},
"routing": {},
"policy": {},
"inbounds": [],
"outbounds": [],
"transport": {},
"stats": {},
"reverse": {},
"fakedns": [],
"browserForwarder": {},
"observatory": {}
}配置实例 V5
https://www.v2fly.org/v5/config/overview.html
info: V2Ray v5.22.0 is installed.
Usage:
v2ray <command> [arguments]
The commands are:
run run V2Ray with config
api call V2Ray API
convert convert config files
test test config files
tls TLS tools
uuid generate new UUID
verify verify if a binary is officially signed
version print V2Ray version
Use "v2ray help <command>" for more information about a command.
Additional help topics:
config-merge config merge logic
format-loader config formats and loading
Use "v2ray help <topic>" for more information about that topic.
执行 ./v2ray run -c $configure_file_name -format jsonv5 命令以运行您的配置文件。
V2Ray 的配置文件形式如下,客户端和服务器通用一种形式,只是实际的配置不一样。
{
"log": {},
"dns": {},
"router": {},
"inbounds": [],
"outbounds": [],
"services": {}
}
Inbounds 和 Outbounds
Inbounds
https://www.v2fly.org/config/inbounds.html#inboundobject
{
"listen": "127.0.0.1",
"port": 1080,
"protocol": "协议名称", //连接协议名称,可选的值见协议列表。
"settings": {},
"streamSettings": {},
"tag": "标识",
"sniffing": {
"enabled": true,
"destOverride": [
"http",
"tls"
],
"metadataOnly": false
},
"allocate": {
"strategy": "always",
"refresh": 5,
"concurrency": 3
}
}Outbounds
{
"sendThrough": "0.0.0.0",
"protocol": "协议名称",//连接协议名称,可选的值见协议列表。
"settings": {},
"tag": "标识",
"streamSettings": {},
"proxySettings": {
"tag": "another-outbound-tag",
"transportLayer": false
},
"mux": {}
}传输协议说明(部分)
https://www.v2fly.org/config/protocols/freedom.html
{
"inbounds": [
{
"port": 5600,
"protocol": "vless",///连接协议名称,可选的值见协议列表。
"settings": {
"decryption": "none",
"clients": [
{
"id": "4xxx",
"email": "yang-pc"
}
],
"fallbacks":[{
"alpn": "",
"path": "",
"dest": 5632,
"xver": 1
}]
},
"streamSettings": {
"network": "kcp",//`network`: "tcp" | "kcp" | "ws" | "http" | "domainsocket" | "quic" | "grpc"
"kcpSettings": {
"header": {
"type": "srtp"
}
}
}
}
]
}freedom
freedom 是一个出站协议,可以用来向任意网络发送(正常的) TCP 或 UDP 数据
通常服务端出口使用的
{
"inbounds": [ ... ],
"outbounds": [
{
"protocol": "freedom"
}
]
}vmess
VMess 是一个加密传输协议,它分为入站和出站两部分,通常作为 V2Ray 客户端和服务器之间的桥梁。 VMess 依赖于系统时间,请确保使用 V2Ray 的系统 UTC 时间误差在 90 秒之内
通常客户端与服务端 使用
vless
VLESS 是一个无状态的轻量传输协议,它分为入站和出站两部分,可以作为 V2Ray 客户端和服务器之间的桥梁。 与 VMess 不同,VLESS 不依赖于系统时间,认证方式同样为 UUID,但不需要 alterId。
通常客户端与服务端 使用
socks
标准 Socks 协议实现,兼容 Socks 4open in new window、Socks 4a 和 Socks 5open in new window。
blackhole
Blackhole(黑洞)是一个出站数据协议,它会阻碍所有数据的出站,配合 路由(Routing) 一起使用,可以达到禁止访问某些网站的效果。
{
"inbounds": [ ... ],
"outbounds": [
{
"protocol": "freedom"
}
]
}传输方式说明(部分)
https://www.v2fly.org/config/transport.html#streamsettingsobject https://www.v2fly.org/config/transport.html#transportobject
对应出站入站协议中的 streamSettings 项。每一个入站、出站连接都可以分别配置不同的传输配置,都可以设置 streamSettings 来进行一些传输的配置。
{
"inbounds": [
{
"port": 5600, // 服务器监听端口
"protocol": "vless",//注意注意 协议
"settings": {
"decryption": "none",
"clients": [
{
"id": "4xxx",
"email": "yang-pc"
}
],
"fallbacks":[{
"alpn": "",
"path": "",
"dest": 5632,
"xver": 1
}]
},
"streamSettings": {
"network": "kcp",//`network`: "tcp" | "kcp" | "ws" | "http" | "domainsocket" | "quic" | "grpc"
"kcpSettings": {//当前连接的 mKCP 配置,仅当此连接使用 mKCP 时有效。配置内容与上面的全局配置相同。
"header": {
"type": "srtp"
}
}
}
}
]
}mKCP
mKCP 使用 UDP 来模拟 TCP 连接,请确定主机上的防火墙配置正确。mKCP 牺牲带宽来降低延迟。传输同样的内容,mKCP 一般比 TCP 消耗更多的流量。 https://www.v2fly.org/v5/config/stream/kcp.html#mkcp-stream
QUIC
QUIC 全称 Quick UDP Internet Connection,是由 Google 提出的使用 UDP 进行多路并发传输的协议。其主要优势是:
- 减少了握手的延迟(1-RTT 或 0-RTT)
- 多路复用,并且没有 TCP 的阻塞问题
- 连接迁移,(主要是在客户端)当由 Wifi 转移到 4G 时,连接不会被断开 https://www.v2fly.org/config/transport/quic.html
实例(WS + 域名伪装)
vim /usr/local/etc/v2ray/config.json
关键 Inbounds(入站), outbounds(出站) 配置
{
"log": {
"access": "none",
"info": "/var/log/v2ray/info.log",
"warning": "/var/log/v2ray/warning.log",
"error": "/var/log/v2ray/error.log",
"loglevel": "error"
},
"inbounds": [
{
"port": 5636,
"protocol": "vmess",
"settings": {
"clients": [
{
"id": "d8b90fe7-aa9e-5ee6-93c0-bbb1487d0824",
"level": 0,
"alterId": 0,
"email": "acc@gmail.com"
}
],
"disableInsecureEncryption": true
},
"streamSettings": {
"network": "ws",
"security": "none",
"wsSettings": {
"path": "/wesocket",
"headers": {
"Host": "user7e0b802d7832.expedia.com.hk"
}
}
},
"sniffing": {
"enabled": true,
"destOverride": [
"http"
]
}
}
],
"outbounds": [
{
"protocol": "freedom"
}
]
}实例 (TLS + 分流器) - ali
https://guide.v2fly.org/advanced/tcp_tls_shunt_proxy.html#%E5%AE%9E%E7%8E%B0
TLS 证书
https://letsencrypt.org/zh-cn/getting-started/
Let’s Encrypt 是一家免费、开放、自动化的证书颁发机构,由非营利组织互联网安全研究组 (ISRG) 运作。
tls-shunt-proxy 分流器
https://github.com/liberal-boy/tls-shunt-proxy#%E4%B8%8B%E8%BD%BD%E5%AE%89%E8%A3%85
它不能分流 自签 IP证书!!
分流规则
Copilot 说的..
-
基于 SNI(Server Name Indication)分流:
- 配置文件里的
vhosts数组,每个name对应一个 SNI(即 TLS 握手中的 server name)。 - 可以为每个 vhost 设置不同的处理方式,比如是否解开 TLS(
tlsoffloading),以及下游流量如何处理。
- 配置文件里的
-
基于 HTTP 请求的 Path 分流:
- 在 HTTP 流量被识别的情况下(
tlsoffloading: true),可以按 HTTP 请求的path进行分流。 - path 支持从上到下依次匹配,若没有匹配项则使用默认的 http handler。
- 例如:
- 在 HTTP 流量被识别的情况下(
paths:
- path: /vmess/ws/
handler: proxyPass
args: 127.0.0.1:40000
- path: "*"
handler: fileServer
args: /var/www/html
-
协议类型分流:
- 可以根据流量类型(HTTP、HTTP/2、Trojan 协议等)设置不同的 handler。例如:
http: 普通 HTTP 流量http2: HTTP/2 流量trojan: Trojan 协议流量default: 其他不可识别流量
- 可以根据流量类型(HTTP、HTTP/2、Trojan 协议等)设置不同的 handler。例如:
-
回落(Fallback)机制:
- 如果无法识别 SNI 或 SNI 不在
vhosts配置中,可以设置一个fallback地址,所有未被识别或匹配的流量会转发到这个地址。
- 如果无法识别 SNI 或 SNI 不在
-
路径前缀修剪(trimprefix):
- 可通过
trimprefix修剪 path 前缀再交给 handler。例如将/static/logo.jpg修剪为/logo.jpg。
- 可通过
-
Proxy Protocol 支持:
- 可以通过
args添加proxyProtocol,将源地址通过 Proxy Protocol v1 传递给后端。
- 可以通过
安装
对于 linux-amd64 可以使用脚本安装,以 root 身份执行以下命令
bash <(curl -L -s https://raw.githubusercontent.com/liberal-boy/tls-shunt-proxy/master/dist/install.sh)- 配置文件位于
/etc/tls-shunt-proxy/config.yaml
listen: 0.0.0.0:443
# 相同吞吐量和连接数情况下,缓冲区越大,消耗的内存越大,消耗 CPU 时间越少。在网络吞吐量较低时,缓存过大可能增加延迟。
inboundbuffersize: 4
# outboundbuffersize: 出站缓冲区大小,单位 KB, 默认值 32
outboundbuffersize: 32
vhosts:
# 将 example.com 改为你的域名
- name: xgnzhnyyyyy.xyz
# tlsoffloading: 解开 tls,true 为解开,解开后可以识别 http 流量,适用于 vmess over tls 和 http over tls (https) 分流等
tlsoffloading: true
# managedcert: 管理证书,开启后将自动从 LetsEncrypt 获取证书,根据 LetsEncrypt 的要求,必须监听 443 端口才能签发
# 开启时 cert 和 key 设置的证书无效,关闭时将使用 cert 和 key 设置的证书
managedcert: true
alpn: h2,http/1.1
# 如果不需要兼容 tls12, 可改为 tls13
protocols: tls12,tls13
# 证书路径
cert: /usr/local/etc/self_ssl/root_ca.crt
key: /usr/local/etc/self_ssl/root_ca.key
http:
handler: fileServer
# /var/www/html 是静态网站目录
args: /var/www/html
# default: 其他流量处理方式, 转发给 rxay处理
default:
handler: proxyPass
args: 127.0.0.1:10443 管理
- 关于TLS证书
看他的安装脚本 可执行文件在
/usr/local/bin/, 创建了/etc/ssl/tls-shunt-proxy作为工作目录, 其实是acme使用管理签发证书的, 里面包括 Let’s Encrypt 签发的证书,
systemctl start tls-shunt-proxy
systemctl restart tls-shunt-proxy
systemctl status tls-shunt-proxy
systemctl stop tls-shunt-proxy
./tls-shunt-proxy -config /etc/tls-shunt-proxy/config.yamlV2ray 配置文件
vim /usr/local/etc/v2ray/config.json
inbounds 增加一个入口点
"inbounds": [
{
"protocol": "vmess",
"listen": "127.0.0.1",
"port": 10443,
"settings": {
"clients": [
{
"id": "XXXXXXXXXXXXXXXXXXXXXXX"
}
]
},
"streamSettings": {
"network": "tcp"
}
}
]实例(vmess + QUIC)
https://www.v2fly.org/config/transport/quic.html 适合游戏, 都不加密
{
"log": {
"info": "/var/log/v2ray/info.log",
"warning": "/var/log/v2ray/warning.log",
"error": "/var/log/v2ray/error.log",
"loglevel": "warning"
},
"inbounds": [
{
"protocol": "vmess",
"port": "5633",
"security":"zero",//vmess的 `"none"`:不加密; `"zero"`:不加密,也不进行消息认证 (v4.35.0+)
"settings": {
"clients": [
{
"id": "294be5ce-8356-4040-84d9-253bf7f22583",
"alterId": 0
}
]
},
"streamSettings": {
"network": "quic",
"quicSettings": {
"security": "none",
"key": "",
"header": {
"type": "srtp"
}
}
}
}
],
"outbounds": [
{
"protocol": "freedom"
}
]
}header.type “none”:默认值,不进行伪装。 “srtp”:伪装成 SRTP 数据包,会被识别为视频通话数据(如 FaceTime)。 “utp”:伪装成 uTP 数据包,会被识别为 BT 下载数据。 “wechat-video”:伪装成微信视频通话的数据包。 “dtls”:伪装成 DTLS 1.2 数据包。 “wireguard”:伪装成 WireGuard 数据包。(并不是真正的 WireGuard 协议)
实例(vmess+KCP)
mKCP 牺牲带宽来降低延迟。传输同样的内容,mKCP 一般比 TCP 消耗更多的流量。
https://www.v2fly.org/config/transport/mkcp.html
inbounds.[protocol = vmess].security //vmess的 "none":不加密; "zero":不加密,也不进行消息认证 (v4.35.0+)
{
"log": {
"info": "/var/log/v2ray/info.log",
"warning": "/var/log/v2ray/warning.log",
"error": "/var/log/v2ray/error.log",
"loglevel": "warning"
},
"inbounds": [
{
"protocol": "vmess",
"port": "5633",
"security":"zero",
"settings": {
"clients": [
{
"id": "294be5ce-8356-4040-84d9-253bf7f22583",
"alterId": 0
}
]
},
"streamSettings": {
"network": "kcp",
"kcpSettings": {
"mtu": 1300,
"tti": 20,
"uplinkCapacity": 100,
"downlinkCapacity": 100,
"congestion": true,
"readBufferSize": 1,
"writeBufferSize": 1,
"header": {
"type": "srtp"
},
"seed": "VwYdCxwawrDYrvVC"
}
}
}
],
"outbounds": [
{
"protocol": "freedom"
}
]
}
uplinkCapacity: number
上行链路容量,即主机发出数据所用的最大带宽,单位 MB/s,默认值 5。注意是 Byte 而非 bit。可以设置为 0,表示一个非常小的带宽。
downlinkCapacity: number
下行链路容量,即主机接收数据所用的最大带宽,单位 MB/s,默认值 20。注意是 Byte 而非 bit。可以设置为 0,表示一个非常小的带宽。
readBufferSize: number
单个连接的读取缓冲区大小,单位是 MB。默认值为 2。
writeBufferSize: number
单个连接的写入缓冲区大小,单位是 MB。默认值为 2。
header: HeaderObject
type: string 伪装类型,可选的值有:
"none":默认值,不进行伪装,发送的数据是没有特征的数据包。"srtp":伪装成 SRTP 数据包,会被识别为视频通话数据(如 FaceTime)。"utp":伪装成 uTP 数据包,会被识别为 BT 下载数据。"wechat-video":伪装成微信视频通话的数据包。"dtls":伪装成 DTLS 1.2 数据包。"wireguard":伪装成 WireGuard 数据包。(并不是真正的 WireGuard 协议)
运行
在 Windows 和 macOS 中,配置文件通常是 V2Ray 同目录下的 config.json 文件。直接运行 v2ray 或 v2ray.exe 即可。
在 Linux 中,配置文件通常位于/etc/v2ray/或 /usr/local/etc/v2ray/ 目录下。运行 v2ray —config=/usr/local/etc/v2ray/config.json,或使用 systemd 等工具将 V2Ray 作为服务在后台运行。
/usr/local/etc/v2ray/config.json
服务端
systemctl enable v2ray
systemctl start v2ray
systemctl disable v2ray
//
systemctl restart v2ray
systemctl status v2ray
systemctl stop v2ray
vim /usr/local/etc/v2ray/config.json
tail -f /var/log/v2ray/info.log
客户端
v2rayN 另外还需要下载 v2ray core : https://github.com/XTLS/Xray-core/releases
第三方图形客户端
Qv2ray 跨平台 V2Ray 客户端,支持 Linux、Windows、macOS,可通过插件系统支持 SSR / Trojan / Trojan-Go / NaiveProxy 等协议
SagerNet SagerNet 是一个基于 V2Ray 的 Android 通用代理应用。
V2rayN V2RayN 是一个基于 V2Ray 内核的 Windows 客户端。
v2rayA 基于 web GUI 的跨平台 V2Ray 客户端,在 Linux 上支持全局透明代理,其他平台上支持系统代理
KCP 传输协议
游戏加速最佳协议
KCP是一个快速可靠协议,能以比 TCP 浪费 10%-20% 的带宽的代价,换取平均延迟降低 30%-40%,且最大延迟降低三倍的传输效果。
https://github.com/skywind3000/kcp
流程
- 客户端链接tcp,服务端为该tcp链接分配一个整数id作为标识。
- 登录后服务端给客户端发送udp握手信息,包括:自己的udp端口,用户的tcp标识id,32位随机数key
- 客户端给服务端udp地址发送握手信息,把刚才服务端发过来的(id, key) 发送给服务端。
- 服务端确认udp握手,并且记录该用户udp远端地址
- 以后客户端和服务端udp通信,每个包都包含(id, key),
- 服务端用客户端发上来的(id,key),确认用户身份,并对比远端地址confirm是一个合法用户。
关于 (Full Clone/NAT Type A)
进阶必读:代理协议 UDP 全方位透彻解析 - https://v2xtls.org/%E8%BF%9B%E9%98%B6%E5%BF%85%E8%AF%BB%EF%BC%9A%E4%BB%A3%E7%90%86%E5%8D%8F%E8%AE%AE-udp-%E5%85%A8%E6%96%B9%E4%BD%8D%E9%80%8F%E5%BD%BB%E8%A7%A3%E6%9E%90/