之前搭的梯子是shadowsocks,突然有一天不能用了,应该是被封了,据说v2ray更加隐蔽

VMess

VMess 协议是由 V2Ray 原创并使用于 V2Ray 的加密传输协议,如同 Shadowsocks 一样为了对抗墙的深度包检测而研发的。在 V2Ray 上客户端与服务器的通信主要是通过 VMess 协议通信。
本小节给出了 VMess 的配置文件,其实也就是服务器和客户端的基本配置文件,这是 V2Ray 能够运行的最简单的配置。
V2Ray 使用 inbound(传入) 和 outbound(传出) 的结构,这样的结构非常清晰地体现了数据包的流动方向,同时也使得 V2Ray 功能强大复杂的同时而不混乱,清晰明了。形象地说,我们可以把 V2Ray 当作一个盒子,这个盒子有入口和出口(即 inbound 和 outbound),我们将数据包通过某个入口放进这个盒子里,然后这个盒子以某种机制(这个机制其实就是路由,后面会讲到)决定这个数据包从哪个出口吐出来。以这样的角度理解的话,V2Ray 做客户端,则 inbound 接收来自浏览器数据,由 outbound 发出去(通常是发到 V2Ray 服务器);V2Ray 做服务器,则 inbound 接收来自 V2Ray 客户端的数据,由 outbound 发出去(通常是如 Google 等想要访问的目标网站)。

服务端

v2ray的程序是不分客户端和服务端的,类似frp,但是我在vps上用docker来部署

version: "3.4"
  
services:
  v2ray:
    image: v2ray/official:latest
    container_name: v2ray
    restart: always
    ports:
      - 16823:16823
    volumes:
      - /root/lam/work/v2ray:/etc/v2ray

需要在暴露出来的目录里放配置文件

{
  "inbounds": [
    {
      "port": 16823,
      "protocol": "vmess",
      "settings": {
        "clients": [
          {
            "id": "*********************",
            "alterId": 64
          }
        ]
      }
    }
  ],
  "outbounds": [
    {
      "protocol": "freedom",
      "settings": {}
    }
  ]
}

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

实际上数据包的流向就是:

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

配置中还有一个 alterId 参数,这个参数主要是为了加强防探测能力。理论上 alterId 越大越好,但越大就约占内存(只针对服务器,客户端不占内存),所以折中之下设一个中间值才是最好的。那么设多大才是最好的?其实这个是分场景的,我没有严格测试过这个,不过根据经验,alterId 的值设为 30 到 100 之间应该是比较合适的。alterId 的大小要保证客户端的小于等于服务器的。

有人疑惑请求发出去后数据怎么回来,毕竟大多数的场景是下载。这个其实不算是问题,既然请求通过 V2Ray 发出去了,响应数据也会通过 V2Ray 原路返回(也许会有朋友看到这话会马上反驳说不一定是原路返回的,有这种想法的估计是非常了解 TCP/IP 协议的,何必较这个劲,这是底层的东西,又掌控在运营商手里,从应用层理解原路返回又有何不可)

id 为 UUID 格式,请使用软件生成,不要尝试自己造一个,否则很大程度上造出一个错误的格式来

客户端

配置文件

{
  "log": {
    "loglevel": "warning"
  },
  "inbound": {
    "port": 1080,
    "listen": "127.0.0.1",
    "protocol": "http",
    "settings": {
      "auth": "noauth",
      "udp": false,
      "ip": "127.0.0.1"
    }
  },
  "outbound": {
    "protocol": "vmess",
    "settings": {
      "vnext": [
        {
          "address": "**.***.***.***",
          "port": 16823,
          "users": [
            {
              "id": "*********************",
              "alterId": 64
            }
          ]
        }
      ]
    },
    "tag": "direct"
  },
  "policy": {
    "levels": {
      "0": {"uplinkOnly": 0}
    }
  }
}

客户端配置中的 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 有两个用处:

  • 解决 DNS 污染;
  • 对于 IP 流量可以应用后文提到的域名路由规则;
  • 识别 BT 协议,根据自己的需要拦截或者直连 BT 流量(后文有一节专门提及)

排错指引

打开客户端闪退

可能原因:客户端的配置文件上不正确。

修正方法:请仔细检查配置文件并修改正确。

客户端提示 Socks: unknown Socks version:

可能原因:客户端配置的 inboud 设置成了 socks 而浏览器的代理协议设置为 http。

修正方法:修改配置文件使客户端的 inboud 的 protocol 和浏览器代理设置的协议保持一致。

客户端提示 Proxy|HTTP: failed to read http request > malformed HTTP request "\x05\x01\x00"

可能原因:客户端配置的 inboud 设置成了 https 而浏览器的代理协议设置为 socks4 或者 socks5。

修正方法:修改配置文件使客户端的 inboud 的 protocol 和浏览器代理设置的协议保持一致。

服务器执行 systemctl status v2ray 输出提示 Main: failed to read config file...

可能原因:服务器的配置文件不正确。

修正方法:请仔细检查配置文件并修改正确。

执行 cat /var/log/v2ray/error.log 或者 systemctl status v2ray 出现 rejected Proxy|VMess|Encoding: invalid user

可能原因:服务器与客户端的系统时间或者 id 不一致或者 alterId 不一致。

修正方法:请校准系统时间或将 id 以及 alterId 修改一致。

GUI客户端

走通整个流程以后发现上墙内的网站特别慢,甚至打不开,按照之前shadowsock的经验来看是要配置pac,但是现在配置文件+命令行的方式不知道怎么去配,于是对比多家客户端选择了v2rayN

image.pngimage.png

配置Shadowsocks

v2ray同样支持Shadowsocks。V2Ray 集成有 Shadowsocks 模块的,用 V2Ray 配置成 Shadowsocks 服务器或者 Shadowsocks 客户端都是可以的,兼容 Shadowsocks-libev。

配置与 VMess 大同小异,客户端服务器端都要有入口和出口,只不过是协议(protocol)和相关设置(settings)不同,不作过多说明,直接给配置,如果你配置过 Shadowsocks,对比之下就能够明白每个参数的意思(配置还有注释说明呢)。

客户端关键配置(没有亲自尝试)

inbounds...
    {
      "port": 1080, // 监听端口
      "protocol": "socks", // 入口协议为 SOCKS 5
      "sniffing": {
        "enabled": true,
        "destOverride": ["http", "tls"]
      },
      "settings": {
        "auth": "noauth"  // 不认证
      }
    }
outbounds...
    {
      "protocol": "shadowsocks",
      "settings": {
        "servers": [
          {
            "address": "serveraddr.com", // Shadowsocks 的服务器地址
            "method": "aes-128-gcm", // Shadowsocks 的加密方式
            "ota": true, // 是否开启 OTA,true 为开启
            "password": "sspasswd", // Shadowsocks 的密码
            "port": 1024  
          }
        ]
      }
    }

服务端关键配置(没有亲自尝试)

inbounds...
   {
      "port": 1024, // 监听端口
      "protocol": "shadowsocks",
      "settings": {
        "method": "aes-128-gcm",
        "ota": true, // 是否开启 OTA
        "password": "sspasswd"
      }
    }
outbounds...
    {
      "protocol": "freedom",  
      "settings": {}
    }

v2ray核心仓库

v2ray

打赏
支付宝 微信
上一篇 下一篇