构建并裁剪v2ray

新版 v2ray 可以直接读取 config.json 配置文件,不像以前需要依赖 v2ctl 转换 json 文件为 protobuf 格式,才能让 v2ray 读取。也就是新版只要一个 v2ray 二进制文件就可以单独运行,不需要 v2ctl 和一些 .dat 等依赖文件,下面就讲讲如何构建 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 添加下面内容:

1
2
3
4
5
6
7
8
9
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 源代码和依赖:

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

构建 v2ray 和 v2ctl

1
2
3
4
5
#构建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 配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
{
"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

添加下面内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[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

全部列表如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
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 格式才能读取。这个后面,再详细说明。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
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

参考: