构建并裁剪v2ray

新版 v2ray 可以直接读取 json 配置文件,不像以前需要依赖 v2ctl 转换 json 文件为 protobuf 格式,才能让 v2ray 读取,也就是新版只要一个 v2ray 二进制文件就可以单独运行。下面就讲讲如何构建 v2ray,然后在服务器上配置运行。顺带也讲讲怎么裁剪 v2ray,以便在路由上运行。

配置go环境

可以在本地或者服务器上构建,建议在服务器上,因为众所周知的原因,本地需要配置好代理环境。

下载 go 并解压到 /usr/local 路径下

wget https://golang.org/dl/go1.15.7.linux-amd64.tar.gz -O - | tar -xz -C /usr/local/

设置 go 环境变量,也可以写入到 profile 中

vi ~/.profile 添加下面内容:

export http_proxy=socks5://127.0.0.1:1080
export https_proxy=socks5://127.0.0.1:1080
#上面两行是配置本地代理,因go get被墙了,服务器上可删除上面两行

export PATH=$PATH:/usr/local/go/bin
export PATH=$PATH:$HOME/.cargo/bin
export GOROOT=/usr/local/go
export GOBIN=$GOROOT/bin
export PATH=$PATH:$GOBIN

保存后, source ~/.profile

上面 go 环境就配置好了,检查一下: go version

构建v2ray

拉取 v2ray 源代码和依赖:

git clone https://github.com/v2fly/v2ray-core.git
cd v2ray-core && go mod download

构建 v2ray 和 v2ctl

#构建v2ray
CGO_ENABLED=0 go build -o $HOME/v2ray -trimpath -ldflags "-s -w -buildid=" ./main

#构建v2ctl,运行时已不需要v2ctl,这一步其实不需要
CGO_ENABLED=0 go build -o $HOME/v2ctl -trimpath -ldflags "-s -w -buildid=" -tags confonly ./infra/control/main

构建 ARM 版的 v2ray 以便路由上使用,添加 GOOS 和 GOARCH 两个环境变量就可以了,当然你也可以添加 GOARM 变量设置运行时 CPU 浮点协处理器的版本。

查看所有支持的系统与架构:

go tool dist list

比如构建 Linux 版 arm64 的 v2ray,命令如下:

CGO_ENABLED=0 GOOS=linux GOARCH=arm64 go build -o $HOME/v2ray -trimpath -ldflags "-s -w -buildid=" ./main

上面构建完成后的二进制文件在 $HOME 目录。

配置运行v2ray

移动文件到运行目录:

mv v2ray /usr/bin/

新建 v2ray 文件夹:

mkdir /etc/v2ray

配置 v2ray 配置文件:

vi /etc/v2ray/config.json

添加下面内容,这是最基本 tcp 配置

{
    "inbounds": [
      {
      "port": 10240,
      "protocol": "vmess",
      "settings": {
        "clients": [
          {
            "id": "241b8c56-1707-4b62-958c-ae8b4c0d90af"
          }
        ]
      }
    }
  ],
  "outbounds": [
    {
      "protocol": "freedom",
      "settings": {}
    }
  ]
}

上面配置好后,你可以直接下面命令前台运行:

v2ray -config /etc/v2ray/config.json

配置后台 system 服务如下:

vi /etc/systemd/system/v2ray.service

添加下面内容:

[Unit]
Description=V2Ray Service
Documentation=https://www.v2fly.org/
After=network.target nss-lookup.target

[Service]
User=nobody
CapabilityBoundingSet=CAP_NET_ADMIN CAP_NET_BIND_SERVICE
AmbientCapabilities=CAP_NET_ADMIN CAP_NET_BIND_SERVICE
NoNewPrivileges=true
ExecStart=/usr/bin/v2ray -config /etc/v2ray/config.json
Restart=on-failure
RestartPreventExitStatus=23

[Install]
WantedBy=multi-user.target

重载 system 服务: systemctl daemon-reload

运行 v2ray: systemctl start v2ray

开机运行 v2ray: systemctl enable v2ray

裁剪v2ray

因为 v2ray 是模块化代理软件,因此每一个功能都可以简单地添加或移除。比如有些用户想在路由器里运行 v2ray,因路由器的 ROM 通常较小,且不会用到 v2ray 所有功能,所以俺们可以拿掉 v2ray 里一些不必要的功能,减小其体积后,塞进路由器。

v2ray 中所有的模块列表在下面文件里:

vi v2ray-core/main/distro/all/all.go

全部列表如下:

package all

import (
	// The following are necessary as they register handlers in their init functions.

	// Required features. Can't remove unless there is replacements.
	_ "v2ray.com/core/app/dispatcher"
	_ "v2ray.com/core/app/proxyman/inbound"
	_ "v2ray.com/core/app/proxyman/outbound"

	// Default commander and all its services. This is an optional feature.
	_ "v2ray.com/core/app/commander"
	_ "v2ray.com/core/app/log/command"
	_ "v2ray.com/core/app/proxyman/command"
	_ "v2ray.com/core/app/stats/command"

	// Other optional features.
	_ "v2ray.com/core/app/dns"
	_ "v2ray.com/core/app/log"
	_ "v2ray.com/core/app/policy"
	_ "v2ray.com/core/app/reverse"
	_ "v2ray.com/core/app/router"
	_ "v2ray.com/core/app/stats"

	// Inbound and outbound proxies.
	_ "v2ray.com/core/proxy/blackhole"
	_ "v2ray.com/core/proxy/dns"
	_ "v2ray.com/core/proxy/dokodemo"
	_ "v2ray.com/core/proxy/freedom"
	_ "v2ray.com/core/proxy/http"
	_ "v2ray.com/core/proxy/mtproto"
	_ "v2ray.com/core/proxy/shadowsocks"
	_ "v2ray.com/core/proxy/socks"
	_ "v2ray.com/core/proxy/trojan"
	_ "v2ray.com/core/proxy/vless/inbound"
	_ "v2ray.com/core/proxy/vless/outbound"
	_ "v2ray.com/core/proxy/vmess/inbound"
	_ "v2ray.com/core/proxy/vmess/outbound"

	// Transports
	_ "v2ray.com/core/transport/internet/domainsocket"
	_ "v2ray.com/core/transport/internet/http"
	_ "v2ray.com/core/transport/internet/kcp"
	_ "v2ray.com/core/transport/internet/quic"
	_ "v2ray.com/core/transport/internet/tcp"
	_ "v2ray.com/core/transport/internet/tls"
	_ "v2ray.com/core/transport/internet/udp"
	_ "v2ray.com/core/transport/internet/websocket"

	// Transport headers
	_ "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/tls"
	_ "v2ray.com/core/transport/internet/headers/utp"
	_ "v2ray.com/core/transport/internet/headers/wechat"
	_ "v2ray.com/core/transport/internet/headers/wireguard"

	// JSON config support. Choose only one from the two below.
	// The following line loads JSON from v2ctl
	// _ "v2ray.com/core/main/json"
	// The following line loads JSON internally
	_ "v2ray.com/core/main/jsonem"

	// Load config from file or http(s)
	_ "v2ray.com/core/main/confloader/external"
)

具体每个模块这里就不细说了,从注释可以大致猜出是做什么的。根据使用场景,俺们可以注释掉下面模块:

  • Commander 模块
  • Transport headers 模块
  • Shadowsocks,trojan,mtproto 等等代理模块
  • 只留下 tls,tcp,udp 三个传输模块

精简后如下,注意,JSON 配置支持模块,一定要注释掉,要不体积会不变。但是注释了 _ "v2ray.com/core/main/jsonem" 这一行后,v2ray 就不能直接读取 config.json 配置了,需要转换为 protobuf 格式才能读取。这个后面,再详细说明。

