江湖夜雨十年灯

关于 v2ray 你应该知道的

李二花 / 2006-10-26


关键词:v2ray, xray, vmess, kcp-go, kcptun

原理简介

首先讲一下 v2ray-core (官网点这里) 的工作原理,v2ray-core 并不是一个 C/S 的结构,它更像是一个可串联节点的服务,v2ray 同时既可以做客户端,又可以做服务端,只是根据个人的需求使用的不同的配置文件即可。

浏览器

浏览器设置好代理地址与端口, 假设协议是 socks,对应的端口号是 7891,当我们使用浏览器发送请求时,就会被打包发送到端口 7891,此时 v2ray 的 inbound, 也就是流量的入口配置的就是 localhost 的 7891, 所以此刻正在监听端口 7891 的 v2ray 就收到了请求.

socks5是一个代理协议,主要的作用就是代理客户端来访问远程服务器,起到一个中介作用。 一般情况下当代理客户端因为防火墙等原因访问不了远程服务器,而另一个服务器即可以访问远程服务器又可以被客户端访问到时,可以在这个服务器上部署socks5服务端,本地部署 socks5 客户端,让这个中介服务器来代理访问远程服务器, 但是由于是明文传输,因此有局限性。

客户端

v2ray 接收到数据包之后要将数据包打包成 VMess 协议支持的格式并且使用预设的 id 加密(这个例子 id 是 b831381d-6324-4d53-ad4f-8cda48b30811),然后发往服务器地址为 serveraddr.com 的 443 端口。

vmess 协议

配置文件示例如下:

{
  "inbounds": [
    {
      "port": 7891, // 监听端口
      "protocol": "socks", // 入口协议为 SOCKS 5
      "sniffing": {
        "enabled": true,
        "destOverride": ["http", "tls"]
      },
      "settings": {
        "auth": "noauth"  //socks的认证设置,noauth 代表不认证,由于 socks 通常在客户端使用,所以这里不认证
      }
    }
  ],
  "outbounds": [
    {
      "protocol": "vmess", // 出口协议
      "settings": {
        "vnext": [
          {
            "address": "serveraddr.com", // 服务器地址,请修改为你自己的服务器域名
            "port": 443,  // 服务器端口
            "users": [
              {
                "id": "b831381d-6324-4d53-ad4f-8cda48b30811",  // 用户 ID,必须与服务器端配置相同
                "alterId": 64 // 此处的值也应当与服务器相同
              }
            ]
          }
        ]
      }
    }
  ]
}

服务端

服务器配置的 id 是 b831381d-6324-4d53-ad4f-8cda48b30811,所以 v2ray 服务器接收到客户端发来的数据包时就会尝试用 b831381d-6324-4d53-ad4f-8cda48b30811 解密,如果解密成功再看一下时间对不对,对的话就把数据包发到 outbound 去,outbound.protocol 是 freedom(freedom 的中文意思是自由,在这里姑且将它理解成直连吧),数据包就直接发到 google.com 了。

配置文件示例:

{
  "inbounds": [
    {
      "port": 16823, // 服务器监听端口, 需要在服务前面加一个 caddy做反向代理,caddy 开放端口 443 与客户端的端口对应一致
      "protocol": "vmess",    // 主传入协议
      "settings": {
        "clients": [
          {
            "id": "b831381d-6324-4d53-ad4f-8cda48b30811",  // 用户 ID,客户端与服务器必须相同
            "alterId": 64
          }
        ]
      }
    }
  ],
  "outbounds": [
    {
      "protocol": "freedom",  // 主传出协议
      "settings": {}
    }
  ]
}

完整的流程

实际的数据包的流向大致如下:

{浏览器} <--(socks)--> {v2ray 客户端 inbound <-> v2ray 客户端 outbound} <--(VMess)-->  {v2ray 服务器 inbound <-> v2ray 服务器 outbound} <--(Freedom)--> {目标网站}

实际操作

但是实际上,服务端我们会部署 v2ray,但是客户端很少直接部署 v2ray, 而是会用一些界面客户端,他们都是其他人封装了 v2ray 之后,给出的更好用的配置界面,所以使用的配置文件就不是上面那种 inbound 和 outbound 的样子了,而是根据不同的客户端采用了不同格式的配置文件, 但是不论格式怎么变,该有的配置的必须有的,比如监听的端口是什么,采用了什么协议,发送到服务端的哪个地址,都需要。

就比如 mac 上用的 clashX, 安卓用的 clash for andriod, 都是 v2ray 协议封装的客户端,配置好对应的配置文件即可以使用了。

当然除了这些客户端,还有一些也集成了 v2ray 或者 Xray 功能的也可以作为客户端来使用:iphone 用的 Surge 和 Shadowrocket。

加速器

kcptun 是一个基于 kcp-go 的高速远程端口转发工具, 配合ssh -D,可以比 shadowsocks 更流畅的看在线视频。

快捷部署

我们可以用官方提供的方案进行部署,但是这会比较麻烦,目前已经有好多开发者帮我们写好一键部署的快捷方式,基本上都是基于 docker 容器的部署,推荐一个比较好用的

但是目前 v2ray 有 bug, 存在被监测的风险,因此,如果是普通需求可以使用,如果有更稳定性的要求,推荐使用 Xray。


参考: