最近入手了GL家的MT3000路由器,它的系统是基于OpenWRT制作的,所以可玩性非常高。

所以打算把V2客户端装在这个路由器上,这样使用和设置分流规则都比较方便。

一开始打算用命令行版本的xray,但是发现它没有解析订阅链接的功能,它只能按现有的参数去连接服务器。

然后我找到了一个叫v2raya的项目,这是一个web版本的v2客户端,可以自动更新订阅,非常方便。

其实我的需求很简单,只要提供一个http协议的代理监听端口,这样我电脑上的大多数软件就都可以连接上来。至于透明代理目前来看并没有需求,那么事情就简单了许多。

这里写一个教程留给大家参考。

首先是安装v2raya,v2raya有很多种安装方式,这里我们选择openwrt版本进行安装。

https://github.com/v2rayA/v2raya-openwrt

首先按照教程,执行这条命令,添加v2raya-openwrt的三方仓库密钥

wget https://downloads.sourceforge.net/project/v2raya/openwrt/v2raya.pub -O /etc/opkg/keys/94cc2a834fb0aa03

然后添加三方仓库源

echo "src/gz v2raya https://downloads.sourceforge.net/project/v2raya/openwrt/$(. /etc/openwrt_release && echo "$DISTRIB_ARCH")" | tee -a "/etc/opkg/customfeeds.conf"

好了之后更新一下软件源

opkg update

接着安装v2raya本体

opkg install v2raya

接着教程要我们安装防火墙,是这样写的

# Check your firewall implementation
# Install the following packages for the nftables-based firewall4 (command -v fw4)
# Generally speaking, install them on OpenWrt 22.03 and later
opkg install kmod-nft-tproxy
# Install the following packages for the iptables-based firewall3 (command -v fw3)
# Generally speaking, install them on OpenWrt 21.02 and earlier
opkg install iptables-mod-conntrack-extra \
  iptables-mod-extra \
  iptables-mod-filter \
  iptables-mod-tproxy \
  kmod-ipt-nat6

这边要做一个选择,OpenWrt 22.03和更新版要安装kmod-nft-tproxy,然后旧版的话安装下面这些东西。截止到撰写教程时,GL官方的系统是4.8.1版本,使用的是 OpenWrt 21.02-SNAPSHOT 版本,所以应该安装下面这些东西(但是官方系统已经提前安装好了)

接着还要安装luci-app,方便查看和管理。

opkg install luci-app-v2raya

然后就可以在luci界面顶部的“服务”里找到“V2Raya”,勾选“启动”然后保存即可。

image-20260228215000005

启动完毕后点“Open Web Interface”打开v2raya的界面。

第一次进来大概是长这样的,我们需要先设置好订阅链接,再点右上角的启动。

image-20260228215245817

然后问题就来了,你会发现点启动后会转圈很久很久,即使刷新页面也不行。

这些因为v2raya在尝试启动xray,当xray起来后,v2raya会和xray通信以同步信息。

但是问题就是卡在xray这里了,虽然xray运行起来了,端口也开启监听了,但是v2raya怎么都无法与xray通信。

此时使用curl去测试xray的入站端口也会无限卡住。那么就可以断定是xray出了问题。

通过不懈的寻找,xray也有人反馈过这个问题,恰好也是GL-MT3000路由器。

https://github.com/XTLS/Xray-core/issues/4722

根据作者的解答,这是因为新版的xray使用了golang 1.24,而1.24在监听时会默认启动mptcp特性。

mptcp全程是Multipath TCP,也就是多径TCP,可以让一个TCP的数据走在多个网络链路中提升速度,这是一个Linux系统才支持的特性。

但是GL官方的系统比较老,而且系统内核没有对mptcp特性的支持,也就造成了虽然xray启动了tcp监听,但是接收不到任何数据。

v2raya始终无法和xray进行tcp通信从而确认启动成功了没有,最终超时后xray被v2raya结束进程。

既mptcp支持不完善,那么解决办法自然是关闭mcptch特性。

有个办法是在xray启动时设置环境变量GODEBUG=multipathtcp=0这样就会自动关闭mptcp特性了。

xray是v2raya启动的,利用子进程会继承父进程环境变量的特性,我们直接把这个环境变量传递给v2raya即可,由v2raya再继承给xray来关系mptcp特性。

v2raya的启动文件位于/etc/init.d/v2raya

这里我们直接在41行后面新增一行procd_append_param env GODEBUG="multipathtcp=0"

procd_open_instance "$CONF"
procd_set_param command "$PROG"
procd_set_param env XDG_DATA_HOME="/usr/share"

# 新增到这里
procd_append_param env GODEBUG="multipathtcp=0"

append_env "config" "/etc/v2raya"
append_env "log_file" "/var/log/v2raya/v2raya.log"

然后通过luci界面重启v2raya即可,再点击右上角的启动按钮,就能顺利启动xray了。

image-20260228221513259