V2Ray 的模块化

in #cn7 years ago (edited)

V2Ray 的介绍中有这么一句话:"V2Ray 是一个模块化的代理软件包"。在推广的过程中,看上去大家对模块化的概念不太了解,不清楚这是一个什么样的东西。

模块化,简单来说就是乐高积木,每一块积木都有统一的接口(有例外,这里忽略),积木和积木之间想拼就拼,想拆就拆,很方便。V2Ray 也是这样,V2Ray 中的每一个功能都可以简单地添加或移除。

lego-blocks-2458575_1920.jpg

举个例子来说,一些用户尝试在路由器中运行 V2Ray,路由器的 ROM 通常只有 8M 或 16M,而 V2Ray 的程序文件就达到了 7M (v3.4 ARM),这样就很难塞进路由器了。但其实根据使用情况,在路由器中不会用到 V2Ray 的所有功能,有一些功能不是必要的,比如 Shadowsocks,我们可以把它从 V2Ray 中拿走,以便减少可执行文件的体积。

V2Ray 中所有的模块列表如下(文件链接):

import (
    _ "v2ray.com/core/app/dispatcher/impl"
    _ "v2ray.com/core/app/dns"
    _ "v2ray.com/core/app/log"
    _ "v2ray.com/core/app/policy/manager"
    _ "v2ray.com/core/app/proxyman/inbound"
    _ "v2ray.com/core/app/proxyman/outbound"
    _ "v2ray.com/core/app/router"

    _ "v2ray.com/core/proxy/blackhole"
    _ "v2ray.com/core/proxy/dokodemo"
    _ "v2ray.com/core/proxy/freedom"
    _ "v2ray.com/core/proxy/http"
    _ "v2ray.com/core/proxy/shadowsocks"
    _ "v2ray.com/core/proxy/socks"
    _ "v2ray.com/core/proxy/vmess/inbound"
    _ "v2ray.com/core/proxy/vmess/outbound"

    _ "v2ray.com/core/transport/internet/kcp"
    _ "v2ray.com/core/transport/internet/tcp"
    _ "v2ray.com/core/transport/internet/tls"
    _ "v2ray.com/core/transport/internet/udp"
    _ "v2ray.com/core/transport/internet/websocket"

    _ "v2ray.com/core/transport/internet/headers/http"
    _ "v2ray.com/core/transport/internet/headers/noop"
    _ "v2ray.com/core/transport/internet/headers/srtp"
    _ "v2ray.com/core/transport/internet/headers/utp"
    _ "v2ray.com/core/transport/internet/headers/wechat"
)

具体每个模块这里就不细说了,从它们的名字应该可以大致猜出是做什么的。假如根据使用场景,这些模块我们不需要:

  • DNS(不加载的时候自动使用 localhost);
  • Blackhole、SOCKS、HTTP、Shadowsocks、VMess Inbound;
  • Websocket、KCP 以及相关伪装;

把上述的模块删除之后,我们仅使用透明代理加上 VMess 进行代理,以及 Freedom 做分流。示例:

import (
    _ "v2ray.com/core/app/dispatcher/impl"
    _ "v2ray.com/core/app/log"
    _ "v2ray.com/core/app/policy/manager"
    _ "v2ray.com/core/app/proxyman/inbound"
    _ "v2ray.com/core/app/proxyman/outbound"
    _ "v2ray.com/core/app/router"

    _ "v2ray.com/core/proxy/dokodemo"
    _ "v2ray.com/core/proxy/freedom"
    _ "v2ray.com/core/proxy/vmess/outbound"

    _ "v2ray.com/core/transport/internet/tcp"
    _ "v2ray.com/core/transport/internet/tls"
    _ "v2ray.com/core/transport/internet/udp"
)

对,只需要修改这一个文件就可以了,其它的都不用动。

重新编译一下,在 ARM 上获得新的程序文件,体积仅为 4M,几乎减半。这样就能很方便地集成进路由器的系统了。

编译 V2Ray 需要一些 Golang 的知识,并不是很难,步骤如下:

  1. 安装最新的 Golang SDK.
  2. 下载 V2Ray 源码:
    • go get -u v2ray.com/core/...
    • go get -u v2ray.com/ext/...
  3. 安装 V2Ray 编译工具:go install v2ray.com/ext/tools/build/vbuild
  4. 编译 V2Ray:$GOPATH/bin/vbuild -os=linux -arch=arm

顺便介绍一下如何在路由器中绕过 v2ctl 程序的限制。

  1. 准备好你的配置文件 config.json
  2. 在 PC 上把它转换成 Protobuf 格式:v2ctl config < config.json > config.pb
  3. 在路由器运行 V2Ray:v2ray -config=config.pb

在仅使用 Protobuf 配置文件的时候,V2Ray 是不依赖 v2ctl 以及其它数据文件的,只需要 v2ray 一个文件即可运行。是不是很方便呢。

现在你对 V2Ray 的强大之处是不是更仰慕了呢? 😉

Sort:  

赞一个,希望以后多出科普文章

更正

上述在路由器中运行的第三步,命令中最后需要加上参数-format=pb,即完整的如下:

v2ray -config=config.pb -format=pb

如果能为arm架构的路由器release个能实现透明代理的简化版本就好了,毕竟不是每个人都会去自定义编译的……

Here is a nice article that has a step by step guide on how to use a web proxy to unblock restricted youtube videos or websites.