Skip to content

Comments

feat: 支持从本地配置文件加载自定义出站规则#15

Closed
Ember-Moth wants to merge 1 commit intoperfect-panel:masterfrom
Ember-Moth:develop
Closed

feat: 支持从本地配置文件加载自定义出站规则#15
Ember-Moth wants to merge 1 commit intoperfect-panel:masterfrom
Ember-Moth:develop

Conversation

@Ember-Moth
Copy link

@Ember-Moth Ember-Moth commented Feb 22, 2026

概述

在保留原有 API 下发自定义出站机制的基础上,新增从本地配置文件(config.yml)加载自定义出站代理及路由匹配规则的能力。本地配置优先级高于 API 下发,同名出站以本地为准。

动机

  • 节点运维人员需要临时添加或覆盖出站代理,但不希望修改面板配置
  • 面板与节点之间网络不稳定时,需要本地兜底的出站规则
  • 多节点部署中,个别节点需要差异化的出站策略

变更内容

文件 改动
conf/conf.go 新增 OutboundConfig 结构体及 Conf.Outbound 字段
core/custom.go 新增 mergeOutboundList() 本地优先合并函数;提取 parseDomainRules() 消除重复代码;修改 GetCustomConfig() 签名以接收本地出站配置
core/xray.go 调用 GetCustomConfig() 时传入 c.Outbound

合并优先级

场景 行为
本地与 API 存在同名出站 本地覆盖 API
仅本地存在 使用本地配置
仅 API 存在 使用 API 配置
两边都无自定义出站 仅使用默认出站(freedom / blackhole / dns)
配置文件未写 Outbound 行为与变更前完全一致

配置示例

Outbound:
  - Name: "my-proxy"
    Protocol: "shadowsocks"
    Address: "1.2.3.4"
    Port: 8388
    Password: "mypassword"
    Rules:
      - "suffix:google.com"
      - "suffix:youtube.com"
      - "keyword:openai"
      - "regex:.*\\.github\\.io$"
      - "geosite:cn"


  - Name: "backup-trojan"
    Protocol: "trojan"
    Address: "5.6.7.8"
    Port: 443
    Password: "trojan-pass"
    Rules:
      - "suffix:telegram.org"
      - "keyword:twitter"

支持的协议: http / socks / shadowsocks / trojan / vmess / vless

支持的规则格式:

格式 示例 说明
suffix:域名 suffix:google.com 匹配该域名及所有子域名
keyword:关键词 keyword:openai 域名中包含该关键词即匹配
regex:正则 regex:.*\.gov\.cn$ 正则表达式匹配
geosite geosite:cn GeoSite 数据库匹配
geoip geoip:cn GeoIP 数据库匹配
纯域名 example.com 完全匹配

附带重构

将域名规则解析逻辑从 DNS / Block / Outbound 三处重复代码中提取为公共函数 parseDomainRules(),减少约 40 行重复代码,后续新增规则格式只需修改一处。

兼容性

  • 向后兼容 — 不写 Outbound 段时行为不变
  • API 兼容 — 不修改任何 API 数据结构
  • 配置文件兼容 — 新增可选字段,原有配置无需改动
  • 无新增外部依赖
  • 热重载支持 — 配置文件变更通过已有 --watch 机制自动生效

编译验证

$ GOEXPERIMENT=jsonv2 go build ./...   # 通过
$ GOEXPERIMENT=jsonv2 go vet ./conf/ ./core/   # 通过

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant