V2ray详解
配置脚本:
https://github.com/hijkpw/scripts
工作机制
单服务器模式
和其它的网络代理工具一样,你需要在一台配置了 V2Ray 的服务器,然后在自己的设备上安装 V2Ray 客户端,然后即可流畅地访问互联网。
一个 V2Ray 服务器可同时支持多台设备,使用不同的代理协议访问。同时,经过合理的配置,V2Ray 可以识别并区分需要代理和不需要代理的流量,直连的流量不需要绕路。
桥接模式
如果你不想在每一台设备上都配置路由,你也可以设置一台中转服务器,用于接收客户端发来的所有流量,然后在服务器中进行转发判断。
工作原理
在配置 V2Ray 之前,不妨先来看一下 V2Ray 的工作原理,以下是单个 V2Ray 进程的内部结构示意图。多个 V2Ray 之间互相独立,互不影响。
需要配置至少一个入站协议(Inbound)和一个出站协议(Outbound)才可以正常工作。
- 入站协议负责与客户端(如浏览器)通信:
- 入站协议通常可以配置用户认证,如 ID 和密码等;
- 入站协议负责与客户端(如浏览器)通信:
入站协议收到数据之后,会交给分发器(Dispatcher)进行分发;
出站协议负责将数据发给服务器,如另一台主机上的 V2Ray。
当有多个出站协议时,可以配置路由(Routing)来指定某一类流量由某一个出站协议发出。
- 路由会在必要时查询 DNS 以获取更多信息来进行判断。
下载安装
平台支持
V2Ray 在以下平台中可用:
Windows 7 及之后版本(x86 / amd64);
Mac OS X 10.10 Yosemite 及之后版本(amd64);
Linux 2.6.23 及之后版本(x86 / amd64 / arm / arm64 / mips64 / mips);
- 包括但不限于 Debian 7 / 8、Ubuntu 12.04 / 14.04 及后续版本、CentOS 6 / 7、Arch Linux;
FreeBSD (x86 / amd64);
OpenBSD (x86 / amd64);
Dragonfly BSD (amd64);
下载 V2Ray
预编译的压缩包可以在如下几个站点找到:
- Github Release: github.com/v2ray/v2ray-core
- Github 分流: github.com/v2ray/dist
- Homebrew: github.com/v2ray/homebrew-v2ray
- Arch Linux: packages/community/x86_64/v2ray/
- Snapcraft: snapcraft.io/v2ray-core
压缩包均为 zip 格式,找到对应平台的压缩包,下载解压即可使用。
验证安装包
V2Ray 提供两种验证方式:
- 安装包 zip 文件的 SHA1 / SHA256 摘要,在每个安装包对应的
.dgst
文件中可以找到。 - 可运行程序(v2ray 或 v2ray.exe)的 gpg 签名,文件位于安装包中的 v2ray.sig 或 v2ray.exe.sig。签名公钥可以在代码库中找到。
Windows 和 Mac OS 安装方式
通过上述方式下载的压缩包,解压之后可看到 v2ray 或 v2ray.exe。直接运行即可。
Linux 发行版仓库
部分发行版可能已收录 V2Ray 到其官方维护和支持的软件仓库/软件源中。出于兼容性、适配性考虑,您可以考虑选用由您发行版开发团队维护的软件包或下文的安装脚本亦或基于已发布的二进制文件或源代码安装。
Linux 安装脚本
V2Ray 提供了一个在 Linux 中的自动化安装脚本。这个脚本会自动检测有没有安装过 V2Ray,如果没有,则进行完整的安装和配置;如果之前安装过 V2Ray,则只更新 V2Ray 二进制程序而不更新配置。
以下指令假设已在 su 环境下,如果不是,请先运行 sudo su。
运行下面的指令下载并安装 V2Ray。当 yum 或 apt-get 可用的情况下,此脚本会自动安装 unzip 和 daemon。这两个组件是安装 V2Ray 的必要组件。如果你使用的系统不支持 yum 或 apt-get,请自行安装 unzip 和 daemon
bash <(curl -L -s https://install.direct/go.sh)
此脚本会自动安装以下文件:
/usr/bin/v2ray/v2ray
:V2Ray 程序;/usr/bin/v2ray/v2ctl
:V2Ray 工具;/etc/v2ray/config.json
:配置文件;/usr/bin/v2ray/geoip.dat
:IP 数据文件/usr/bin/v2ray/geosite.dat
:域名数据文件
此脚本会配置自动运行脚本。自动运行脚本会在系统重启之后,自动运行 V2Ray。目前自动运行脚本只支持带有 Systemd 的系统,以及 Debian / Ubuntu 全系列。
运行脚本位于系统的以下位置:
/etc/systemd/system/v2ray.service
: Systemd/etc/init.d/v2ray
: SysV
脚本运行完成后,你需要:
- 编辑 /etc/v2ray/config.json 文件来配置你需要的代理方式;
- 运行 service v2ray start 来启动 V2Ray 进程;
- 之后可以使用 service v2ray start|stop|status|reload|restart|force-reload 控制 V2Ray 的运行。
go.sh 参数
go.sh 支持如下参数,可在手动安装时根据实际情况调整:
-p
或--proxy
: 使用代理服务器来下载 V2Ray 的文件,格式与 curl 接受的参数一致,比如"socks5://127.0.0.1:1080"
或"http://127.0.0.1:3128"
。-f
或--force
: 强制安装。在默认情况下,如果当前系统中已有最新版本的 V2Ray,go.sh 会在检测之后就退出。如果需要强制重装一遍,则需要指定该参数。--version
: 指定需要安装的版本,比如"v1.13"
。默认值为最新版本。--local
: 使用一个本地文件进行安装。如果你已经下载了某个版本的 V2Ray,则可通过这个参数指定一个文件路径来进行安装。
示例:
使用地址为 127.0.0.1:1080 的 SOCKS 代理下载并安装最新版本:
./go.sh -p socks5://127.0.0.1:1080
安装本地的 v1.13 版本:
./go.sh --version v1.13 --local /path/to/v2ray.zip
Docker
V2Ray 提供了两个预编译的 Docker image:
v2ray/official: 包含最新发布的版本,每周跟随新版本更新;
v2ray/dev: 包含由最新的代码编译而成的程序文件,随代码库更新;
两个 image 的文件结构相同:
/etc/v2ray/config.json: 配置文件
/usr/bin/v2ray/v2ray: V2Ray 主程序
/usr/bin/v2ray/v2ctl: V2Ray 辅助工具
/usr/bin/v2ray/geoip.dat: IP 数据文件
/usr/bin/v2ray/geosite.dat: 域名数据文件
新手上路
在下载并安装了 V2Ray 之后,你需要对它进行一下配置。这里介绍一下简单的配置方式,只是为了演示。
客户端
在你的 PC (或手机)中,你需要运行 V2Ray 并使用下面的配置:
{
"inbounds": [{
"port": 1080, // SOCKS 代理端口,在浏览器中需配置代理并指向这个端口
"listen": "127.0.0.1",
"protocol": "socks",
"settings": {
"udp": true
}
}],
"outbounds": [{
"protocol": "vmess",
"settings": {
"vnext": [{
"address": "server", // 服务器地址,请修改为你自己的服务器 ip 或域名
"port": 10086, // 服务器端口
"users": [{ "id": "b831381d-6324-4d53-ad4f-8cda48b30811" }]
}]
}
},{
"protocol": "freedom",
"tag": "direct",
"settings": {}
}],
"routing": {
"domainStrategy": "IPOnDemand",
"rules": [{
"type": "field",
"ip": ["geoip:private"],
"outboundTag": "direct"
}]
}
}
上述配置唯一要改的地方就是你的服务器 IP,配置中已注明。上述配置会把除了局域网(比如访问路由器)之外的所有流量转发到你的服务器。
服务器
然后你需要一台防火墙外的服务器,来运行服务器端的 V2Ray。配置如下:
{
"inbounds": [{
"port": 10086, // 服务器监听端口,必须和上面的一样
"protocol": "vmess",
"settings": {
"clients": [{ "id": "b831381d-6324-4d53-ad4f-8cda48b30811" }]
}
}],
"outbounds": [{
"protocol": "freedom",
"settings": {}
}]
}
服务器的配置中需要确保 id
和端口与客户端一致,就可以正常连接了。
运行
在 Windows 和 macOS 中,配置文件通常是 V2Ray 同目录下的
config.json
文件。直接运行v2ray
或v2ray.exe
即可。在 Linux 中,配置文件通常位于
/etc/v2ray/config.json
文件。运行v2ray --config=/etc/v2ray/config.json
,或使用 systemd 等工具把 V2Ray 作为服务在后台运行。
命令行参数
V2Ray
V2Ray 的程序文件的命令行参数如下:
v2ray [-version] [-test] [-config=config.json] [-format=json]
-version
只输出当前版本然后退出,不运行 V2Ray 主程序。
-test
测试配置文件有效性,如果有问题则输出错误信息,不运行 V2Ray 主程序。
-config
配置文件路径,可选的形式如下:
本地路径,可以是一个绝对路径,或者相对路径。
"stdin:"
: 表示将从标准输入读取配置文件内容,调用者必须在输入完毕后关闭标准输入流。以
http://
或https://
(均为小写)开头: V2Ray 将尝试从这个远程地址加载配置文件。
-format
配置文件格式,可选的值有:
json
: JSON 格式;pb
或protobuf
: Protobuf 格式;
当-config
没有指定时,V2Ray 将先后尝试从以下路径加载config.json
:
工作目录(Working Directory)
环境变量中
v2ray.location.asset
所指定的路径
V2Ctl
V2Ctl 是一个集合,它有若干个子命令组成。全局的命令行形式如下:
v2ctl <command> <options>
command
子命令,有以下选项:
api
: 调用 V2Ray 进程的远程控制指令。config
: 从标准输入读取 JSON 格式的配置,然后从标准输出打印 Protobuf 格式的配置。cert
: 生成 TLS 证书。fetch
: 抓取远程文件。tlsping
: (V2Ray 4.17+) 尝试进行 TLS 握手。verify
: 验证文件是否由 Project V 官方签名。uuid
: 输出一个随机的 UUID。
V2Ctl Api
v2ctl api [--server=127.0.0.1:8080] <Service.Method> <Request>
调用 V2Ray 进程的远程控制指令。示例:
v2ctl api --server=127.0.0.1:8080 LoggerService.RestartLogger ''
V2Ctl Config
v2ctl config
此命令没有参数。它从标准输入读取 JSON 格式的配置,然后从标准输出打印 Protobuf 格式的配置。
V2Ctl Cert
v2ctl cert [--ca] [--domain=v2ray.com] [--expire=240h] [--name="V2Ray Inc"] [--org="V2Ray Inc] [--json] [--file=v2ray]
生成一个 TLS 证书。
--ca
如果指定此选项,将会生成一个 CA 证书。
--domain
证书的 Alternative Name 项。该参数可以多次使用,来指定多个域名。比如--domain=v2ray.com --domain=v2ray.cool
。
--expire
证书有效期。格式为 Golang 的时间长度。
--name
证书的 Command Name 项。
--org
证书的 Orgnization 项。
--json
将生成的证书以 V2Ray 支持的 JSON 格式输出到标准输出。默认开启。
--file
将证书以 PEM 格式输出到文件。当指定 --file=a
时,将生成 a_cert.pem
和 a_key.pem
两个文件。
V2Ctl Fetch
v2ctl fetch <url>
抓取指定的 URL 的内容并输出,只支持 HTTP 和 HTTPS。
V2Ctl TlsPing
v2ctl tlsping <domain> --ip=[ip]
向指定的域名发起 TLS 握手。
domain
目标域名
–ip
此域名的 IP 地址。如果未指定此参数,V2Ctl 将使用系统的 DNS 进行域名解析。
V2Ctl Verify
v2ctl verify [--sig=/path/to/sigfile] <filepath>
此命令用于验证一个文件是否由 Project V 官方签名。
--sig
签名文件路径,默认值为待验证文件加入’.sig’后缀。
filepath
待验证文件路径。
V2Ctl UUID
v2ctl uuid
此命令没有参数。每次运行都会输出一个新的 UUID。
常见问题
一般问题
制作 V2Ray 的目的是什么?
对于已公开的合法信息,人民有自由获取的权利。同时,人民也有言论自由的权利。
是否反对管制?
不反对管制。事实上任何事物都需要管制,以减少大众的生活成本,比如奶粉。但监管需要有法可依、有据可循。民众都认可的监管方式也是合理的,可接受的。
Project V 由谁主导开发?
我们是一群爱好自由的人们。由于政策压力,我们倾向于保持匿名,尽可能地不透露任何身份信息。
V2Ray 使用相关
V2Ray 如何升级
重新下载安装包,或者
如果你使用安装脚本进行安装,重新运行安装脚本即可
V2Ray 闪退
如果你使用 Linux 并开启了 systemd,可以使用
journalctl -u v2ray
查看 V2Ray 退出时的日志;一般情况可以手动运行
v2ray -config=<config-file> -test
来查看错误信息;
兼容性保证
配置文件向后兼容至少一个大版本,即 V2Ray 4.x 可以正常加载 3.x 的配置文件。
所有基于 Protobuf 的通信协议,如 Api,向后兼容至少一个大版本。
所有基于二进制的通信协议,如 Shadowsocks 和 VMess。当服务器版本不低于客户端版本时,保持永久兼容;当客户端版本超过服务器版本时,保持至少 12 个小版本的兼容性。
V2Ray 错误信息
VMess: Invalid User
可能的原因:
- 客户端和服务器端的用户 ID 不匹配;
- 客户端和服务器端的用户 alterId 不匹配;
- 客户端与服务器的时间不匹配,误差不能超过90秒钟;
Shadowsocks: Unknown address type
可能的原因:
- Shadowsocks 协议的加密方式或是密码不匹配;
Socks: Unknown Socks version: 67
可能的原因:
- 你开启的是 Socks 代理,但在浏览器中配置了 HTTP 代理
解决方案:
- 在 V2Ray 中配置一个 HTTP 入站代理,然后把浏览器的设置指向这个代理
其它软件错误
访问 Google 时,浏览器中显示证书无效
错误信息:攻击者可能会试图从 www.google.com 窃取您的信息(例如:密码、通讯内容或信用卡信息)。了解详情 NET::ERR_CERT_COMMON_NAME_INVALID
原因:你的 DNS 缓存可能已被污染。
解决方案:
需要在使用代理的情况下,清空缓存并重新抓取 DNS 数据
在 V2Ray 中可使用
sniffing
功能克服一部分 DNS 污染。
项目授权
Project V 使用以下方式进行授权
V2Ray
源代码以官方发布的安装包,使用 MIT 协议授权。包括以下代码仓库中的源代码及安装包:
官方网站
官方网站(v2ray.com)以知识共享署名 4.0 国际许可协议协议授权。
包括网站中所有可见的文字内容和图片。
包括 Project V 图标文件。
包括生成网站所使用到的源代码,即v2ray/manual。
软件截图和其它文件
第三方所创作的内容,其版权归其创作者所有。Project V 放弃对这些内容的所有权。
包括 Project V 使用过程中的截图。
包括运行 Project V 所需的配置文件。
包括 Project V 运行时产生的日志文件。
其它内容
未在上述提及的内容,其版权视具体情况而定。
配置文件
V2Ray 本身使用基于 Protobuf 的配置。由于 Protobuf 的文本格式不方便阅读,V2Ray 同时也支持 JSON 格式的配置。在运行之前,V2Ray 会自动将 JSON 转换为对应的 Protobuf。换言之,V2Ray 将来也可能会支持其它格式的配置。
以下介绍一下基于 JSON 格式的配置。
JSON,全称 JavaScript Object Notation,简而言之是 Javascript 中的对象(Object)。一个 JSON 文件包含一个完整的对象,以大括号“{”开头,大括号“}”结束。
一个 JSON 对象包含一系列的键值对(Key-Value Pair),一个键是一个字符串(String),而值有多种类型,常见的有字符串(String)、数字(Number)、布尔(Bool)、数组(Array)和对象(Object)。下面是一个简单的 JSON 对象示例:
{
"stringValue": "This is a string.",
"numberValue": 42,
"boolValue": true,
"arrayValue": ["this", "is", "a", "string", "array"],
"objectValue": {
"another": "object"
}
}
V2Ray 的 JSON 格式支持注释,可使用“//”或者“/* */”来进行注释。在不支持注释的编辑器中可能被显示为“错误”,但实际上是可以正常使用的。
JSON 数据类型
这里介绍一下常用的数据类型,在之后其它的配置中会用到。
boolean
: true | false
布尔值,只有true
和false
两种取值,不带引号。
number
数字,在 V2Ray 的使用中通常为非负整数,即0
、53
…… 数字在 JSON 格式中不带引号。
string
字符串,由引号包含的一串字符,如无特殊说明,字符的内容不限。
array
: []
数组,由方括号包含的一组元素,如字符串数组表示为[string]
。
object
: {}
对象,一组键值对。样例见本文上方的示例。
通常一个键值对的后面需要有一个逗号”,”,但如果这个键值对后面紧跟一个大括号”}”的话,则一定不能有逗号。
V2Ray 常用数据类型
map
: object {string:string}
一组键值对,其类型在括号内指出。每一个键和值的类型对应相同。
address
: string
字符串,表示一个 IP 地址或域名,形如:"8.8.8.8"
或 "www.v2ray.com"
address_port
: string
字符串,表示一个地址和端口,常见的形式如:"8.8.8.8:53"
,或者 "www.v2ray.com:80"
。在一部分配置中,地址部分可以省略,如":443"
。
配置文件格式
V2Ray 的配置文件形式如下,客户端和服务器通用一种形式,只是实际的配置不一样。
{
"log": {},
"api": {},
"dns": {},
"stats": {},
"routing": {},
"policy": {},
"reverse": {},
"inbounds": [],
"outbounds": [],
"transport": {}
}
log
: LogObject
日志配置,表示 V2Ray 如何输出日志。
api
: ApiObject
内置的远程控置 API。
dns
: DnsObject
内置的 DNS 服务器,若此项不存在,则默认使用本机的 DNS 设置。
routing
: RoutingObject
policy
: PolicyObject
本地策略可进行一些权限相关的配置
inbounds
: [InboundObject]
一个数组,每个元素是一个入站连接配置。
outbounds
: [OutboundObject]
一个数组,每个元素是一个出站连接配置。列表中的第一个元素作为主出站协议。当路由匹配不存在或没有匹配成功时,流量由主出站协议发出。
transport
: TransportObject
用于配置 V2Ray 如何与其它服务器建立和使用网络连接。详见底层传输配置
stats
: StatsObject
当此项存在时,开启统计信息。
reverse
: ReverseObject
反向代理配置。
LogObject
{
"access": "文件地址",
"error": "文件地址",
"loglevel": "warning"
}
access
: string
访问日志的文件地址,其值是一个合法的文件地址,如"/tmp/v2ray/_access.log"
(Linux)或者"C:\\Temp\\v2ray\\_access.log"
(Windows)。当此项不指定或为空值时,表示将日志输出至 stdout。V2Ray 4.20 加入了特殊值none
,即关闭access log。
error
: string
错误日志的文件地址,其值是一个合法的文件地址,如"/tmp/v2ray/_error.log"
(Linux)或者"C:\\Temp\\v2ray\\_error.log"
(Windows)。当此项不指定或为空值时,表示将日志输出至 stdout。V2Ray 4.20 加入了特殊值none
,即关闭error log(跟loglevel: "none"
等价)。
loglevel
: “debug” | “info” | “warning” | “error” | “none”
错误日志的级别。默认值为"warning"
。
"debug"
: 只有开发人员能看懂的信息。同时包含所有"info"
内容。"info"
: V2Ray 在运行时的状态,不影响正常使用。同时包含所有"warning"
内容。"warning"
: V2Ray 遇到了一些问题,通常是外部问题,不影响 V2Ray 的正常运行,但有可能影响用户的体验。同时包含所有"error"
内容。"error"
: V2Ray 遇到了无法正常运行的问题,需要立即解决。"none"
: 不记录任何内容。
InboundObject
入站连接用于接收从客户端(浏览器或上一级代理服务器)发来的数据,可用的协议请见协议列表。
{
"port": 1080,
"listen": "127.0.0.1",
"protocol": "协议名称",
"settings": {},
"streamSettings": {},
"tag": "标识",
"sniffing": {
"enabled": false,
"destOverride": ["http", "tls"]
},
"allocate": {
"strategy": "always",
"refresh": 5,
"concurrency": 3
}
}
port
: number | “env:variable” | string
端口。接受的格式如下:
整型数值: 实际的端口号。
环境变量: 以
"env:"
开头,后面是一个环境变量的名称,如"env:PORT"
。V2Ray 会以字符串形式解析这个环境变量。字符串: 可以是一个数值类型的字符串,如
"1234"
;或者一个数值范围,如"5-10"
表示端口 5 到端口 10 这 6 个端口。
当只有一个端口时,V2Ray 会在此端口监听入站连接。当指定了一个端口范围时,取决于allocate
设置。
listen
: address
监听地址,只允许 IP 地址,默认值为"0.0.0.0"
,表示接收所有网卡上的连接。除此之外,必须指定一个现有网卡的地址。
protocol
: string
连接协议名称,可选的值见协议列表。
settings
: InboundConfigurationObject
具体的配置内容,视协议不同而不同。详见每个协议中的InboundConfigurationObject
。
streamSettings
: StreamSettingsObject。
tag
: string
此入站连接的标识,用于在其它的配置中定位此连接。当其不为空时,其值必须在所有tag
中唯一。
sniffing
: SniffingObject
尝试探测流量的类型
allocate
: AllocateObject
端口分配设置
SniffingObject
{
"enabled": false,
"destOverride": ["http", "tls"]
}
enabled
: true | false
是否开启流量探测。
destOverride
: [“http” | “tls”]
当流量为指定类型时,按其中包括的目标地址重置当前连接的目标。
AllocateObject
{
"strategy": "always",
"refresh": 5,
"concurrency": 3
}
strategy
: “always” | “random”
端口分配策略。"always"
表示总是分配所有已指定的端口,port
中指定了多少个端口,V2Ray 就会监听这些端口。"random"
表示随机开放端口,每隔refresh
分钟在port
范围中随机选取concurrency
个端口来监听。
refresh
: number
随机端口刷新间隔,单位为分钟。最小值为2
,建议值为5
。这个属性仅当strategy = random
时有效。
concurrency
: number
随机端口数量。最小值为1
,最大值为port
范围的三分之一。建议值为3
。
OutboundObject
出站连接用于向远程网站或下一级代理服务器发送数据,可用的协议请见协议列表。
{
"sendThrough": "0.0.0.0",
"protocol": "协议名称",
"settings": {},
"tag": "标识",
"streamSettings": {},
"proxySettings": {
"tag": "another-outbound-tag"
},
"mux": {}
}
sendThrough
: address
用于发送数据的 IP 地址,当主机有多个 IP 地址时有效,默认值为"0.0.0.0"
。
protocol
: string
连接协议名称,可选的值见协议列表。
settings
: OutboundConfigurationObject
具体的配置内容,视协议不同而不同。详见每个协议中的OutboundConfigurationObject
。
tag
: string
此出站连接的标识,用于在其它的配置中定位此连接。当其值不为空时,必须在所有 tag 中唯一。
streamSettings
: StreamSettingsObject。
proxySettings
: ProxySettingsObject
出站代理配置。当出站代理生效时,此出站协议的streamSettings
将不起作用。
mux
: MuxObject
ProxySettingsObject
{
"tag": "another-outbound-tag"
}
tag
: string
当指定另一个出站协议的标识时,此出站协议发出的数据,将被转发至所指定的出站协议发出。
V2Ray 协议列表
V2Ray 支持以下协议:
Blackhole
名称:
blackhole
类型: 出站协议
Blackhole(黑洞)是一个出站数据协议,它会阻碍所有数据的出站,配合路由(Routing)一起使用,可以达到禁止访问某些网站的效果。
OutboundConfigurationObject
{
"response": {
"type": "none"
}
}
response
: ResponseObject
配置黑洞的响应数据。Blackhole 会在收到待转发数据之后,发送指定的响应数据,然后关闭连接。待转发的数据将被丢弃。如不指定此项,Blackhole 将直接关闭连接。
ResponseObject
{
"type": "none"
}
type
: “http” | “none”
当type
为"none"
(默认值)时,Blackhole将直接关闭连接。当type
为"http"
时,Blackhole会发回一个简单的 HTTP 403 数据包,然后关闭连接。
DNS
名称:
dns
类型: 出站协议
DNS 是一个出站协议,主要用于拦截和转发 DNS 查询。此出站协议只能接收 DNS 流量(包含基于 UDP 和 TCP 协议的查询),其它类型的流量会导致错误。
在处理 DNS 查询时,此出站协议会将 IP 查询(即 A 和 AAAA)转发给内置的 DNS 服务器。其它类型的查询流量将被转发至它们原本的目标地址。
OutboundConfigurationObject
{
"network": "tcp",
"address": "1.1.1.1",
"port": 53
}
network
: “tcp” | “udp”
(V2Ray 4.16+) 修改 DNS 流量的传输层协议,可选的值有"tcp"
和"udp"
。当不指定时,保持来源的传输方式不变。
address
: address
(V2Ray 4.16+) 修改 DNS 服务器地址。当不指定时,保持来源中指定的地址不变。
port
: number
(V2Ray 4.16+) 修改 DNS 服务器端口。当不指定时,保持来源中指定的端口不变。
Dokodemo-door
名称:
dokodemo-door
类型: 入站协议
Dokodemo door(任意门)是一个入站数据协议,它可以监听一个本地端口,并把所有进入此端口的数据发送至指定服务器的一个端口,从而达到端口映射的效果。
InboundConfigurationObject
{
"address": "8.8.8.8",
"port": 53,
"network": "tcp",
"timeout": 0,
"followRedirect": false,
"userLevel": 0
}
address
: address
将流量转发到此地址。可以是一个 IP 地址,形如"1.2.3.4"
,或者一个域名,形如"v2ray.com"
。字符串类型。
当 followRedirect
(见下文)为 true
时,address
可为空。
port
: number
将流量转发到目标地址的指定端口,范围[1, 65535],数值类型。必填参数。
network
: “tcp” | “udp” | “tcp,udp”
可接收的网络协议类型。比如当指定为"tcp"
时,任意门仅会接收 TCP 流量。默认值为"tcp"
。
timeout
: number
入站数据的时间限制(秒),默认值为 300。
V2Ray 3.1 后等价于对应用户等级的 connIdle
策略
followRedirect
: true | false
当值为true
时,dokodemo-door 会识别出由 iptables 转发而来的数据,并转发到相应的目标地址。详见传输配置中的tproxy
设置。
userLevel
: number
用户等级,所有连接都会使用这个用户等级。
透明代理配置样例
V2Ray 中增加一个 dokodemo-door 的入站协议:
{
"network": "tcp,udp",
"timeout": 30,
"followRedirect": true
}
配置 iptables:
# Create new chain
iptables -t nat -N V2RAY
iptables -t mangle -N V2RAY
iptables -t mangle -N V2RAY_MARK
# Ignore your V2Ray server's addresses
# It's very IMPORTANT, just be careful.
iptables -t nat -A V2RAY -d 123.123.123.123 -j RETURN
# Ignore LANs and any other addresses you'd like to bypass the proxy
# See Wikipedia and RFC5735 for full list of reserved networks.
iptables -t nat -A V2RAY -d 0.0.0.0/8 -j RETURN
iptables -t nat -A V2RAY -d 10.0.0.0/8 -j RETURN
iptables -t nat -A V2RAY -d 127.0.0.0/8 -j RETURN
iptables -t nat -A V2RAY -d 169.254.0.0/16 -j RETURN
iptables -t nat -A V2RAY -d 172.16.0.0/12 -j RETURN
iptables -t nat -A V2RAY -d 192.168.0.0/16 -j RETURN
iptables -t nat -A V2RAY -d 224.0.0.0/4 -j RETURN
iptables -t nat -A V2RAY -d 240.0.0.0/4 -j RETURN
# Anything else should be redirected to Dokodemo-door's local port
iptables -t nat -A V2RAY -p tcp -j REDIRECT --to-ports 12345
# Add any UDP rules
ip route add local default dev lo table 100
ip rule add fwmark 1 lookup 100
iptables -t mangle -A V2RAY -p udp --dport 53 -j TPROXY --on-port 12345 --tproxy-mark 0x01/0x01
iptables -t mangle -A V2RAY_MARK -p udp --dport 53 -j MARK --set-mark 1
# Apply the rules
iptables -t nat -A OUTPUT -p tcp -j V2RAY
iptables -t mangle -A PREROUTING -j V2RAY
iptables -t mangle -A OUTPUT -j V2RAY_MARK
Freedom
名称:
freedom
类型:出站协议
Freedom 是一个出站协议,可以用来向任意网络发送(正常的) TCP 或 UDP 数据。
OutboundConfigurationObject
{
"domainStrategy": "AsIs",
"redirect": "127.0.0.1:3366",
"userLevel": 0
}
domainStrategy
: “AsIs” | “UseIP” | “UseIPv4” | “UseIPv6”
在目标地址为域名时,Freedom 可以直接向此域名发出连接("AsIs"
),或者将域名解析为 IP 之后再建立连接("UseIP"
、"UseIPv4"
、"UseIPv6"
)。解析 IP 的步骤会使用 V2Ray 内建的 DNS。默认值为"AsIs"
。
(V2Ray 4.6+) 当使用"UseIP"
模式,并且出站连接配置中指定了sendThrough
时,Freedom 会根据sendThrough
的值自动判断所需的IP类型,IPv4 或 IPv6。
(V2Ray 4.7+) 当使用"UseIPv4"
或"UseIPv6"
模式时,Freedom 会只使用对应的 IPv4 或 IPv6 地址。当sendThrough
指定了不匹配的本地地址时,将导致连接失败。
redirect
: address_port
Freedom 会强制将所有数据发送到指定地址(而不是入站协议指定的地址)。其值为一个字符串,样例:"127.0.0.1:80"
, ":1234"
。当地址不指定时,如":443"
,Freedom 不会修改原先的目标地址。当端口为0
时,如"v2ray.com:0"
,Freedom 不会修改原先的端口。
userLevel
: number
用户等级,所有连接都使用这一等级。
HTTP
名称:
http
类型:入站 / 出站
HTTP 的配置分为两部分,InboundConfigurationObject
和OutboundConfigurationObject
,分别对应入站和出站协议配置中的settings
项。
InboundConfigurationObject
{
"timeout": 0,
"accounts": [
{
"user": "my-username",
"pass": "my-password"
}
],
"allowTransparent": false,
"userLevel": 0
}
应该注意,虽然http inbound
可以提供公共服务,但http协议没有对传输加密,不适宜经公网中传输,更容易成为被人用作攻击的肉鸡。http inbound
更有意义的用法是在局域网或本机环境下监听,为其他程序提供本地服务。
timeout
: number
从客户端读取数据的超时设置(秒),0 表示不限时。默认值为 300。 V2Ray 3.1 后等价于对应用户等级的 connIdle
策略。
accounts
: [AccountObject]
一个数组,数组中每个元素为一个用户帐号。默认值为空。
当 accounts
非空时,HTTP 代理将对入站连接进行 Basic Authentication 验证。
allowTransparent
: true | false
当为true
时,会转发所有 HTTP 请求,而非只是代理请求。若配置不当,开启此选项会导致死循环。
userLevel
: number
用户等级,所有连接使用这一等级。
AccountObject
{
"user": "my-username",
"pass": "my-password"
}
user
: string
用户名,字符串类型。必填。
pass
: string
密码,字符串类型。必填。
在 Linux 中使用以下环境变量即可在当前 session 使用全局 HTTP 代理(很多软件都支持这一设置,也有不支持的)。
export http_proxy=http://127.0.0.1:8080/
(地址须改成你配置的 HTTP 入站代理地址)export https_proxy=$http_proxy
OutboundConfigurationObject
{
"servers": [
{
"address": "192.168.108.1",
"port": 3128,
"users": [
{
"user": "my-username",
"pass": "my-password"
}
]
}
]
}
(V2ray 4.21.0+)
应该注意,虽然http outbound
可以作为对外访问的配置,但http proxy
协议没有对传输加密,不适宜经公网中传输,且因不支持udp传输将会导致core功能受限(Routing过程的的DNS查询不可用)。http outbound
更有意义的用法是在特殊情况下,只能使用http proxy
对外访问内部网络中,作为为其他协议连接代理服务器的前置代理使用(见OutboundObject
的ProxySettingsObject
)。另因http proxy
只能代理tcp协议,udp系的协议均不能通过。
(V2ray 4.21.1+)
4.20.0版本中引入了http outbound作为其他协议的前置代理用法中,缺乏了对tls配置的支持。4.21.1的补丁版本中对streamSettings
中的security
和tlsSettings
保留生效。目前前置代理的用法中,vmess/tcp、vmess/tcp-tls和shadowsocks等三种协议方式可使用,其他传输协议的前置代理用法需后续版本开发支持。
servers
: 数组
HTTP代理服务器配置,若配置多个,循环使用 (RoundRobin)。
address
: string
HTTP代理服务器地址,必填。
port
: int
HTTP代理服务器端口,必填。
user
: [AccountObject]
一个数组,数组中每个元素为一个用户帐号。默认值为空。
MTProto
名称:
mtproto
类型: 入站 / 出站
MTProto 是一个 Telegram 专用的代理协议。在 V2Ray 中可使用一组入站出站代理来完成 Telegram 数据的代理任务。
目前只支持转发到 Telegram 的 IPv4 地址。
InboundConfigurationObject
{
"users": [{
"email": "love@v2ray.com",
"level": 0,
"secret": "b0cbcef5a486d9636472ac27f8e11a9d"
}]
}
users
: [UserObject]
一个数组,其中每一个元素表示一个用户。目前只有第一个用户会生效。
UserObject
{
"email": "love@v2ray.com",
"level": 0,
"secret": "b0cbcef5a486d9636472ac27f8e11a9d"
}
用户邮箱,用于统计流量等辅助功能
level
: number
用户等级。
secret
: string
用户密钥。必须为 32 个字符,仅可包含0
到9
和a
到f
之间的字符。
使用此命令生成 MTProto 代理所需要的用户密钥:openssl rand -hex 16
OutboundConfigurationObject
{
}
样例配置
MTProto 仅可用于 Telegram 数据。你可能需要一个路由来绑定对应的入站出站代理。以下是一个不完整的示例:
入站代理:
{
"tag": "tg-in",
"port": 443,
"protocol": "mtproto",
"settings": {
"users": [{"secret": "b0cbcef5a486d9636472ac27f8e11a9d"}]
}
}
出站代理:
{
"tag": "tg-out",
"protocol": "mtproto",
"settings": {}
}
路由:
{
"type": "field",
"inboundTag": ["tg-in"],
"outboundTag": "tg-out"
}
然后使用 Telegram 连接这台机器的 443 端口即可。
Shadowsocks
名称:
shadowsocks
类型:入站 / 出站
Shadowsocks 协议,包含入站和出站两部分,兼容大部分其它版本的实现。
与官方版本的兼容性:
支持 TCP 和 UDP 数据包转发,其中 UDP 可选择性关闭;
支持
OTA
;
- 客户端可选开启或关闭;
服务器端可强制开启、关闭或自适应;
加密方式(其中
AEAD
加密方式在 V2Ray 3.0 中加入):
- aes-256-cfb
aes-128-cfb
chacha20
chacha20-ietf
aes-256-gcm
aes-128-gcm
chacha20-poly1305 或称 chacha20-ietf-poly1305
插件:
- 通过 Standalone 模式支持 obfs
Shadowsocks 的配置分为两部分,InboundConfigurationObject
和OutboundConfigurationObject
,分别对应入站和出站协议配置中的settings
项。
InboundConfigurationObject
{
"email": "love@v2ray.com",
"method": "aes-128-cfb",
"password": "密码",
"level": 0,
"ota": true,
"network": "tcp"
}
邮件地址,可选,用于标识用户
method
: string
必填。可选的值见加密方式列表
password
: string
必填,任意字符串。Shadowsocks 协议不限制密码长度,但短密码会更可能被破解,建议使用 16 字符或更长的密码。
level
: number
用户等级,默认值为 0
。详见本地策略。
ota
: true | false
是否强制 OTA,如果不指定此项,则自动判断。强制开启 OTA 后,V2Ray 会拒绝未启用 OTA 的连接。反之亦然。
当使用 AEAD 时,ota
设置无效
network
: “tcp” | “udp” | “tcp,udp”
可接收的网络连接类型,默认值为"tcp"
。
OutboundConfigurationObject
{
"servers": [
{
"email": "love@v2ray.com",
"address": "127.0.0.1",
"port": 1234,
"method": "加密方式",
"password": "密码",
"ota": false,
"level": 0
}
]
}
servers
: [ServerObject]
一个数组,其中每一项是一个 ServerObject。
ServerObject
{
"email": "love@v2ray.com",
"address": "127.0.0.1",
"port": 1234,
"method": "加密方式",
"password": "密码",
"ota": false,
"level": 0
}
邮件地址,可选,用于标识用户
address
: address
Shadowsocks 服务器地址,支持 IPv4、IPv6 和域名。必填。
port
: number
Shadowsocks 服务器端口。必填。
method
: string
必填。可选的值见加密方式列表
password
: string
必填。任意字符串。Shadowsocks 协议不限制密码长度,但短密码会更可能被破解,建议使用 16 字符或更长的密码。
ota
: true | false
是否开启 Shadowsocks 的一次验证(One time auth),默认值为false
。
当使用 AEAD 时,ota
设置无效。
level
: number
用户等级
加密方式列表
"aes-256-cfb"
"aes-128-cfb"
"chacha20"
"chacha20-ietf"
"aes-256-gcm"
"aes-128-gcm"
"chacha20-poly1305"
或"chacha20-ietf-poly1305"
Socks
名称:
socks
类型:入站 / 出站
标准 Socks 协议实现,兼容 Socks 4、Socks 4a 和 Socks 5。
Socks 的配置分为两部分,InboundConfigurationObject
和OutboundConfigurationObject
,分别对应入站和出站协议配置中的settings
项。
OutboundConfigurationObject
{
"servers": [{
"address": "127.0.0.1",
"port": 1234,
"users": [
{
"user": "test user",
"pass": "test pass",
"level": 0
}
]
}]
}
应该注意,虽然socks outbound可以作为对外访问的配置,但socks协议没有对传输加密,不适宜经公网中传输。socks outbound 更有意义的用法是在特殊情况下,只能使用socks proxy对外访问内部网络中,作为为其他协议连接代理服务器的前置代理使用(见OutboundObject
的ProxySettingsObject
)。
servers
: [ ServerObject ]
Socks 服务器列表,其中每一项是一个服务器配置。
ServerObject
{
"address": "127.0.0.1",
"port": 1234,
"users": [
{
"user": "test user",
"pass": "test pass",
"level": 0
}
]
}
address
: address
服务器地址。
仅支持连接到 Socks 5 服务器。
port
: number
服务器端口
users
: [ UserObject ]
用户列表,其中每一项一个用户配置。当列表不为空时,Socks 客户端会使用此用户信息进行认证;如未指定,则不进行认证。
UserObject
{
"user": "test user",
"pass": "test pass",
"level": 0
}
user
: string
用户名
pass
: string
密码
level
: number
用户等级
InboundConfigurationObject
应该注意,虽然socks inbound可以公共服务端口,但socks协议没有对传输加密,不适宜经公网中传输。socks inbound更有意义的用法是在局域网或本机环境下,为其他程序提供本地服务。
{
"auth": "noauth",
"accounts": [
{
"user": "my-username",
"pass": "my-password"
}
],
"udp": false,
"ip": "127.0.0.1",
"userLevel": 0
}
auth
: “noauth” | “password”
Socks 协议的认证方式,支持"noauth"
匿名方式和"password"
用户密码方式。默认值为"noauth"
。
accounts
: [ AccountObject ]
一个数组,数组中每个元素为一个用户帐号。默认值为空。此选项仅当 auth
为 password
时有效。
udp
: true | false
是否开启 UDP 协议的支持。默认值为 false
。
ip
: address
当开启 UDP 时,V2Ray 需要知道本机的 IP 地址。默认值为"127.0.0.1"
。
userLevel
: number
用户等级,所有连接使用这一等级。
AccountObject
{
"user": "my-username",
"pass": "my-password"
}
user
: string
用户名
pass
: string
密码
VMess
名称:
vmess
类型:入站 / 出站
VMess 是一个加密传输协议,它分为入站和出站两部分,通常作为 V2Ray 客户端和服务器之间的桥梁。
VMess 依赖于系统时间,请确保使用 V2Ray 的系统 UTC 时间误差在 90 秒之内,时区无关。在 Linux 系统中可以安装ntp
服务来自动同步系统时间。
VMess 的配置分为两部分,InboundConfigurationObject
和OutboundConfigurationObject
,分别对应入站和出站协议配置中的settings
项。
OutboundConfigurationObject
{
"vnext": [
{
"address": "127.0.0.1",
"port": 37192,
"users": [
{
"id": "27848739-7e62-4138-9fd3-098a63964b6b",
"alterId": 4,
"security": "auto",
"level": 0
}
]
}
]
}
vnext
:[ ServerObject ]
一个数组,包含一系列的服务器配置
ServerObject
{
"address": "127.0.0.1",
"port": 37192,
"users": []
}
address
: address
服务器地址,支持 IP 地址或者域名。
port
: number
服务器端口号。
users
: [ UserObject ]
一组服务器认可的用户
UserObject
{
"id": "27848739-7e62-4138-9fd3-098a63964b6b",
"alterId": 4,
"security": "auto",
"level": 0
}
id
:string
VMess 用户的主 ID。必须是一个合法的 UUID。
alterId
:number
为了进一步防止被探测,一个用户可以在主 ID 的基础上,再额外生成多个 ID。这里只需要指定额外的 ID 的数量,推荐值为 4。不指定的话,默认值是 0
。最大值 65535
。这个值不能超过服务器端所指定的值。
level
: number
用户等级
security
: “aes-128-gcm” | “chacha20-poly1305” | “auto” | “none”
加密方式,客户端将使用配置的加密方式发送数据,服务器端自动识别,无需配置。
"aes-128-gcm"
:推荐在 PC 上使用"chacha20-poly1305"
:推荐在手机端使用"auto"
:默认值,自动选择(运行框架为 AMD64、ARM64 或 s390x 时为aes-128-gcm加密方式,其他情况则为 Chacha20-Poly1305 加密方式)"none"
:不加密
推荐使用"auto"
加密方式,这样可以永久保证安全性和兼容性。
InboundConfigurationObject
{
"clients": [
{
"id": "27848739-7e62-4138-9fd3-098a63964b6b",
"level": 0,
"alterId": 4,
"email": "love@v2ray.com"
}
],
"default": {
"level": 0,
"alterId": 4
},
"detour": {
"to": "tag_to_detour"
},
"disableInsecureEncryption": false
}
clients
: [ ClientObject ]
一组服务器认可的用户。clients 可以为空。当此配置用作动态端口时,V2Ray 会自动创建用户。
detour
: DetourObject
指示对应的出站协议使用另一个服务器。
default
: DefaultObject
可选,clients 的默认配置。仅在配合detour
时有效。
disableInsecureEncryption
: true | false
是否禁止客户端使用不安全的加密方式,当客户端指定下列加密方式时,服务器会主动断开连接。默认值为false
。
"none"
"aes-128-cfb"
ClientObject
{
"id": "27848739-7e62-4138-9fd3-098a63964b6b",
"level": 0,
"alterId": 4,
"email": "love@v2ray.com"
}
id
: string
VMess 的用户 ID。必须是一个合法的 UUID。
level
: number
用户等级,详见本地策略
alterId
: number
与上文出站协议中的含义相同。
用户邮箱地址,用于区分不同用户的流量。
alterId
取值的大小和流量特征没有必然联系。对于日常使用,16
以内的值已经够用了。
DetourObject
{
"to": "tag_to_detour"
}
to
: string
一个入站协议的tag
,详见配置文件。指定的入站协议必须是一个 VMess
DefaultObject
{
"level": 0,
"alterId": 4
}
level
: number
用户等级,意义同上。默认值为0
。
alterId
: number
和ClientObject
中的alterId
相同,默认值为64
。推荐值4
。
本地策略
本地策略可以配置一些用户相关的权限,比如连接超时设置。V2Ray 处理的每一个连接,都对应到一个用户,按照这个用户的等级(level)应用不同的策略。本地策略可按照等级的不同而变化。
PolicyObject
PolicyObject
对应配置文件中的policy
项。
{
"levels": {
"0": {
"handshake": 4,
"connIdle": 300,
"uplinkOnly": 2,
"downlinkOnly": 5,
"statsUserUplink": false,
"statsUserDownlink": false,
"bufferSize": 10240
}
},
"system": {
"statsInboundUplink": false,
"statsInboundDownlink": false
}
}
level
: map{string: LevelPolicyObject}
一组键值对,每个键是一个字符串形式的数字(JSON 的要求),比如 "0"
、"1"
等,双引号不能省略,这个数字对应用户等级。每一个值是一个 LevelPolicyObject.
每个入站出站代理现在都可以设置用户等级,V2Ray 会根据实际的用户等级应用不同的本地策略。
system
: SystemPolicyObject
V2Ray 系统的策略
LevelPolicyObject
{
"handshake": 4,
"connIdle": 300,
"uplinkOnly": 2,
"downlinkOnly": 5,
"statsUserUplink": false,
"statsUserDownlink": false,
"bufferSize": 10240
}
handshake
: number
连接建立时的握手时间限制。单位为秒。默认值为4
。在入站代理处理一个新连接时,在握手阶段(比如 VMess 读取头部数据,判断目标服务器地址),如果使用的时间超过这个时间,则中断该连接。
connIdle
: number
连接空闲的时间限制。单位为秒。默认值为300
。在入站出站代理处理一个连接时,如果在 connIdle
时间内,没有任何数据被传输(包括上行和下行数据),则中断该连接。
uplinkOnly
: number
当连接下行线路关闭后的时间限制。单位为秒。默认值为2
。当服务器(如远端网站)关闭下行连接时,出站代理会在等待 uplinkOnly
时间后中断连接。
downlinkOnly
: number
当连接上行线路关闭后的时间限制。单位为秒。默认值为5
。当客户端(如浏览器)关闭上行连接时,入站代理会在等待 downlinkOnly
时间后中断连接。
在 HTTP 浏览的场景中,可以将uplinkOnly
和downlinkOnly
设为0
,以提高连接关闭的效率。
statsUserUplink
: true | false
当值为true
时,开启当前等级的所有用户的上行流量统计。
statsUserDownlink
: true | false
当值为true
时,开启当前等级的所有用户的下行流量统计。
bufferSize
: number
每个连接的内部缓存大小。单位为 kB。当值为0
时,内部缓存被禁用。
默认值 (V2Ray 4.4+):
在 ARM、MIPS、MIPSLE 平台上,默认值为
0
。在 ARM64、MIPS64、MIPS64LE 平台上,默认值为
4
。在其它平台上,默认值为
512
。
默认值 (V2Ray 4.3-):
在 ARM、MIPS、MIPSLE、ARM64、MIPS64、MIPS64LE 平台上,默认值为
16
。在其它平台上,默认值为
2048
。
bufferSize
选项会覆盖环境变量中v2ray.ray.buffer.size
的设定。
SystemPolicyObject
{
"statsInboundUplink": false,
"statsInboundDownlink": false
}
statsInboundUplink
: true | false
当值为true
时,开启所有入站代理的上行流量统计。
statsInboundDownlink
: true | false
当值为true
时,开启所有入站代理的下行流量统计。
路由功能
V2Ray 内建了一个简单的路由功能,可以将入站数据按需求由不同的出站连接发出,以达到按需代理的目的。这一功能的常见用法是分流国内外流量,V2Ray 可以通过内部机制判断不同地区的流量,然后将它们发送到不同的出站代理。
RoutingObject
RoutingObject
对应主配置文件中的routing
项。
{
"domainStrategy": "AsIs",
"rules": [],
"balancers": []
}
domainStrategy
: “AsIs” | “IPIfNonMatch” | “IPOnDemand”
域名解析策略,根据不同的设置使用不同的策略。
"AsIs"
: 只使用域名进行路由选择。默认值。"IPIfNonMatch"
: 当域名没有匹配任何规则时,将域名解析成 IP(A 记录或 AAAA 记录)再次进行匹配;
- 当一个域名有多个 A 记录时,会尝试匹配所有的 A 记录,直到其中一个与某个规则匹配为止;
解析后的 IP 仅在路由选择时起作用,转发的数据包中依然使用原始域名;
"IPOnDemand"
: 当匹配时碰到任何基于 IP 的规则,将域名立即解析为 IP 进行匹配;
rules
: [RuleObject]
对应一个数组,数组中每个元素是一个规则。对于每一个连接,路由将根据这些规则依次进行判断,当一个规则生效时,即将这个连接转发至它所指定的outboundTag
(或balancerTag
,V2Ray 4.4+)。当没有匹配到任何规则时,流量默认由主出站协议发出。
balancers
: [ BalancerObject ]
(V2Ray 4.4+)一个数组,数组中每个元素是一个负载均衡器的配置。当一个规则指向一个负载均衡器时,V2Ray 会通过此负载均衡器选出一个出站协议,然后由它转发流量。
RuleObject
{
"type": "field",
"domain": [
"baidu.com",
"qq.com",
"geosite:cn"
],
"ip": [
"0.0.0.0/8",
"10.0.0.0/8",
"fc00::/7",
"fe80::/10",
"geoip:cn"
],
"port": "53,443,1000-2000",
"network": "tcp",
"source": [
"10.0.0.1"
],
"user": [
"love@v2ray.com"
],
"inboundTag": [
"tag-vmess"
],
"protocol":["http", "tls", "bittorrent"],
"attrs": "attrs[':method'] == 'GET'",
"outboundTag": "direct",
"balancerTag": "balancer"
}
当多个属性同时指定时,这些属性需要同时满足,才可以使当前规则生效。如果多个规则分别使用了domain
或者ip
,需要对应添加多条规则。
type
: “field”
目前只支持"field"
这一个选项。
domain
: [string]
一个数组,数组每一项是一个域名的匹配。有以下几种形式:
纯字符串: 当此字符串匹配目标域名中任意部分,该规则生效。比如”sina.com”可以匹配”sina.com”、”sina.com.cn”和”www.sina.com",但不匹配"sina.cn"。
正则表达式: 由
"regexp:"
开始,余下部分是一个正则表达式。当此正则表达式匹配目标域名时,该规则生效。例如”regexp:\.goo.*\.com$”匹配”www.google.com"、"fonts.googleapis.com",但不匹配"google.com"。子域名 (推荐): 由
"domain:"
开始,余下部分是一个域名。当此域名是目标域名或其子域名时,该规则生效。例如”domain:v2ray.com”匹配”www.v2ray.com"、"v2ray.com",但不匹配"xv2ray.com"。完整匹配: 由
"full:"
开始,余下部分是一个域名。当此域名完整匹配目标域名时,该规则生效。例如”full:v2ray.com”匹配”v2ray.com”但不匹配”www.v2ray.com"。预定义域名列表:由
"geosite:"
开头,余下部分是一个名称,如geosite:google
或者geosite:cn
。名称及域名列表参考预定义域名列表。从文件中加载域名: 形如
"ext:file:tag"
,必须以ext:
(小写)开头,后面跟文件名和标签,文件存放在资源目录中,文件格式与geosite.dat
相同,标签必须在文件中存在。
ip
: [string]
一个数组,数组内每一个元素代表一个 IP 范围。当某一元素匹配目标 IP 时,此规则生效。有以下几种形式:
IP: 形如
"127.0.0.1"
。CIDR: 形如
"10.0.0.0/8"
.GeoIP: 形如
"geoip:cn"
,必须以
geoip:
(小写)开头,后面跟双字符国家代码,支持几乎所有可以上网的国家。
- 特殊值:
"geoip:private"
(V2Ray 3.5+),包含所有私有地址,如127.0.0.1
。
- 特殊值:
从文件中加载 IP: 形如
"ext:file:tag"
,必须以ext:
(小写)开头,后面跟文件名和标签,文件存放在资源目录中,文件格式与geoip.dat
相同标签必须在文件中存在。
"ext:geoip.dat:cn"`等价于`"geoip:cn"
port
:number | string
端口范围,有三种形式:
"a-b"
: a 和 b 均为正整数,且小于 65536。这个范围是一个前后闭合区间,当目标端口落在此范围内时,此规则生效。a
: a 为正整数,且小于 65536。当目标端口为 a 时,此规则生效。(V2Ray 4.18+) 以上两种形式的混合,以逗号”,”分隔。形如:
"53,443,1000-2000"
。
network
: “tcp” | “udp” | “tcp,udp”
可选的值有”tcp”、”udp”或”tcp,udp”,当连接方式是指定的方式时,此规则生效。
source
: [string]
一个数组,数组内每一个元素是一个 IP 或 CIDR。当某一元素匹配来源 IP 时,此规则生效。
user
: [string]
一个数组,数组内每一个元素是一个邮箱地址。当某一元素匹配来源用户时,此规则生效。当前 Shadowsocks 和 VMess 支持此规则。
inboundTag
: [string]
一个数组,数组内每一个元素是一个标识。当某一元素匹配入站协议的标识时,此规则生效。
protocol
: [ “http” | “tls” | “bittorrent” ]
一个数组,数组内每一个元素表示一种协议。当某一个协议匹配当前连接的流量时,此规则生效。必须开启入站代理中的sniffing
选项。
attrs
: string
(V2Ray 4.18+) 一段脚本,用于检测流量的属性值。当此脚本返回真值时,此规则生效。
脚本语言为 Starlark,它的语法是 Python 的子集。脚本接受一个全局变量attrs
,其中包含了流量相关的属性。
目前只有 http 入站代理会设置这一属性。
示例:
检测 HTTP GET:
"attrs[':method'] == 'GET'"
检测 HTTP Path:
"attrs[':path'].startswith('/test')"
检测 Content Type:
"attrs['accept'].index('text/html') >= 0"
outboundTag
: string
对应一个额外出站连接配置的标识。
balancerTag
: string
对应一个负载均衡器的标识。balancerTag
和outboundTag
须二选一。当同时指定时,outboundTag
生效。
BalancerObject
负载均衡器配置。当一个负载均衡器生效时,它会从指定的出站协议中,按配置选出一个最合适的出站协议,进行流量转发。
{
"tag": "balancer",
"selector": []
}
tag
: string
此负载均衡器的标识,用于匹配RuleObject
中的balancerTag
。
selector
: [ string ]
一个字符串数组,其中每一个字符串将用于和出站协议标识的前缀匹配。在以下几个出站协议标识中:[ "a", "ab", "c", "ba" ]
,"selector": ["a"]
将匹配到[ "a", "ab" ]
。
如果匹配到多个出站协议,负载均衡器目前会从中随机选出一个作为最终的出站协议。
预定义域名列表
此列表由 domain-list-community 项目维护,预置于每一个 V2Ray 的安装包中,文件名为geosite.dat
。
这个文件包含了一些常见的域名,可用于路由和 DNS 筛选。常用的域名有:
category-ads
: 包含了常见的广告域名。category-ads-all
: 包含了常见的广告域名,以及广告提供商的域名。cn
: 相当于geolocation-cn
和tld-cn
的合集。google
: 包含了 Google 旗下的所有域名。facebook
: 包含了 Facebook 旗下的所有域名。geolocation-cn
: 包含了常见的国内站点的域名。geolocation-!cn
: 包含了常见的非国内站点的域名。speedtest
: 包含了所有 Speedtest 所用的域名。tld-cn
: 包含了所有 .cn 和 .中国 结尾的域名。
DNS 服务器
V2Ray 内置了一个 DNS 服务器,其有两大主要用途:根据域名的解析IP匹配路由规则,以及像传统的DNS功能,解析目标地址进行连接。
由此 DNS 服务器所发出的 DNS 查询请求,会自动根据路由配置进行转发,无需额外配置。
由于 DNS 协议的复杂性,V2Ray 只支持最基本的 IP 查询(A 和 AAAA 记录)。推荐使用本机 DNS 配合一个额外的 DNS 服务器来做 DNS 查询,如 CoreDNS,以使用完整的 DNS 功能。
注意:在freedom
协议的outbound
中,domainStrategy
默认值为AsIs
,不会使用本DNS服务器进行目的地址解析,如果需要使用应配置为UseIP
。
DNS 处理流程
当某个 DNS 服务器指定的域名列表匹配了当前要查询的域名,V2Ray 会优先使用这个 DNS 服务器进行查询,否则按从上往下的顺序进行查询,同时只返回匹配 expectIPs 的 IP 列表。
DNS服务器的处理流程示意图如下:
DnsObject
DnsObject
对应配置文件中的dns
项。
{
"hosts": {
"baidu.com": "127.0.0.1"
},
"servers": [
{
"address": "1.2.3.4",
"port": 5353,
"domains": [
"domain:v2ray.com"
],
"expectIPs": [
"geoip:cn"
],
},
"8.8.8.8",
"8.8.4.4",
"localhost"
],
"clientIp": "1.2.3.4",
"tag": "dns_inbound"
}
hosts
: map{string: address}
静态 IP 列表,其值为一系列的”域名”:”地址”。其中地址可以是 IP 或者域名。在解析域名时,如果域名匹配这个列表中的某一项,当该项的地址为 IP 时,则解析结果为该项的 IP,而不会使用下述的 servers 进行解析;当该项的地址为域名时,会使用此域名进行 IP 解析,而不使用原始域名。
域名的格式有以下几种形式:
纯字符串: 当此域名完整匹配目标域名时,该规则生效。例如”v2ray.com”匹配”v2ray.com”但不匹配”www.v2ray.com"。
正则表达式: 由
"regexp:"
开始,余下部分是一个正则表达式。当此正则表达式匹配目标域名时,该规则生效。例如”regexp:\.goo.*\.com$”匹配”www.google.com"、"fonts.googleapis.com",但不匹配"google.com"。子域名 (推荐): 由
"domain:"
开始,余下部分是一个域名。当此域名是目标域名或其子域名时,该规则生效。例如”domain:v2ray.com”匹配”www.v2ray.com"、"v2ray.com",但不匹配"xv2ray.com"。子串: 由
"keyword:"
开始,余下部分是一个字符串。当此字符串匹配目标域名中任意部分,该规则生效。比如”keyword:sina.com”可以匹配”sina.com”、”sina.com.cn”和”www.sina.com",但不匹配"sina.cn"。预定义域名列表:由
"geosite:"
开头,余下部分是一个名称,如geosite:google
或者geosite:cn
。名称及域名列表参考预定义域名列表。
servers
: [string | ServerObject ]
一个 DNS 服务器列表,支持的类型有两种:DNS地址(字符串形式)和ServerObject 。
当它的值是一个 DNS IP 地址时,如"8.8.8.8"
,V2Ray 会使用此地址的 53 端口进行 DNS 查询。
当值为"localhost"
时,表示使用本机预设的 DNS 配置。
当值是"https://host:port/dns-query"
的形式,如"https://dns.google/dns-query"
,V2Ray 会使用DNS over HTTPS
(RFC8484, 简称DOH) 进行查询。有些服务商拥有IP别名的证书,可以直接写IP形式,比如https://1.1.1.1/dns-query
。也可使用非标准端口和路径,如"https://a.b.c.d:8443/my-dns-query"
(4.22.0+)
当值是"https+local://host:port/dns-query"
的形式,如"https+local://dns.google/dns-query"
,V2Ray 会使用 DOH本地模式
进行查询,即DOH请求不会经过Routing/Outbound等组件,直接对外请求,以降低耗时。一般适合在服务端使用。也可使用非标端口和路径。(4.22.0+)
当使用 localhost
时,本机的 DNS 请求不受 V2Ray 控制,需要额外的配置才可以使 DNS 请求由 V2Ray 转发。
不同规则初始化得到的DNS客户端会在V2Ray启动日志中以info
级别体现,比如local DOH
remote DOH
udp
等模式。(4.22.0+)
clientIp
: string
当前系统的 IP 地址,用于 DNS 查询时,通知服务器客户端的所在位置。不能是私有地址。
tag
: string
(V2Ray 4.13+) 由此 DNS 发出的查询流量,除localhost
和 DOHL_
模式外,都会带有此标识,可在路由使用inboundTag
进行匹配。
ServerObject
{
"address": "1.2.3.4",
"port": 5353,
"domains": [
"domain:v2ray.com"
],
"expectIPs": [
"geoip:cn"
]
}
address
: address
DNS 服务器地址,如"8.8.8.8"
。对于普通DNS IP地址只支持 UDP 协议的 DNS 服务器,若地址是以”https://“或”https+local://“开头的URL形式,则使用DOH模式,规则同字符串模式的DOH配置。
port
: number
DNS 服务器端口,如53
。此项缺省时默认为53
。当使用DOH模式该项无效,非标端口应在URL中指定。
domains
: [string]
一个域名列表,此列表包含的域名,将优先使用此服务器进行查询。域名格式和路由配置中相同。
expectIPs
:[string]
(V2Ray 4.22.0+) 一个 IP 范围列表,格式和路由配置中相同。
当配置此项时,V2Ray DNS 会对返回的 IP 的进行校验,只返回包含 expectIPs 列表中的地址。
如果未配置此项,会原样返回 IP 地址。
Mux 多路复用
Mux 功能是在一条 TCP 连接上分发多个 TCP 连接的数据。实现细节详见Mux.Cool。Mux 是为了减少 TCP 的握手延迟而设计,而非提高连接的吞吐量。使用 Mux 看视频、下载或者测速通常都有反效果。Mux 只需要在客户端启用,服务器端自动适配。
MuxObject
MuxObject
对应OutboundObject
中的mux
项。
{
"enabled": false,
"concurrency": 8
}
enabled
: true | false
是否启用 Mux 转发请求
concurrency
: number
最大并发连接数。最小值1
,最大值1024
,缺省默认值8
。
特殊值-1
,不加载mux模块。(4.22.0+)
这个数值表示了一个 TCP 连接上最多承载的 Mux 连接数量。当客户端发出了 8 个 TCP 请求,而concurrency=8
时,V2Ray 只会发出一条实际的 TCP 连接,客户端的 8 个请求全部由这个 TCP 连接传输。
远程控制
V2Ray 中可以开放一些 API 以便远程调用。这些 API 都基于 gRPC。
当远程控制开启时,V2Ray 会自建一个出站代理,以tag
配置的值为标识。用户必须手动将所有的 gRPC 入站连接通过路由指向这一出站代理。
ApiObject
ApiObject
对应配置文件中的api
项。
{
"tag": "api",
"services": [
"HandlerService",
"LoggerService",
"StatsService"
]
}
tag
: string
出站代理标识
services
: [string]
开启的 API 列表,可选的值见API 列表。
支持的 API 列表
HandlerService
一些对于入站出站代理进行修改的 API,可用的功能如下:
添加一个新的入站代理;
添加一个新的出站代理;
删除一个现有的入站代理;
删除一个现有的出站代理;
在一个入站代理中添加一个用户(仅支持 VMess);
在一个入站代理中删除一个用户(仅支持 VMess);
LoggerService
支持对内置 Logger 的重启,可配合 logrotate 进行一些对日志文件的操作。
StatsService
内置的数据统计服务,详见统计信息。
统计信息
V2Ray 提供了一些关于其运行状况的统计信息。
StatsObject
StatsObject
对应配置文件中的stats
项。
{
}
目前统计信息没有任何参数,只要StatsObject
项存在,内部的统计即会开启。同时你还需要在 Policy 中开启对应的项,才可以统计对应的数据。
目前已有的统计信息如下:
用户数据
user>>>[email]>>>traffic>>>uplink
特定用户的上行流量,单位字节。
user>>>[email]>>>traffic>>>downlink
特定用户的下行流量,单位字节。
如果对应用户没有指定 Email,则不会开启统计。
全局数据
inbound>>>[tag]>>>traffic>>>uplink
特定入站代理的上行流量,单位字节。
inbound>>>[tag]>>>traffic>>>downlink
特定入站代理的下行流量,单位字节。
反向代理
反向代理是一个 V2Ray 的附加功能,可以把服务器端的流量向客户端转发,即逆向流量转发。
反向代理功能在 V2Ray 4.0+ 可用。目前处于测试阶段,可能会有一些问题。
反向代理的大致工作原理如下:
假设在主机 A 中有一个网页服务器,这台主机没有公网 IP,无法在公网上直接访问。另有一台主机 B,它可以由公网访问。现在我们需要把 B 作为入口,把流量从 B 转发到 A。
在主机 A 中配置一个 V2Ray,称为
bridge
,在 B 中也配置一个 V2Ray,称为portal
。bridge
会向portal
主动建立连接,此连接的目标地址可以自行设定。portal
会收到两种连接,一是由bridge
发来的连接,二是公网用户发来的连接。portal
会自动将两类连接合并。于是bridge
就可以收到公网流量了。bridge
在收到公网流量之后,会将其原封不动地发给主机 A 中的网页服务器。当然,这一步需要路由的协作。bridge
会根据流量的大小进行动态的负载均衡。
反向代理默认已开启 Mux,请不要在其用到的出站代理上再次开启 Mux。
ReverseObject
ReverseObject
对应配置文件中的reverse
项。
{
"bridges": [{
"tag": "bridge",
"domain": "test.v2ray.com"
}],
"portals": [{
"tag": "portal",
"domain": "test.v2ray.com"
}]
}
bridges
: [BridgeObject]
一个数组,每一项表示一个bridge
。每个bridge
的配置是一个 BridgeObject。
portals
: [PortalObject]
一个数组,每一项表示一个portal
。每个portal
的配置是一个 PortalObject。
BridgeObject
{
"tag": "bridge",
"domain": "test.v2ray.com"
}
tag
: string
一个标识,所有由bridge
发出的连接,都会带有这个标识。可以在路由中使用inboundTag
进行识别。
domain
: string
一个域名。bridge
向portal
建立的连接,都会使用这个域名进行发送。这个域名只作为bridge
和portal
的通信用途,不必真实存在。
PortalObject
tag
: string
portal
的标识。在路由中使用outboundTag
将流量转发到这个portal
。
domain
: string
一个域名。当portal
接收到流量时,如果流量的目标域名是此域名,则portal
认为当前连接上bridge
发来的通信连接。而其它流量则会被当成需要转发的流量。portal
所做的工作就是把这两类连接进行识别并拼接。
和其它配置一样,一个 V2Ray 既可以作为bridge
,也可以作为portal
,也可以同时两者,以适用于不同的场景需要。
完整配置
bridge
通常需要两个出站代理,一个用于连接portal
,另一个用于发送实际的流量。也就是说,你需要用路由区分两种流量。
反向代理配置:
{
"bridges": [{
"tag": "bridge",
"domain": "test.v2ray.com"
}]
}
出站代理:
{
"tag": "out",
"protocol": "freedom",
"settings": {
"redirect": "127.0.0.1:80" // 将所有流量转发到网页服务器
}
},
{
"protocol": "vmess",
"settings": {
"vnext": [{
"address": "portal的IP地址",
"port": 1024,
"users": [{"id": "27848739-7e62-4138-9fd3-098a63964b6b"}]
}]
},
"tag": "interconn"
}
路由配置:
"routing": {
"rules": [{
"type": "field",
"inboundTag": ["bridge"],
"domain": ["full:test.v2ray.com"],
"outboundTag": "interconn"
},{
"type": "field",
"inboundTag": ["bridge"],
"outboundTag": "out"
}]
}
portal
通常需要两个入站代理,一个用于接收bridge
的连接,另一个用于接收实际的流量。同时你也需要用路由区分两种流量。
反向代理配置:
{
"portals": [{
"tag": "portal",
"domain": "test.v2ray.com" // 必须和 bridge 的配置一样
}]
}
入站代理:
{
"tag": "external",
"port": 80, // 开放 80 端口,用于接收外部的 HTTP 访问
"protocol": "dokodemo-door",
"settings": {
"address": "127.0.0.1",
"port": 80,
"network": "tcp"
}
},
{
"port": 1024, // 用于接收 bridge 的连接
"tag": "interconn",
"protocol": "vmess",
"settings": {
"clients": [{"id": "27848739-7e62-4138-9fd3-098a63964b6b"}]
}
}
路由配置:
"routing": {
"rules": [{
"type": "field",
"inboundTag": ["external"],
"outboundTag": "portal"
},{
"type": "field",
"inboundTag": ["interconn"],
"outboundTag": "portal"
}]
}
在运行过程中,建议先启用bridge
,再启用portal
。
底层传输配置
底层传输方式(transport)是当前 V2Ray 节点和其它节点对接的方式。底层传输方式提供了稳定的数据传输通道。通常来说,一个网络连接的两端需要有对称的传输方式。比如一端用了 WebSocket,那么另一个端也必须使用 WebSocket,否则无法建立连接。
底层传输(transport)配置分为两部分,一是全局设置(TransportObject),二是分协议配置(StreamSettingsObject)。分协议配置可以指定每个单独的入站出站协议用怎样的方式传输。通常来说客户端和服务器对应的出站入站协议需要使用同样的传输方式。当分协议传输配置指定了一种传输方式,但没有填写其设置时,此传输方式会使用全局配置中的设置。
TransportObject
TransportObject
对应配置文件的transport
项。
{
"tcpSettings": {},
"kcpSettings": {},
"wsSettings": {},
"httpSettings": {},
"dsSettings": {},
"quicSettings": {}
}
tcpSettings
: TcpObject
针对 TCP 连接的配置。
kcpSettings
: KcpObject
针对 mKCP 连接的配置。
wsSettings
: WebSocketObject
针对 WebSocket 连接的配置。
httpSettings
: HttpObject
针对 HTTP/2 连接的配置。
dsSettings
: DomainSocketObject
quicSettings
: QUICObject
(V2Ray 4.7+) 针于QUIC 连接的配置。
StreamSettingsObject
TransportObject
对应出站入站协议中的streamSettings
项。每一个入站、出站连接都可以分别配置不同的传输配置,都可以设置streamSettings
来进行一些传输的配置。
{
"network": "tcp",
"security": "none",
"tlsSettings": {},
"tcpSettings": {},
"kcpSettings": {},
"wsSettings": {},
"httpSettings": {},
"dsSettings": {},
"quicSettings": {},
"sockopt": {
"mark": 0,
"tcpFastOpen": false,
"tproxy": "off"
}
}
network
: “tcp” | “kcp” | “ws” | “http” | “domainsocket” | “quic”
数据流所使用的网络类型,默认值为 "tcp"
security
: “none” | “tls”
是否启入传输层加密,支持的选项有 "none"
表示不加密(默认值),"tls"
表示使用 TLS。
tlsSettings
: TLSObject
TLS 配置。TLS 由 Golang 提供,支持 TLS 1.2,不支持 DTLS。
tcpSettings
: TcpObject
当前连接的 TCP 配置,仅当此连接使用 TCP 时有效。配置内容与上面的全局配置相同。
kcpSettings
: KcpObject
当前连接的 mKCP 配置,仅当此连接使用 mKCP 时有效。配置内容与上面的全局配置相同。
wsSettings
: WebSocketObject
当前连接的 WebSocket 配置,仅当此连接使用 WebSocket 时有效。配置内容与上面的全局配置相同。
httpSettings
: HttpObject
当前连接的 HTTP/2 配置,仅当此连接使用 HTTP/2 时有效。配置内容与上面的全局配置相同。
dsSettings
: DomainSocketObject
当前连接的 Domain socket 配置,仅当此连接使用 Domain socket 时有效。配置内容与上面的全局配置相同。
quicSettings
: QUICObject
(V2Ray 4.7+) 当前连接的 QUIC 配置,仅当此连接使用 QUIC 时有效。配置内容与上面的全局配置相同。
sockopt
: SockoptObject
连接选项
TLSObject
{
"serverName": "v2ray.com",
"allowInsecure": false,
"alpn": ["http/1.1"],
"certificates": [],
"disableSystemRoot": false
}
serverName
: string
指定服务器端证书的域名,在连接由 IP 建立时有用。当目标连接由域名指定时,比如在 Socks 入站时接收到了域名,或者由 Sniffing 功能探测出了域名,这个域名会自动用于serverName
,无须手动配置。
alpn
: [ string ]
一个字符串数组,指定了 TLS 握手时指定的 ALPN 数值。默认值为["http/1.1"]
。
allowInsecure
: true | false
是否允许不安全连接(用于客户端)。当值为true
时,V2Ray 不会检查远端主机所提供的 TLS 证书的有效性。
allowInsecureCiphers
: true | false
是否允许不安全的加密方式。默认情况下 TLS 只使用 TLS 1.3 推荐的加密算法套件,开启这一选项会增加一些与 TLS 1.2 兼容的加密套件。
disableSystemRoot
: true | false
(V2Ray 4.18+) 是否禁用操作系统自带的 CA 证书。默认值为false
。当值为true
时,V2Ray 只会使用certificates
中指定的证书进行 TLS 握手。
certificates
: [ CertificateObject ]
证书列表,其中每一项表示一个证书
CertificateObject
{
"usage": "encipherment",
"certificateFile": "/path/to/certificate.crt",
"keyFile": "/path/to/key.key",
"certificate": [
"-----BEGIN CERTIFICATE-----",
"MIICwDCCAaigAwIBAgIRAO16JMdESAuHidFYJAR/7kAwDQYJKoZIhvcNAQELBQAw",
"ADAeFw0xODA0MTAxMzU1MTdaFw0xODA0MTAxNTU1MTdaMAAwggEiMA0GCSqGSIb3",
"DQEBAQUAA4IBDwAwggEKAoIBAQCs2PX0fFSCjOemmdm9UbOvcLctF94Ox4BpSfJ+",
"3lJHwZbvnOFuo56WhQJWrclKoImp/c9veL1J4Bbtam3sW3APkZVEK9UxRQ57HQuw",
"OzhV0FD20/0YELou85TwnkTw5l9GVCXT02NG+pGlYsFrxesUHpojdl8tIcn113M5",
"pypgDPVmPeeORRf7nseMC6GhvXYM4txJPyenohwegl8DZ6OE5FkSVR5wFQtAhbON",
"OAkIVVmw002K2J6pitPuJGOka9PxcCVWhko/W+JCGapcC7O74palwBUuXE1iH+Jp",
"noPjGp4qE2ognW3WH/sgQ+rvo20eXb9Um1steaYY8xlxgBsXAgMBAAGjNTAzMA4G",
"A1UdDwEB/wQEAwIFoDATBgNVHSUEDDAKBggrBgEFBQcDATAMBgNVHRMBAf8EAjAA",
"MA0GCSqGSIb3DQEBCwUAA4IBAQBUd9sGKYemzwPnxtw/vzkV8Q32NILEMlPVqeJU",
"7UxVgIODBV6A1b3tOUoktuhmgSSaQxjhYbFAVTD+LUglMUCxNbj56luBRlLLQWo+",
"9BUhC/ow393tLmqKcB59qNcwbZER6XT5POYwcaKM75QVqhCJVHJNb1zSEE7Co7iO",
"6wIan3lFyjBfYlBEz5vyRWQNIwKfdh5cK1yAu13xGENwmtlSTHiwbjBLXfk+0A/8",
"r/2s+sCYUkGZHhj8xY7bJ1zg0FRalP5LrqY+r6BckT1QPDIQKYy615j1LpOtwZe/",
"d4q7MD/dkzRDsch7t2cIjM/PYeMuzh87admSyL6hdtK0Nm/Q",
"-----END CERTIFICATE-----"
],
"key": [
"-----BEGIN RSA PRIVATE KEY-----",
"MIIEowIBAAKCAQEArNj19HxUgoznppnZvVGzr3C3LRfeDseAaUnyft5SR8GW75zh",
"bqOeloUCVq3JSqCJqf3Pb3i9SeAW7Wpt7FtwD5GVRCvVMUUOex0LsDs4VdBQ9tP9",
"GBC6LvOU8J5E8OZfRlQl09NjRvqRpWLBa8XrFB6aI3ZfLSHJ9ddzOacqYAz1Zj3n",
"jkUX+57HjAuhob12DOLcST8np6IcHoJfA2ejhORZElUecBULQIWzjTgJCFVZsNNN",
"itieqYrT7iRjpGvT8XAlVoZKP1viQhmqXAuzu+KWpcAVLlxNYh/iaZ6D4xqeKhNq",
"IJ1t1h/7IEPq76NtHl2/VJtbLXmmGPMZcYAbFwIDAQABAoIBAFCgG4phfGIxK9Uw",
"qrp+o9xQLYGhQnmOYb27OpwnRCYojSlT+mvLcqwvevnHsr9WxyA+PkZ3AYS2PLue",
"C4xW0pzQgdn8wENtPOX8lHkuBocw1rNsCwDwvIguIuliSjI8o3CAy+xVDFgNhWap",
"/CMzfQYziB7GlnrM6hH838iiy0dlv4I/HKk+3/YlSYQEvnFokTf7HxbDDmznkJTM",
"aPKZ5qbnV+4AcQfcLYJ8QE0ViJ8dVZ7RLwIf7+SG0b0bqloti4+oQXqGtiESUwEW",
"/Wzi7oyCbFJoPsFWp1P5+wD7jAGpAd9lPIwPahdr1wl6VwIx9W0XYjoZn71AEaw4",
"bK4xUXECgYEA3g2o9WqyrhYSax3pGEdvV2qN0VQhw7Xe+jyy98CELOO2DNbB9QNJ",
"8cSSU/PjkxQlgbOJc8DEprdMldN5xI/srlsbQWCj72wXxXnVnh991bI2clwt7oYi",
"pcGZwzCrJyFL+QaZmYzLxkxYl1tCiiuqLm+EkjxCWKTX/kKEFb6rtnMCgYEAx0WR",
"L8Uue3lXxhXRdBS5QRTBNklkSxtU+2yyXRpvFa7Qam+GghJs5RKfJ9lTvjfM/PxG",
"3vhuBliWQOKQbm1ZGLbgGBM505EOP7DikUmH/kzKxIeRo4l64mioKdDwK/4CZtS7",
"az0Lq3eS6bq11qL4mEdE6Gn/Y+sqB83GHZYju80CgYABFm4KbbBcW+1RKv9WSBtK",
"gVIagV/89moWLa/uuLmtApyEqZSfn5mAHqdc0+f8c2/Pl9KHh50u99zfKv8AsHfH",
"TtjuVAvZg10GcZdTQ/I41ruficYL0gpfZ3haVWWxNl+J47di4iapXPxeGWtVA+u8",
"eH1cvgDRMFWCgE7nUFzE8wKBgGndUomfZtdgGrp4ouLZk6W4ogD2MpsYNSixkXyW",
"64cIbV7uSvZVVZbJMtaXxb6bpIKOgBQ6xTEH5SMpenPAEgJoPVts816rhHdfwK5Q",
"8zetklegckYAZtFbqmM0xjOI6bu5rqwFLWr1xo33jF0wDYPQ8RHMJkruB1FIB8V2",
"GxvNAoGBAM4g2z8NTPMqX+8IBGkGgqmcYuRQxd3cs7LOSEjF9hPy1it2ZFe/yUKq",
"ePa2E8osffK5LBkFzhyQb0WrGC9ijM9E6rv10gyuNjlwXdFJcdqVamxwPUBtxRJR",
"cYTY2HRkJXDdtT0Bkc3josE6UUDvwMpO0CfAETQPto1tjNEDhQhT",
"-----END RSA PRIVATE KEY-----"
]
}
usage
: “encipherment” | “verify” | “issue”
证书用途,默认值为"encipherment"
"encipherment"
: 证书用于 TLS 认证和加密。"verify"
: 证书用于验证远端 TLS 的证书。当使用此项时,当前证书必须为 CA 证书。"issue"
: 证书用于签发其它证书。当使用此项时,当前证书必须为 CA 证书。
在 Windows 平台上可以将自签名的 CA 证书安装到系统中,即可验证远端 TLS 的证书。
当有新的客户端请求时,假设所指定的serverName
为"v2ray.com"
,V2Ray 会先从证书列表中寻找可用于"v2ray.com"
的证书,如果没有找到,则使用任一usage
为"issue"
的证书签发一个适用于"v2ray.com"
的证书,有效期为一小时。并将新的证书加入证书列表,以供后续使用。
certificateFile
: string
证书文件路径,如使用 OpenSSL 生成,后缀名为 .crt。
使用v2ctl cert -ca
可以生成自签名的 CA 证书。
certificate
: [ string ]
一个字符串数组,表示证书内容,格式如样例所示。certificate
和certificateFile
二者选一。
keyFile
: string
密钥文件路径,如使用 OpenSSL 生成,后缀名为 .key。目前暂不支持需要密码的 key 文件。
key
: [ string ]
一个字符串数组,表示密钥内容,格式如样例如示。key
和keyFile
二者选一。
当certificateFile
和certificate
同时指定时,V2Ray 优先使用certificateFile
。keyFile
和key
也一样。
当usage
为"verify"
时,keyFile
和key
可均为空。
SockoptObject
{
"mark": 0,
"tcpFastOpen": false,
"tproxy": "off"
}
mark
: number
一个整数。当其值非零时,在出站连接上标记 SO_MARK。
仅适用于 Linux 系统。
需要 CAP_NET_ADMIN 权限。
tcpFastOpen
: true | false
是否启用 TCP Fast Open。当其值为true
时,强制开启TFO;当其它为false
时,强制关闭TFO;当此项不存在时,使用系统默认设置。可用于入站出站连接。
仅在以下版本(或更新版本)的操作系统中可用:
- Windows 10 (1604)
Mac OS 10.11 / iOS 9
Linux 3.16: 系统已默认开启,无需要配置。
tproxy
: “redirect” | “tproxy” | “off”
是否开启透明代理 (仅适用于 Linux)。
"redirect"
: 使用 Redirect 模式的透明代理。仅支持 TCP/IPv4 和 UDP 连接。"tproxy"
: 使用 TProxy 模式的透明代理。支持 TCP 和 UDP 连接。"off"
: 关闭透明代理。
透明代理需要 Root 或 CAP_NET_ADMIN 权限。
当 Dokodemo-door 中指定了followRedirect
,且sockopt.tproxy
为空时,sockopt.tproxy
的值会被设为"redirect"
。
TCP 传输方式
TcpObject
{
"header": {
"type": "none"
}
}
header
: NoneHeaderObject | HttpHeaderobject
数据包头部伪装设置,默认值为NoneHeaderObject
。
NoneHeaderObject
不进行伪装
{
"type": "none"
}
type
: “none”
指定不进行伪装
HttpHeaderObject
HTTP 伪装配置必须在对应的入站出站连接上同时配置,且内容必须一致。
{
"type": "http",
"request": {},
"response": {}
}
type
: “http”
指定进行 HTTP 伪装
request
: HTTPRequestObject
HTTP 请求
response
: HTTPResponseObject
HTTP 响应
HTTPRequestObject
{
"version": "1.1",
"method": "GET",
"path": ["/"],
"headers": {
"Host": ["www.baidu.com", "www.bing.com"],
"User-Agent": [
"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36",
"Mozilla/5.0 (iPhone; CPU iPhone OS 10_0_2 like Mac OS X) AppleWebKit/601.1 (KHTML, like Gecko) CriOS/53.0.2785.109 Mobile/14A456 Safari/601.1.46"
],
"Accept-Encoding": ["gzip, deflate"],
"Connection": ["keep-alive"],
"Pragma": "no-cache"
}
}
version
: string
HTTP 版本,默认值为"1.1"
。
method
: string
HTTP 方法,默认值为"GET"
。
path
: [ string ]
路径,一个字符串数组。默认值为["/"]
。当有多个值时,每次请求随机选择一个值。
headers
: map{ string, [ string ]}
HTTP 头,一个键值对,每个键表示一个 HTTP 头的名称,对应的值是一个数组。每次请求会附上所有的键,并随机选择一个对应的值。默认值见上方示例。
HTTPResponseObject
{
"version": "1.1",
"status": "200",
"reason": "OK",
"headers": {
"Content-Type": ["application/octet-stream", "video/mpeg"],
"Transfer-Encoding": ["chunked"],
"Connection": ["keep-alive"],
"Pragma": "no-cache"
}
}
version
: string
HTTP 版本,默认值为"1.1"
。
status
: string
HTTP 状态,默认值为"200"
。
reason
: string
HTTP 状态说明,默认值为"OK"
。
headers
: map{string, [ string ]}
HTTP 头,一个键值对,每个键表示一个 HTTP 头的名称,对应的值是一个数组。每次请求会附上所有的键,并随机选择一个对应的值。默认值见上方示例。
mKCP 传输方式
mKCP 使用 UDP 来模拟 TCP 连接,请确定主机上的防火墙配置正确。mKCP 牺牲带宽来降低延迟。传输同样的内容,mKCP 一般比 TCP 消耗更多的流量。
KcpObject
{
"mtu": 1350,
"tti": 20,
"uplinkCapacity": 5,
"downlinkCapacity": 20,
"congestion": false,
"readBufferSize": 1,
"writeBufferSize": 1,
"header": {
"type": "none"
}
}
mtu
: number
最大传输单元(maximum transmission unit),请选择一个介于 576
- 1460
之间的值。默认值为 1350
。
tti
: number
传输时间间隔(transmission time interval),单位毫秒(ms),mKCP 将以这个时间频率发送数据。请选译一个介于 10
- 100
之间的值。默认值为 50
。
uplinkCapacity
: number
上行链路容量,即主机发出数据所用的最大带宽,单位 MB/s,默认值 5
。注意是 Byte 而非 bit。可以设置为 0
,表示一个非常小的带宽。
downlinkCapacity
: number
下行链路容量,即主机接收数据所用的最大带宽,单位 MB/s,默认值 20
。注意是 Byte 而非 bit。可以设置为 0
,表示一个非常小的带宽。
uplinkCapacity
和 downlinkCapacity
决定了 mKCP 的传输速度。以客户端发送数据为例,客户端的 uplinkCapacity
指定了发送数据的速度,而服务器端的 downlinkCapacity
指定了接收数据的速度。两者的值以较小的一个为准。推荐把 downlinkCapacity
设置为一个较大的值,比如 100,而 uplinkCapacity
设为实际的网络速度。当速度不够时,可以逐渐增加 uplinkCapacity
的值,直到带宽的两倍左右。
congestion
: true | false
是否启用拥塞控制,默认值为 false
。开启拥塞控制之后,V2Ray 会自动监测网络质量,当丢包严重时,会自动降低吞吐量;当网络畅通时,也会适当增加吞吐量。
readBufferSize
: number
单个连接的读取缓冲区大小,单位是 MB。默认值为 2
。
writeBufferSize
: number
单个连接的写入缓冲区大小,单位是 MB。默认值为 2
。
readBufferSize
和 writeBufferSize
指定了单个连接所使用的内存大小。在需要高速传输时,指定较大的 readBufferSize
和 writeBufferSize
会在一定程度上提高速度,但也会使用更多的内存。在网速不超过 20MB/s 时,默认值 1MB 可以满足需求;超过之后,可以适当增加 readBufferSize
和 writeBufferSize
的值,然后手动平衡速度和内存的关系。
header
: HeaderObject
数据包头部伪装设置
HeaderObject
{
"type": "none"
}
type
: string
伪装类型,可选的值有:
"none"
: 默认值,不进行伪装,发送的数据是没有特征的数据包。"srtp"
: 伪装成 SRTP 数据包,会被识别为视频通话数据(如 FaceTime)。"utp"
: 伪装成 uTP 数据包,会被识别为 BT 下载数据。"wechat-video"
: 伪装成微信视频通话的数据包。"dtls"
: 伪装成 DTLS 1.2 数据包。"wireguard"
: 伪装成 WireGuard 数据包。(并不是真正的 WireGuard 协议)
对 KCP 协议的改进
更小的协议头
原生 KCP 协议使用了 24 字节的固定头部,而 mKCP 修改为数据包 18 字节,确认(ACK)包 16 字节。更小的头部有助于躲避特征检查,并加快传输速度。
另外,原生 KCP 的单个确认包只能确认一个数据包已收到,也就是说当 KCP 需要确认 100 个数据已收到时,它会发出 24 * 100 = 2400 字节的数据。其中包含了大量重复的头部数据,造成带宽的浪费。mKCP 会对多个确认包进行压缩,100 个确认包只需要 16 + 2 + 100 * 4 = 418 字节,相当于原生的六分之一。
确认包重传
原生 KCP 协议的确认(ACK)包只发送一次,如果确认包丢失,则一定会导致数据重传,造成不必要的带宽浪费。而 mKCP 会以一定的频率重发确认包,直到发送方确认为止。单个确认包的大小为 22 字节,相比起数据包的 1000 字节以上,重传确认包的代价要小得多。
连接状态控制
mKCP 可以有效地开启和关闭连接。当远程主机主动关闭连接时,连接会在两秒钟之内释放;当远程主机断线时,连接会在最多 30 秒内释放。
原生 KCP 不支持这个场景。
WebSocket 传输方式
使用标准的 WebSocket 来传输数据。WebSocket 连接可以被其它 HTTP 服务器(如 NGINX)分流。
Websocket 会识别 HTTP 请求的 X-Forwarded-For 头来用做流量的源地址。
示例配置
{
"path": "/",
"headers": {
"Host": "v2ray.com"
}
}
path
string
WebSocket 所使用的 HTTP 协议路径,默认值为 "/"
。
headers
: map{string: string}
自定义 HTTP 头,一个键值对,每个键表示一个 HTTP 头的名称,对应的值是字符串。默认值为空。
HTTP/2 传输方式
V2Ray 3.17 中加入了基于 HTTP/2 的传输方式。它完整按照 HTTP/2 标准实现,可以通过其它的 HTTP 服务器(如 Nginx)进行中转。
由 HTTP/2 的建议,客户端和服务器必须同时开启 TLS 才可以正常使用这个传输方式。
V2Ray 4.20 中对服务端的TLS配置的强制条件移除,为了在特殊用途的分流部署环境中,由外部网关组件完成TLS层对话,V2Ray作为后端应用,网关和V2Ray间使用称为h2c
的明文http/2进行通讯。
HttpObject
HttpObject
对应传输配置中的httpSettings
项。
{
"host": ["v2ray.com"],
"path": "/random/path"
}
host
: [string]
一个字符串数组,每一个元素是一个域名。客户端会随机从列表中选出一个域名进行通信,服务器会验证域名是否在列表中。
path
string
HTTP 路径,由/
开头。客户端和服务器必须一致。可选参数,默认值为"/"
。
DomainSocket 传输方式
Domain Socket 使用标准的 Unix domain socket 来传输数据。它的优势是使用了操作系统内建的传输通道,而不会占用网络缓存。相比起本地环回网络(local loopback)来说,Domain socket 速度略快一些。
目前仅可用于支持 Unix domain socket 的平台,如 macOS 和 Linux。在 Windows 上不可用。
如果指定了 domain socket 作为传输方式,在入站出站代理中配置的端口和 IP 地址将会失效,所有的传输由 domain socket 取代。
DomainSocketObject
DomainSocketObject
对应传输配置中的dsSettings
项。
{
"path": "/path/to/ds/file"
}
path
: string
一个合法的文件路径。在运行 V2Ray 之前,这个文件必须不存在。
QUIC 传输方式
QUIC 全称 Quick UDP Internet Connection,是由 Google 提出的使用 UDP 进行多路并发传输的协议。其主要优势是:
- 减少了握手的延迟(1-RTT 或 0-RTT)
- 多路复用,并且没有 TCP 的阻塞问题
- 连接迁移,(主要是在客户端)当由 Wifi 转移到 4G 时,连接不会被断开。
QUIC 目前处于实验期,使用了正在标准化过程中的 IETF 实现,不能保证与最终版本的兼容性。
版本历史
V2Ray 4.7:
开始支持 QUIC。
默认设定:
- 12 字节的 Connection ID
30 秒没有数据通过时自动断开连接 (可能会影响一些长连接的使用)
QuicObject
QUIC 的配置对应传输配置中的 quicSettings
项。对接的两端的配置必须完全一致,否则连接失败。QUIC 强制要求开启 TLS,在传输配置中没有开启 TLS 时,V2Ray 会自行签发一个证书进行 TLS 通讯。在使用 QUIC 传输时,可以关闭 VMess 的加密。
{
"security": "none",
"key": "",
"header": {
"type": "none"
}
}
security
: “none” | “aes-128-gcm” | “chacha20-poly1305”
加密方式。默认值为不加密。
此加密是对 QUIC 数据包的加密,加密后数据包无法被探测。
key
: string
加密时所用的密钥。可以是任意字符串。当security
不为"none"
时有效。
header
: HeaderObject
数据包头部伪装设置
HeaderObject
{
"type": "none"
}
type
: string
伪装类型,可选的值有:
"none"
: 默认值,不进行伪装,发送的数据是没有特征的数据包。"srtp"
: 伪装成 SRTP 数据包,会被识别为视频通话数据(如 FaceTime)。"utp"
: 伪装成 uTP 数据包,会被识别为 BT 下载数据。"wechat-video"
: 伪装成微信视频通话的数据包。"dtls"
: 伪装成 DTLS 1.2 数据包。"wireguard"
: 伪装成 WireGuard 数据包。(并不是真正的 WireGuard 协议)
环境变量
V2Ray 提供以下环境变量以供修改 V2Ray 的一些底层配置。
每个连接的缓存大小
名称:
v2ray.ray.buffer.size
或V2RAY_RAY_BUFFER_SIZE
单位: MBytes
默认值: 在 x86、amd64、arm64、s390x 上为 2,其它平台上禁用该缓存。
特殊值: 0 表示缓存无上限
已过时,请使用本地策略中的 bufferSize
对于一个代理连接,当上下游网络速度有差距时,V2Ray 会缓存一部分数据,以减小对网络传输的影响。这个配置设置了缓存的大小,越大的缓存会占用更多的内存,也会使网络性能越好。
资源文件路径
名称:
v2ray.location.asset
或V2RAY_LOCATION_ASSET
默认值: 和 v2ray 文件同路径
这个环境变量指定了一个文件夹位置,这个文件夹应当包含 geoip.dat 和 geosite.dat 文件。
配置文件位置
名称:
v2ray.location.config
或V2RAY_LOCATION_CONFIG
默认值: 和 v2ray 文件同路径
这个环境变量指定了一个文件夹位置,这个文件夹应当包含 config.json 文件。
分散读取
名称:
v2ray.buf.readv
或V2RAY_BUF_READV
默认值:
auto
V2Ray 3.37 开始使用 Scatter/Gather IO,这一特性可以在大流量(超过 100 MByte/s)的时候依然使用较低的内存。可选的值有auto
、enable
和disable
。
enable
: 强制开启分散读取特性。disable
: 强制关闭分散读取特性auto
: 仅在 Windows、MacOS、Linux 并且 CPU 平台为 x86、AMD64、s390x 时,开启此特性。
在流量没有达到 100 MByte/s 时,开启与否在内存使用上没有明显的差异。
图形客户端
V2RayW
V2RayW 是一个基于 V2Ray 内核的 Windows 客户端。用户可以通过界面生成配置文件,并且可以手动更新 V2Ray 内核。下载:GitHub
V2RayN
V2RayN 是一个基于 V2Ray 内核的 Windows 客户端。下载:GitHub
Clash for Windows
下载:GitHub
V2RayX
V2RayX 是一个基于 V2Ray 内核的 Mac OS X 客户端。用户可以通过界面生成配置文件,并且可以手动更新 V2Ray 内核。V2RayX 还可以配置系统代理。下载:Github
V2RayU
V2rayU,基于v2ray核心的mac版客户端,界面友好,使用swift4.2编写,支持vmess,shadowsocks,socks5等服务协议,支持订阅, 支持二维码,剪贴板导入,手动配置,二维码分享等。下载:GitHub
V2RayC
下载:GitHub
ClashX
下载:GitHub
Qv2ray
Qv2ray:使用 Qt 编写的 v2ray 跨平台 GUI (MacOS, Windows, Linux)支持连接导入和编辑,中英文切换
下载:GitHub
官网:https://lhy0403.github.io/Qv2ray
Mellow
Mellow 是一个基于规则的全局透明代理工具,可以运行在 Windows、macOS 和 Linux 上,也可以配置成路由器透明代理或代理网关,支持 SOCKS、HTTP、Shadowsocks、VMess 等多种代理协议。
Download: Github
Kitsunebi
Kitsunebi 是一个基于 V2Ray 核心的移动平台应用 (iOS, Android)。它可以创建基于 VMess 或者 Shadowsocks 的 VPN 连接。Kitsunebi 支持导入和导出与 V2Ray 兼容的 JSON 配置。
由于使用 V2Ray 核心,Kitsunebi 几乎支持 V2Ray 的所有功能,比如 Mux 和 mKCP。
下载:iTunes | Play Store
i2Ray
i2Ray 是另一款基于 V2Ray 核心的iOS应用。界面简洁易用,适合新手用户使用。同时兼容Shadowrocket和Quantumult格式的规则导入。
下载:iTunes
Shadowrocket
Shadowrocket 是一个通用的 iOS VPN 应用,它支持众多协议,如 Shadowsocks、VMess、SSR 等。
下载:iTunes
Pepi(原名ShadowRay)
Pepi 是一个兼容 V2Ray 的 iOS 应用,它可以创建基于 VMess 的 VPN 连接,并与 V2Ray 服务器通信。
下载:iTunes
Quantumult
下载:iTunes
BifrostV
BifrostV 是一个基于 V2Ray 内核的 Android 应用,它支持 VMess、Shadowsocks、Socks 协议。
下载:Play Store | APK Pure
V2RayNG
V2RayNG 是一个基于 V2Ray 内核的 Android 应用,它可以创建基于 VMess 的 VPN 连接。
下载:Play Store | GitHub
在线工具/资源
VeekXT V2Ray配置生成
支持 4.x 版本的配置文件生成器 veekxt.com
V2Ray 配置生成器
静态 V2Ray 配置文件生成页面 GitHub
UUID Generator
VMess User ID 生成工具 uuidgenerator.net
vTemplate 项目仓库
一个 V2Ray 配置文件模板收集仓库 GitHub
VMess 协议
VMess 是 V2Ray 原创的加密通讯协议。
版本
当前版本号为 1。
依赖
底层协议
VMess 是一个基于 TCP 的协议,所有数据使用 TCP 传输。
用户 ID
ID 等价于 UUID,是一个 16 字节长的随机数,它的作用相当于一个令牌(Token)。 一个 ID 形如:de305d54-75b4-431b-adb2-eb6b9e546014,几乎完全随机,可以使用任何的 UUID 生成器来生成,比如这个。
用户 ID 可在配置文件中指定。
函数
MD5:
MD5 函数
- 输入参数为任意长度的 byte 数组
输出为一个 16 byte 的数组
HMAC:
HMAC 函数
- 输入参数为:
- H:散列函数
- 输入参数为:
K:密钥,任意长度的 byte 数组
M:消息,任意长度的 byte 数组
Shake:
SHA3-Shake128 函数
- 输入参数为任意长度的字符串
输出为任意长度的字符串
通讯过程
VMess 是一个无状态协议,即客户端和服务器之间不需要握手即可直接传输数据,每一次数据传输对之前和之后的其它数据传输没有影响。 VMess 的客户端发起一次请求,服务器判断该请求是否来自一个合法的客户端。如验证通过,则转发该请求,并把获得的响应发回给客户端。 VMess 使用非对称格式,即客户端发出的请求和服务器端的响应使用了不同的格式。
客户端请求
16 字节 | X 字节 | 余下部分 |
---|---|---|
认证信息 | 指令部分 | 数据部分 |
认证信息
认证信息是一个 16 字节的哈希(hash)值,它的计算方式如下:
H = MD5
K = 用户 ID (16 字节)
M = UTC 时间,精确到秒,取值为当前时间的前后 30 秒随机值(8 字节, Big Endian)
Hash = HMAC(H, K, M)
指令部分
指令部分经过 AES-128-CFB 加密:
Key:MD5(用户 ID + []byte(‘c48619fe-8f02-49e0-b9e9-edf763e17e21’))
IV:MD5(X + X + X + X),X = []byte(认证信息生成的时间) (8 字节, Big Endian)
1 字节 | 16 字节 | 16 字节 | 1 字节 | 1 字节 | 4 位 | 4 位 | 1 字节 | 1 字节 | 2 字节 | 1 字节 | N 字节 | P 字节 | 4 字节 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
版本号 Ver | 数据加密 IV | 数据加密 Key | 响应认证 V | 选项 Opt | 余量 P | 加密方式 Sec | 保留 | 指令 Cmd | 端口 Port | 地址类型 T | 地址 A | 随机值 | 校验 F |
选项 Opt 细节:(当某一位为 1 时,表示该选项启用)
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
---|---|---|---|---|---|---|---|
X | X | X | X | X | M | R | S |
其中:
版本号 Ver:始终为 1;
数据加密 IV:随机值;
数据加密 Key:随机值;
响应认证 V:随机值;
选项 Opt:
- S (0x01):标准格式的数据流(建议开启);
R (0x02):客户端期待重用 TCP 连接(V2Ray 2.23+ 弃用);
- 只有当 S 开启时,这一项才有效;
M (0x04):开启元数据混淆(建议开启);
- 只有当 S 开启时,这一项才有效;
当其项开启时,客户端和服务器端需要分别构造两个 Shake 实例,分别为 RequestMask = Shake(请求数据 IV), ResponseMask = Shake(响应数据 IV)。
X:保留
余量 P:在校验值之前加入 P 字节的随机值;
加密方式:指定数据部分的加密方式,可选的值有:
- 0x00:AES-128-CFB;
0x01:不加密;
0x02:AES-128-GCM;
0x03:ChaCha20-Poly1305;
指令 Cmd:
- 0x01:TCP 数据;
0x02:UDP 数据;
端口 Port:Big Endian 格式的整型端口号;
地址类型 T:
- 0x01:IPv4
0x02:域名
0x03:IPv6
地址 A:
- 当 T = 0x01 时,A 为 4 字节 IPv4 地址;
当 T = 0x02 时,A 为 1 字节长度(L) + L 字节域名;
当 T = 0x03 时,A 为 16 字节 IPv6 地址;
校验 F:指令部分除 F 外所有内容的 FNV1a hash;
数据部分
数据部分有两种格式,默认为基本格式。
基本格式 (弃用)
此格式仅作为向后兼容所用,在之后的版本中可能被删除。
所有数据均认为是请求的实际内容。这些内容将被发往指令部分所指定的地址。当 Cmd = 0x01 时,这些数据将以 TCP 的形式发送;当 Cmd = 0x02 时,这些数据将以 UDP 形式发送。
此格式支持“不加密”和“AES-128-CFB”两种加密方式,加密的 Key 和 IV 由指令部分指定。
标准格式
当 Opt(S) 开启时,数据部分使用此格式。实际的请求数据被分割为若干个小块,每个小块的格式如下。服务器校验完所有的小块之后,再按基本格式的方式进行转发。
2 字节 | L 字节 |
---|---|
长度 L | 数据包 |
其中:
长度 L:Big Endian 格式的整型,最大值为 2^14;
- 当 Opt(M) 开启时,L 的值 = 真实值 xor Mask。Mask = (RequestMask.NextByte() << 8) + RequestMask.NextByte();
数据包:由指定的加密方式加密过的数据包;
在传输结束之前,数据包中必须有实际数据,即除了长度和认证数据之外的数据。当传输结束时,客户端必须发送一个空的数据包,即 L = 0(不加密) 或认证数据长度(有加密),来表示传输结束。
按加密方式不同,数据包的格式如下:
不加密:
- L 字节:实际数据;
AES-128-CFB:整个数据部分使用 AES-128-CFB 加密
- 4 字节:实际数据的 FNV1a hash;
L - 4 字节:实际数据;
AES-128-GCM:Key 为指令部分的 Key,IV = count (2 字节) + IV (10 字节)。count 从 0 开始递增,每个数据包加 1;IV 为 指令部分 IV 的第 3 至第 12 字节。
- L - 16 字节:实际数据;
16 字节:GCM 认证信息
ChaCha20-Poly1305:Key = MD5(指令部分 Key) + MD5(MD5(指令部分 Key)),IV = count (2 字节) + IV (10 字节)。count 从 0 开始递增,每个数据包加 1;IV 为 指令部分 IV 的第 3 至第 12 字节。
- L - 16 字节:实际数据;
16 字节:Poly1305 认证信息
服务器应答
应答头部数据使用 AES-128-CFB 加密,IV 为 MD5(数据加密 IV),Key 为 MD5(数据加密 Key)。实际应答数据视加密设置不同而不同。
1 字节 | 1 字节 | 1 字节 | 1 字节 | M 字节 | 余下部分 |
---|---|---|---|---|---|
响应认证 V | 选项Opt | 指令 Cmd | 指令长度 M | 指令内容 | 实际应答数据 |
其中:
响应认证 V:必须和客户端请求中的响应认证 V 一致;
选项 Opt:
- 0x01:服务器端准备重用 TCP 连接(V2Ray 2.23+ 弃用);
指令 Cmd:
- 0x01:动态端口指令
实际应答数据:
- 如果请求中的 Opt(S) 开启,则使用标准格式,否则使用基本格式。
格式均和请求数据相同。
- 当 Opt(M) 开启时,长度 L 的值 = 真实值 xor Mask。Mask = (ResponseMask.NextByte() << 8) + ResponseMask.NextByte();
动态端口指令
1 字节 | 2 字节 | 16 字节 | 2 字节 | 1 字节 | 1 字节 |
---|---|---|---|---|---|
保留 | 端口 Port | 用户 ID | AlterID | 用户等级 | 有效时间 T |
其中:
端口 Port:Big Endian 格式的整型端口号;
有效时间 T:分钟数;
客户端在收到动态端口指令时,服务器已开放新的端口用于通信,这时客户端可以将数据发往新的端口。在 T 分钟之后,这个端口将失效,客户端必须重新使用主端口进行通信。
注释
- 为确保向前兼容性,所有保留字段的值必须为 0。
mKCP 协议
mKCP 是流式传输协议,由 KCP 协议修改而来,可以按顺序传输任意的数据流。
版本
mKCP 没有版本号,不保证版本之间兼容性。
依赖
底层协议
mKCP 是一个基于 UDP 的协议,所有通讯使用 UDP 传输。
函数
fnv:
FNV-1a
哈希函数
- 输入参数为任意长度的字符串;
输入出一个 32 位无符号整数;
通讯过程
- mKCP 将数据流拆成若干个数据包进行发送。一个数据流有一个唯一标识,用以区分不同的数据流。数据流中的每一个数据包都携带了同样的标识。
- mKCP 没有握手过程,当收到一个数据包时,根据其携带的数据流的标识来判断是否为新的通话,或是正在进行中的通话。
- 每一个数据包中包含若干个片段(Segment),片段分为三类:数据(Data)、确认(ACK)、心跳(Ping)。每个片段需要单独处理。
数据格式
数据包
4 字节 | 2 字节 | L 字节 |
---|---|---|
认证信息 A | 数据长度 L | 片段部分 |
其中:
认证信息 A = fnv(片段部分),big endian;
片段部分可能包含多个片段;
数据片段
2 字节 | 1 字节 | 1 字节 | 4 字节 | 4 字节 | 4 字节 | 2 字节 | Len 字节 |
---|---|---|---|---|---|---|---|
标识 Conv | 指令 Cmd | 选项 Opt | 时间戳 Ts | 序列号 Sn | 未确认序列号 Una | 长度 Len | 数据 |
其中:
标识 Conv: mKCP 数据流的标识
指令 Cmd: 常量 0x01
选项 Opt: 可选的值有:
- 0x00: 空选项
0x01: 对方已发出所有数据
时间戳 Ts: 当前片段从远端发送出来时的时间,big endian
序列号 Sn: 该数据片段时数据流中的位置,起始片段的序列号为 0,之后每个新片段按顺序加 1
未确认序列号 Una: 远端主机正在发送的,且尚未收到确认的最小的 Sn
确认片段
2 字节 | 1 字节 | 1 字节 | 4 字节 | 4 字节 | 4 字节 | 2 字节 | Len * 4 字节 |
---|---|---|---|---|---|---|---|
标识 Conv | 指令 Cmd | 选项 Opt | 窗口 Wnd | 下一接收序列号 Sn | 时间戳 Ts | 长度 Len | 已收到的序列号 |
其中:
标识 Conv: mKCP 数据流的标识
指令 Cmd: 常量 0x00
选项 Opt: 同上
窗口 Wnd: 远端主机可以接收的最大序列号
下一接收序列号 Sn: 远端主机未收到的数据片段中的最小序列号
时间戳 Ts: 远端主机最新收到的数据片段的时间戳,可用于计算延迟
已收到的序列号: 每个 4 字节,表示此序列号的数据已经确认收到
注释:
- 远程主机期待收到序列号 [Sn, Wnd) 范围内的数据
心跳片段
2 字节 | 1 字节 | 1 字节 | 4 字节 | 4 字节 | 4 字节 |
---|---|---|---|---|---|
标识 Conv | 指令 Cmd | 选项 Opt | 未确认序列号 Una | 下一接收序列号 Sn | 延迟 Rto |
其中:
标识 Conv: mKCP 数据流的标识
指令 Cmd: 可选的值有
- 0x02: 远端主机强行终止会话
0x03: 正常心跳
选项 Opt: 同上
未确认序列号 Una: 同数据片段的 Una
下一接收序列号 Sn: 同确认片段的 Sn
延迟 Rto: 远端主机自己计算出的延迟
Mux.Cool 协议
Mux.Cool 协议是一个多路复用传输协议,用于在一条已建立的数据流中传输多个各自独立的数据流。
版本
当前版本是 1 Beta。
依赖
底层协议
Mux.Cool 必须运行在一个已建立的可靠数据流之上。
通讯过程
一个 Mux.Cool 连接中可传输若干个子连接,每个子连接有一个独立的 ID 和状态。传输过程由帧(Frame)组成,每一帧用于传输一个特定的子连接的数据。
客户端行为
当有连接需求时并且没有现有可用的连接时,客户端向服务器发起一个新连接,以下称为“主连接”。
- 一个主连接可用于发送若干个子连接。客户端可自主决定主连接可承载的子连接数量。
- 对于一个新的子连接,客户端必须发送状态
New
以通知服务器建立子连接,然后使用状态Keep
来传送数据。 - 当子连接结束时,客户端发送
End
状态来通知服务器关闭子连接。 - 客户端可自行决定何时关闭主连接,但必须确定服务器也同时保持连接。
- 客户端可使用 KeepAlive 状态来避免服务器关闭主连接。
服务器端行为
当服务器端接收到新的子连接时,服务器应当按正常的连接来处理。
- 当收到状态
End
时,服务器端可以关闭对目标地址的上行连接。 - 在服务器的响应中,必须使用与请求相同的 ID 来传输子连接的数据。
- 服务器不能使用
New
状态。 - 服务器可使用 KeepAlive 状态来避免客户端关闭主连接。
传输格式
Mux.Cool 使用对称传输格式,即客户端和服务器发送和接收相同格式的数据。
帧格式
2 字节 | L 字节 | X 字节 |
---|---|---|
元数据长度 L | 元数据 | 额外数据 |
元数据
元数据有若干种类型,由状态 S 来区分。所有类型的元数据都包含 ID 和 Opt 两项,其含义为:
ID: 子连接的唯一标识
Opt:
- D(0x01): 有额外数据
当选项 Opt(D) 开启时,额外数据格式如下:
2 字节 | L 字节 |
---|---|
长度 L | 数据 |
新建子连接 (New)
2 字节 | 1 字节 | 1 字节 | 1 字节 | 2 字节 | 1 字节 | X 字节 |
---|---|---|---|---|---|---|
ID | 0x01 | 选项 Opt | 网络类型 N | 端口 | 地址类型 T | 地址 A |
其中:
网络类型 N:
- 0x01:TCP,表示当前子连接的流量应当以 TCP 的方式发送至目标。
0x02:UDP,表示当前子连接的流量应当以 UDP 的方式发送至目标。
地址类型 T:
- 0x01:IPv4
0x02:域名
0x03:IPv6
地址 A:
- 当 T = 0x01 时,A 为 4 字节 IPv4 地址;
当 T = 0x02 时,A 为 1 字节长度(L) + L 字节域名;
当 T = 0x03 时,A 为 16 字节 IPv6 地址;
在新建子连接时,若 Opt(D) 开启,则这一帧所带的数据需要被发往目标主机。
保持子连接 (Keep)
2 字节 | 1 字节 | 1 字节 |
---|---|---|
ID | 0x02 | 选项 Opt |
在保持子连接时,若 Opt(D) 开启,则这一帧所带的数据需要被发往目标主机。
关闭子连接 (End)
2 字节 | 1 字节 | 1 字节 |
---|---|---|
ID | 0x03 | 选项 Opt |
在保持子连接时,若 Opt(D) 开启,则这一帧所带的数据需要被发往目标主机。
保持连接 (KeepAlive)
2 字节 | 1 字节 | 1 字节 |
---|---|---|
ID | 0x04 | 选项 Opt |
在保持连接时:
若 Opt(D) 开启,则这一帧所带的数据必须被丢弃。
ID 可为随机值。
应用
Mux.Cool 协议与底层协议无关,理论上可以使用任何可靠的流式连接来传输 Mux.Cool 的协议数据。
在目标导向的协议如 Shadowsocks 和 VMess 协议中,连接建立时必须包含一个指定的地址。为了保持兼容性,Mux.Cool 协议指定地址为“v1.mux.cool”。即当主连接的目标地址与之匹配时,则进行 Mux.Cool 方式的转发,否则按传统方式进行转发。