VMess
VMess 是 V2Ray 项目于 2015 年前后设计并引入的专有代理协议。它是 V2Ray 最具代表性的协议,在 VMess 诞生之前,V2Ray 核心实际上并不存在——VMess 协议的设计驱动了整个 V2Ray 项目的发展。时至今日,VMess 仍是机场服务中使用量最大的协议之一,尽管其在新建节点中正逐渐被 VLESS 取代。
历史背景
V2Ray 项目由 @clowwindy 的 Shadowsocks 被迫停更后不久启动。其核心团队 Project V 希望设计一个比 Shadowsocks 更难被识别、更安全的协议。VMess(全称 V2Ray Message)就是这一目标的产物。
VMess 的关键设计理念是:
- 使用 UUID 作为用户身份标识,而非共享密码
- 引入时间戳校验,防止重放攻击
- 支持多种传输层封装,可以将流量伪装为 WebSocket、HTTP/2、gRPC 等标准协议
随着时间推移,V2Ray 的后继项目 Xray 在 VMess 的基础上推出了更轻量的 VLESS 协议,逐步将 VMess 的新建份额分流。但由于历史积累,VMess 在现有机场节点中的比例依然可观。
工作原理
身份认证机制
VMess 使用 UUID(通用唯一识别码)作为用户凭证。UUID 是一个 128 位的随机标识符,例如:
9f67b8a2-3c1d-4e5f-a6b7-c8d9e0f1a2b3
客户端在发起连接时,会使用 UUID 结合当前时间戳计算出一个认证信息,服务端通过验证该认证信息来确认请求的合法性。
时间戳校验
VMess 协议要求客户端和服务端的系统时间误差不超过 90 秒。这一设计使得重放攻击的时间窗口极短——即使攻击者捕获了完整的握手数据,也必须在 90 秒内完成重放,超过这个时间窗口,数据包会被服务端拒绝。
关于时间同步
VMess 连接失败最常见的原因之一就是客户端或服务端时间不准确。如果出现莫名其妙的连接失败,请先检查双端时间是否同步。在 Linux 服务器上,可以通过 timedatectl status 查看时间同步状态。
传输流程
客户端
|
| 1. 生成请求头(含 UUID 认证、加密方式、目标地址)
| 2. 用协商好的加密方式加密请求体
| 3. 封装到指定传输层(TCP / WebSocket / gRPC / HTTP/2 等)
v
服务端
|
| 4. 验证时间戳和 UUID 认证信息
| 5. 解密请求头,获取目标地址和加密参数
| 6. 解密请求体,转发至目标
v
目标服务器
加密方式
VMess 支持对请求体和响应体分别配置加密方式:
| 加密方式 | 说明 |
|---|---|
auto | 自动选择(推荐),在支持 AES 硬件加速的平台选 aes-128-gcm,否则选 chacha20-poly1305 |
aes-128-gcm | 性能好,在 x86/x64 平台有硬件加速 |
chacha20-poly1305 | 适合移动端和低端设备 |
none | 不加密,仅用于已有 TLS 的场景(如 WebSocket + TLS),减少双重加密的开销 |
关于 none 加密
当 VMess 配合 TLS 传输层使用时(如 WebSocket + TLS),可以将 VMess 层的加密设置为 none,避免双重加密带来的性能损耗。此时整体安全性不会降低,因为 TLS 本身提供了加密保护。
传输方式
VMess 最大的特点是支持多种传输层封装,这也是它比原版 Shadowsocks 更灵活的地方。
TCP
最基础的传输方式,直接在 TCP 上传输 VMess 数据。不进行任何流量伪装,不建议在严格检测环境中单独使用。
WebSocket + TLS(ws+tls)
最常见的 VMess 配置,将 VMess 流量封装在 WebSocket 连接中,并通过 TLS 加密。
- 流量看起来像标准的 HTTPS WebSocket 连接
- 可以部署在反向代理(Nginx、Caddy)之后,共用 443 端口
- 支持通过 CDN(如 Cloudflare)中转,隐藏服务器真实 IP
- 是机场中最广泛使用的 VMess 配置形式
HTTP/2 + TLS(h2+tls)
使用 HTTP/2 协议封装,相比 WebSocket 有更低的握手开销,但 CDN 支持不如 WebSocket 广泛。
gRPC + TLS
使用 gRPC 协议封装,Cloudflare CDN 原生支持 gRPC 中转。在部分被限速的环境下,gRPC 的多路复用特性可以带来更好的性能表现。
QUIC
基于 UDP 的传输方式,在高丢包环境下理论上优于 TCP。但由于 V2Ray/Xray 的 QUIC 实现与标准 QUIC 存在差异,实际使用中被 UDP 封锁的风险较高,目前并不推荐。
HTTPUpgrade
伪装为 HTTP 协议升级请求,是 WebSocket 的一种变体。配置简单,但流量特征与标准 WebSocket 有细微差别。
SplitHTTP / XHTTP
较新的传输方式,详见 VLESS-XHTTP 章节。
与 CDN 配合使用
VMess + WebSocket + TLS 配合 CDN(以 Cloudflare 为例)是一种经典的高可用方案:
用户
|
| HTTPS
v
Cloudflare CDN(隐藏真实 IP)
|
| 回源 HTTPS
v
你的服务器(Nginx/Caddy 反向代理)
|
v
VMess 服务端(监听本地端口)
这种方案的优点是:
- 即使服务器 IP 被封,流量仍可通过 CDN 的 IP 到达
- Cloudflare 的 IP 段极大,全部封锁的成本很高
- 支持 Cloudflare Workers 进行进一步的流量处理
缺点是:
- 经过 CDN 中转后延迟会显著增加(通常增加 20–100ms)
- Cloudflare 免费版有流量限制(技术上不允许用于代理,存在被封号风险)
- 吞吐量受 CDN 节点的出口带宽限制
优缺点
| 优点 | 缺点 |
|---|---|
| 传输方式丰富,配置灵活 | 协议本身相对复杂,存在已知的安全弱点 |
| WebSocket + TLS 可过 CDN | 纯 TCP 模式容易被主动探测 |
| 生态成熟,大量现有节点和文档 | 时间戳校验要求客户端和服务端时间同步 |
| UUID 认证机制完善 | 性能不如 VLESS(多了一层协议加密) |
| 客户端支持广泛 | 逐渐被 VLESS 在新部署中取代 |
| 可搭配多种反向代理 | 双重加密(VMess + TLS)有一定性能损耗 |
与 VLESS 的关系
VMess 和 VLESS 都是 V2Ray/Xray 生态的产物,经常被放在一起比较:
| 对比维度 | VMess | VLESS |
|---|---|---|
| 协议加密 | 有(独立于 TLS) | 无(完全依赖 TLS/Reality) |
| 时间校验 | 90 秒窗口 | 无 |
| 性能 | 中(双重加密时略有损耗) | 高(无冗余加密) |
| 与 XTLS / Reality 兼容 | 不支持 | 支持 |
| CDN 支持 | 支持(WebSocket + TLS) | 支持(WebSocket + TLS) |
| 新建节点推荐度 | 不推荐(建议用 VLESS) | 推荐 |
新建节点建议
如果你正在搭建一个全新的代理节点,建议直接选择 VLESS 而不是 VMess。VLESS 去除了冗余的加密层,性能更高,且支持 XTLS-Vision 和 Reality 等更强大的特性。VMess 目前的主要价值在于兼容已有的订阅节点和老旧客户端。
适用场景
仍适合使用 VMess 的场景:
- 订阅机场服务时,机场提供的节点以 VMess 为主
- 需要兼容不支持 VLESS 的老旧客户端
- 现有 VMess 节点工作稳定,不需要迁移
- 配合 CDN 使用,需要 WebSocket + TLS 方案
不推荐新建 VMess 节点的场景:
- 全新搭建节点(改用 VLESS + Reality)
- 追求最高性能(VLESS 无冗余加密开销)
- 需要最强抗检测能力(VLESS + Reality / AnyTLS 更优)
服务端配置参考
以下为基于 Xray-core 的 VMess + WebSocket + TLS 配置示例。
前置条件
- 一个指向你服务器 IP 的域名
- 有效的 TLS 证书(可以使用 Caddy 或 acme.sh 自动申请)
- 服务器已开放 443 端口
Xray 服务端配置(config.json 节选)
{
"inbounds": [
{
"port": 10086,
"listen": "127.0.0.1",
"protocol": "vmess",
"settings": {
"clients": [
{
"id": "9f67b8a2-3c1d-4e5f-a6b7-c8d9e0f1a2b3",
"alterId": 0
}
]
},
"streamSettings": {
"network": "ws",
"wsSettings": {
"path": "/your-secret-path"
}
}
}
]
}
alterId 设置为 0 表示启用 VMessAEAD 模式(推荐)。旧版的 alterId > 0 模式存在安全问题,已不建议使用。
Nginx 反向代理配置
server {
listen 443 ssl;
server_name your.domain.com;
ssl_certificate /path/to/cert.pem;
ssl_certificate_key /path/to/key.pem;
location /your-secret-path {
proxy_pass http://127.0.0.1:10086;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
}
location / {
root /var/www/html;
}
}
生成 UUID
可以使用以下任意方式生成一个新的 UUID:
# 方法一:使用系统工具(Linux)
cat /proc/sys/kernel/random/uuid
# 方法二:使用 Xray 内置工具
xray uuid
# 方法三:使用 Python
python3 -c "import uuid; print(uuid.uuid4())"
VMessAEAD 说明
早期的 VMess 协议使用基于时间戳的 MD5 认证头,后来发现这种设计在理论上可以被主动探测。为此,Xray 推出了 VMessAEAD 模式,将认证头也使用 AEAD 加密,消除了这一弱点。
VMessAEAD 的启用方式是将 alterId 设置为 0。旧的非 AEAD 模式(alterId > 0)已不再推荐。
注意
部分机场的旧节点可能仍使用 alterId > 0 的旧模式。使用此类节点时,流量认证的安全性低于 AEAD 模式。如果机场提供了同协议的新节点,建议优先选择 alterId 为 0 的版本。
客户端支持
| 平台 | 客户端 | 支持状态 |
|---|---|---|
| Windows / macOS / Linux | Mihomo、sing-box、Xray、v2rayN、V2Fly | 支持 |
| iOS | Shadowrocket、Stash、Quantumult X、Surge、Loon | 支持 |
| macOS | Stash、Surge | 支持 |
| Android | NekoBox、Husi、Exclave | 支持 |
| Linux | dae、sing-box、Mihomo | 支持 |
VMess 是除 Shadowsocks 外客户端支持最广泛的协议之一,几乎所有代理软件都提供了完善的支持。
延伸阅读
- VLESS 协议 — VMess 的后继协议,推荐用于新建节点
- Shadowsocks — 了解另一个历史悠久的经典协议
- 代理协议总览 — 回到协议总览页面