package all

import (
        // The following are necessary as they register handlers in their init functions.

        // Required features. Can't remove unless there is replacements.
        _ "v2ray.com/core/app/dispatcher"
        _ "v2ray.com/core/app/proxyman/inbound"
        _ "v2ray.com/core/app/proxyman/outbound"

        // Default commander and all its services. This is an optional feature.
        //_ "v2ray.com/core/app/commander"
        //_ "v2ray.com/core/app/log/command"
        //_ "v2ray.com/core/app/proxyman/command"
        //_ "v2ray.com/core/app/stats/command"

        // Other optional features.
        //_ "v2ray.com/core/app/dns"
        _ "v2ray.com/core/app/log"
        _ "v2ray.com/core/app/policy"
        //_ "v2ray.com/core/app/reverse"
        _ "v2ray.com/core/app/router"
        //_ "v2ray.com/core/app/stats"

        // Inbound and outbound proxies.
        //_ "v2ray.com/core/proxy/blackhole"
        //_ "v2ray.com/core/proxy/dns"
        _ "v2ray.com/core/proxy/dokodemo"
        _ "v2ray.com/core/proxy/freedom"
        //_ "v2ray.com/core/proxy/http"
        //_ "v2ray.com/core/proxy/mtproto"
        //_ "v2ray.com/core/proxy/shadowsocks"
        //_ "v2ray.com/core/proxy/socks"
        //_ "v2ray.com/core/proxy/trojan"
        _ "v2ray.com/core/proxy/vless/inbound"
        _ "v2ray.com/core/proxy/vless/outbound"
        _ "v2ray.com/core/proxy/vmess/inbound"
        _ "v2ray.com/core/proxy/vmess/outbound"

        // Transports
        //_ "v2ray.com/core/transport/internet/domainsocket"
        //_ "v2ray.com/core/transport/internet/http"
        //_ "v2ray.com/core/transport/internet/kcp"
        //_ "v2ray.com/core/transport/internet/quic"
        _ "v2ray.com/core/transport/internet/tcp"
        _ "v2ray.com/core/transport/internet/tls"
        _ "v2ray.com/core/transport/internet/udp"
        //_ "v2ray.com/core/transport/internet/websocket"

        // Transport headers
        //_ "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/tls"
        //_ "v2ray.com/core/transport/internet/headers/utp"
        //_ "v2ray.com/core/transport/internet/headers/wechat"
        //_ "v2ray.com/core/transport/internet/headers/wireguard"

        // JSON config support. Choose only one from the two below.
        // The following line loads JSON from v2ctl
        // _ "v2ray.com/core/main/json"
        // The following line loads JSON internally
        //_ "v2ray.com/core/main/jsonem"

        // Load config from file or http(s)
        _ "v2ray.com/core/main/confloader/external"
)

修改完后,再重新编译一下,体积应该会减半。上面说到,裁剪后的 v2ray 已经不能直接读取 config.json 文件了,需要转换格式以供 v2ray 读取。

转化配置文件

1、首先准备好你的配置文件 config.json

2、编译或下载 v2ctl 文件,编译方法上面有写

3、在 PC 客户端或者服务器上运行 v2ctl 转换配置文件为 protobuf 格式,命令如下:

./v2ctl config /etc/v2ray/config.json > config.pb

上面转化的 config.pb 文件,是不依赖 v2ctl 以及其它数据文件的,只需要 v2ray 一个文件即可运行。当然,这只是针对这个裁剪后的 v2ray ,不裁剪的 v2ray 是可以直接读取的,不需要转换。

把上面的 config.pb 文件上传到服务端 /etc/v2ray/ 目录下,然后下面命令运行即可:

v2ray -config=/etc/v2ray/config.pb

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2303805254@qq.com,本站将立刻删除。

(0)
上一篇 2022-04-10 10:15
下一篇 2022-04-11 10:14

相关推荐

发表回复

登录后才能评论