UP | HOME

VMess

Table of Contents

VMess 协议是由 V2Ray 原创并使用于 V2Ray 的 加密 传输协议

如同 Shadowsocks 一样为了对抗墙的深度包检测 而研发的。在 V2Ray 上客户端与服务器的通信主要是通过 VMess 协议通信。

本小节给出了 VMess 的配置文件,其实也就是服务器和客户端的基本配置文件,这是 V2Ray 能够运行的最简单的配置

V2Ray 使用 inbound 传入outbound 传出 的结构,这样的结构非常清晰地体现了数据包的流动方向,同时也使得 V2Ray 功能强大复杂的同时而不混乱,清晰明了

形象地说,我们可以把 V2Ray 当作一个盒子,这个盒子有入口和出口(即 inbound 和 outbound)

将数据包通过某个入口放进这个盒子里,然后这个盒子以某种机制(这个机制其实就是路由)决定这个数据包从哪个出口吐出来

配置

客户端

以下是客户端配置,将客户端的 config.json 文件修改成下面的内容,修改完成后要重启 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": 0 // 此处的值也应当与服务器相同
                            }
                        ]
                    }
                ]
            }
        }
    ]
}

在配置当中,有一个 id (在这里的例子是 b831381d-6324-4d53-ad4f-8cda48b30811),作用类似于 Shadowsocks 的密码(password), VMess 的 id 的格式必须与 UUID 格式相同。关于 id 或者 UUID 没必要了解很多,在这里只要清楚以下几点就足够了:

  • 相对应的 VMess 传入传出的 id 必须相同(如果你不是很明白这句话,那么可以简单理解成服务器与客户端的 id 必须相同)
  • 由于 id 使用的是 UUID 的格式,可以使用任何 UUID 生成工具生成 UUID 作为这里的 id。比如 UUID Generator 这个网站,只要一打开或者刷新这个网页就可以得到一个 UUID,或者可以在 Linux 使用命令

    cat /proc/sys/kernel/random/uuid 
    

服务器

将服务器 /usr/local/etc/v2ray 目录下的 config.json 文件修改成下面的内容:

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

原理

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

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

可以从另一个角度来理解,认为每一个 V2Ray 都是一个 节点

  • inbound 是关于如何与上一个节点连接的配置
  • outbound 是关于如何与下一个节点连接的配置
  • inbounds 和 outbounds 是 inbound 和 outbound 的集合
实际上每一个 V2Ray 节点都可以有多个入口和出口

本例当中的入口和出口都只有一个,这是为了便于说明和理解

客户端

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

之前已经把浏览器的代理设置好了(SOCKS Host: 127.0.0.1,Port: 1080)

假如访问了 google.com,浏览器就会发出一个数据包打包成 socks 协议发送到本机(127.0.0.1 指的本机,localhost)的 1080 端口,这个时候数据包就会被 V2Ray 接收到

再看 outbounds,protocol 是 vmess,说明 V2Ray 接收到数据包之后要将数据包打包成 VMess 协议并且使用预设的 id 加密(这个例子 id 是 b831381d-6324-4d53-ad4f-8cda48b30811),然后发往服务器地址为 serveraddr.com 的 16823 端口。服务器地址 address 可以是域名也可以是 IP,只要正确就可以了

在客户端配置的 inbounds 中,有一个 sniffing 字段,V2Ray 手册解释为 流量探测,根据指定的流量类型,重置所请求的目标 ,这话不太好理解,简单说这东西就是从网络流量中识别出域名。这个 sniffing 有几个用处:

  1. 解决 DNS 污染
  2. 对于 IP 流量可以应用后文提到的域名路由规则
  3. 识别 BT 协议,根据自己的需要拦截或者直连 BT 流量

服务器

接着看服务器,服务器配置的 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 参数,在之前的版本中建议设置为 30 到 100 之间,在 v4.28.1 版本之后必须设置为 0 以启用 VMessAEAD

注意

  • 为了让浅显地介绍 V2Ray 的工作方式,本节中关于原理简析的描述有一些地方是错误的
  • id 为 UUID 格式,请使用软件生成,不要尝试自己造一个,否则很大程度上造出一个错误的格式来
  • VMess 协议可以设定加密方式,但 VMess 不同的加密方式对于过墙没有明显差别

    本节没有给出相关配置方式(因为这不重要,默认情况下 VMess 会自己选择一种比较合适的加密方式)
    
    具体配置可见 V2Ray 手册,不同加密方式的性能可参考性能测试
    
Next: ShadowSocks Home: 基础