新版 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
文章评论