Effective V2Ray

目录

前言

V2Ray 作为一个代理协议的平台,提供了丰富的功能和复杂的配置。为了减少对 V2Ray 工作原理的误解,本文给出了一些实用的建议。

基础

工作原理

V2Ray 的工作原理是由一个传入协议(inbound)接收用户数据,分析之后交由一个传出协议(outbound)发出。V2Ray 所支持的任意一个传入协议都可以和任意的一个传出协议配置,以达到不同的功能。你可以配置多个传入协议(inboundDetour),来接收不同格式的数据(如 SOCKS 5 代理和 HTTP 代理)。你也可以配置多个传出协议(outboundDetour),然后使用内置的路由功能来选择由哪一个传出协议发送数据。

底层实现

V2Ray 只支持 TCP 和 UDP 协议,任何基于 TCP 或 UDP 的协议都可以通过 V2Ray 进行转发,这包括但不限于 SOCKS、HTTP、DNS 协议等。对于其它类型的 IP 数据的支持,目前不在计划中。对于 VPN 或类似 VPN 的协议,也只会做到转发其中的 TCP 或 UDP 数据。

VMess 协议

加密方式

VMess 默认(并强制)使用 AES-128-CFB 加密。在没有理论证明这种加密方式可以被“轻易”破解之前,我们可以认为它是安全的。这里的“轻易”是指在一个可行的时间内,比如 30 分钟。理论上只要有足够的计算资源,任何加密方式都可以被暴力破解,关键问题是破解成本和所截获内容的价值。如果你访问的网络资源非常重要(比如 email),请在 V2Ray 的基础上使用 HTTPS。

简单来说 VMess 协议的数据可以分为两部分,头部是 V2Ray 客户端和服务器端沟通的数据,剩下的数据是用户发出的实际数据。这两部分数据被分别加密,所使用的密钥不同。这样做的原因是,1) 减少通讯特征;2) Defense in depth,例如 ShadowSocks协议的弱点分析和改进

VMess 服务器端发回的数据所使用的加密密钥,和客户端的请求也不一样,原因同上。

认证机制

VMess 的客户端请求的前 16 字节是认证信息,服务器端会根据这 16 字节来判断一个请求是否来自某个预设的用户。如果认证不通过,服务器将不会读取后续的数据,而直接关闭连接。

VMess 的认证信息是一个根据时间变化哈希值,时间戳的取值是当前时间(UTC)的前后 30 秒内的随机值。在不同的时间点上,哈希算法得出的哈希值均不同。而在 2 分钟之后,这个哈希值就会失效。也就是说,客户端和服务器端的 UTC 时间(时区无所谓)相差不能超过两分钟。

AlterId

由于时间戳的取值范围只有 60 个值,当客户端产生大量数据请求时,部分请求可能会使用了相同的时间戳,进而产生相同的认证信息。在这种情况下,通讯数据有可能被模式识别。为了降低可识别性,VMess 配置中有一个 alterId 设置。如果 alterId > 0,VMess 在当前 ID 的基础上自动生成 alterId 个不同的 ID,并用于通讯。alterId 的值越大,认证信息重复的概率就越小。实际的 alterId 值可以根据你的上网情况推算出来,一般的网页浏览平均每秒打开最多一个网页,平均一个网页发起 10 个连接,那么 alterId 的值设为 10 即可。

也就是说 alterId 实际上是用户 ID 的一部分,如果客户端和服务器所配置的 alterId 值不同,即使 ID 相同,也会导致认证失败。

内存使用

V2Ray 的启动内存为 10MB,使用过程中内存没有限制,最高可能把机器的可用内存吃完,然后由于内存不足而崩溃。一般而言,客户端的内存使用相对稳定(30MB 以下),服务器端的用量会高出很多。影响内存使用的因素如下:

VMess ID 数量

VMess 服务器端会保留一个认证信息的缓存,用于快速验证用户的有效性。这个缓存的大小和 VMess 的端口数量与每个 VMess 的用户数成正比。一个 VMess 的用户数等于其中每个用户的 alterId 值之和。比如下面的 VMess 配置,包含了 1100 个用户:

"settings": {
  "clients": [{
    "id": "3b129dec-72a3-4d28-aeee-028a0fe86e22",
    "alterId": 100
  },
  {
    "id": "8f62a287-e80a-441f-9f28-affc9fb6c572",
    "alterId": 1000
  }]
}

每 1000 个用户将占用 50M 至 150M 内存,不同端口的 VMess 协议不会共享用户,即使它们的 ID 是一样的。

网络速度

由于网络数据的收发不同步,V2Ray 会在内存中保存一部分未发送的数据。这段缓存是由不同速度的网络造成的。比如你通过一个 VPS 中转 YouTube 视频,你的本地机器到 VPS 的速度是 4MB/s,而 VPS 到 YouTube 的速度为 100MB/s,那么下行连接中,VPS 收到的数据比发送的多,之间产生的差值就需要使用一个缓存保存起来。V2Ray 为每个网络连接保留了 10M 的缓存,这部分缓存也会计入 V2Ray 的总内存使用。比如你同时下载 10 个非常大的文件,由于网络速度差距所产生的内存用量,就可能会达到 100MB。