Xray 合并配置文件时 也合并路由规则

最近Xray的更新加了一个新功能, 当加载多个配置文件时, 把其中的inbound和outbound进行合并.

如果我们想把路由规则也合并呢?

修改几行代码就可以了.

这次我们要在windows环境下编译Xray.

安装 go 环境 (官方)

https://go.dev/dl/

Go下载页精选下载区,红框标出go1.21.5.windows-amd64.msi

运行安装文件, 像其它windows软件一样安装完成.

命令行检查是否输出 go 的版本,来验证是否go环境配置成功。

PowerShell执行go version显示go1.21.5


下载 Xray 源码

找到 Release 下载文件的地方

https://github.com/XTLS/Xray-core/releases/tag/v1.8.6

翻到最下面有源码的压缩包

GitHub发布页红框标出Xray的Source code (zip)

下载, 解压


编译

进入源码目录

右键菜单, "在终端中打开"

源码目录右键菜单高亮在终端中打开

设置 go 编译时用的代理

$env:GOPROXY = "https://goproxy.io"

* 注意, 这一行全部都要输入

PowerShell终端设置GOPROXY为goproxy.io\

编译命令 (Xray官方)

go build -o xray.exe -trimpath -ldflags "-s -w -buildid=" ./main

第一次编译会下载很多依赖,需要一点时间,请耐心等待。

终端go build编译Xray并下载依赖

检查是否编译成功, 得到xray.exe可执行文件

编译完成后在目录列表中看到xray.exe


修改源码

修改 infra\conf\xray.go 文件

找到 func (c *Config) Override(o *Config, fn string) 函数, 做如下修改:

双栏对比xray.go:Override函数新增RouterConfig规则代码

上面的 /* 和 */ 那两行修改是为了 注释/屏蔽 夹在中间的一段代码.

下面那一段源码是这样的:

// override routing rules
if len(o.RouterConfig.RuleList) > 0 {
  for i := range o.RouterConfig.RuleList {
    c.RouterConfig.RuleList = append(c.RouterConfig.RuleList, o.RouterConfig.RuleList[i])
    newError("[", fn, "] prepend RuleList with json: ", string(o.RouterConfig.RuleList[i])).AtInfo().WriteToLog()
  }
}

保存, 编译. 检查是否报错, 是否得到更新的 xray.exe 文件.


使用新特性

使用方法就是按官方的标准姿势加载多个配置文件. 可以多个 -c 像这样

xray run -c 1.json -c 2.json

也可以按目录加载

xray run -confdir .

不过你自己要注意这些配置文件中的 routing 的 rules 有没有互相冲突.


Github: https://github.com/crazypeace/xray-routing-rule-override

========

后记

这个修改只是为了处理一个特定场景, 没有对全部有可能的各种情况考虑周全, 所以我没有提交主线PR. 


========

update

Xray 新版本写日志的语法变了. 编译会报错.

懂的就照着附近的写日志代码抄, 不懂的把报错的那句写日志的注释掉就好.

// override routing rules
if len(o.RouterConfig.RuleList) > 0 {
  for i := range o.RouterConfig.RuleList {
    c.RouterConfig.RuleList = append(c.RouterConfig.RuleList, o.RouterConfig.RuleList[i])
    errors.LogInfo(context.Background(), "[", fn, "] prepend RuleList with json: ", string(o.RouterConfig.RuleList[i]))
  }
}

评论