Skip to content

Latest commit

 

History

History
293 lines (233 loc) · 8.42 KB

File metadata and controls

293 lines (233 loc) · 8.42 KB

架构设计

目录结构

sub.manager/
├── bin/
│   └── makeurl.sh              # 批量生成配置的Shell脚本
├── core/
│   ├── __init__.py
│   ├── clash_rule_builder.py  # 主程序:配置生成器
│   ├── clash.py                # Clash配置管理类
│   └── config.py               # 配置常量(分组、规则、节点)
├── rule/clash/
│   ├── gfwlist.py              # GFWList下载和转换
│   ├── clash2autoproxy.py      # Clash规则转AutoProxy格式
│   ├── QR_*.list               # 自定义规则文件
│   └── *.list                  # 第三方规则文件
├── core/
│   ├── __init__.py
│   ├── clash_rule_builder.py  # 主程序:配置生成器
│   ├── clash.py                # Clash配置管理类
│   ├── config.py               # 配置常量(分组、规则、节点)
│   └── download.php            # 下载服务PHP文件
├── config/
│   ├── in/                     # 配置模板
│   │   ├── provider.yaml.in
│   │   └── config.sh.in
│   └── user/                   # 用户配置(不提交git)
│       ├── provider.yaml
│       ├── extraprovider.yaml
│       └── config.sh
└── output/                     # 生成的配置文件
    ├── files/
    │   ├── config.yaml
    │   ├── office.yaml
    │   ├── home.yaml
    │   ├── nas.yaml
    │   └── node.yaml
    └── download.php

核心模块

1. clash_rule_builder.py

主程序,负责生成Clash配置文件。

流程:

  1. 解析命令行参数
  2. 初始化clash_yaml对象
  3. 添加订阅源(proxy-providers)
  4. 构建节点池(根据参数过滤自建节点)
  5. 构建代理分组(proxy-groups)
  6. 添加路由规则(rules)
  7. 写入YAML文件

关键函数:

  • main() - 入口函数,执行完整流程

2. clash.py

Clash配置管理类,封装YAML操作。

类:clash_yaml

方法分类:

文件操作:

  • read(filename) - 读取YAML文件
  • write(filename) - 写入YAML文件
  • read_text(yaml_text) - 解析YAML文本

配置修改:

  • config_override(A, B) - 用B覆盖A
  • config_append(A, B) - 将B追加到A
  • config_set(dict_in, yaml_text) - 修改配置

代理管理:

  • addproxies(newproxie) - 添加单个代理节点
  • addproxies_providers(url, prefix) - 添加订阅源

分组管理:

  • buildgroups(name, type, filter) - 构建代理分组
  • addproxies2group(proxiename, groupname) - 添加节点到分组
  • dropproxies(tag) - 删除包含特定标签的节点

规则管理:

  • addrules(rulesfile, route, tag) - 从文件添加规则
  • matchrules(route) - 添加MATCH规则(兜底)

预设配置:

  • set_quick() - 快速配置(调用set_basis和set_geo)
  • set_basis() - 基础配置(端口、日志等)
  • set_dns() - DNS配置
  • set_tun() - TUN模式配置
  • set_sniff() - 协议嗅探配置
  • set_geo() - GEO数据库配置

3. config.py

配置常量定义。

常量:

SELF_HOSTED_NODES

{
    "节点名": {
        "server": "IP地址",
        "port": 端口,
        "type": "socks5",
        "tags": ["标签1", "标签2"]
    }
}

GROUPS

{
    "分组名": {
        "type": "select|url-test",
        "filter": "正则表达式",
        "add_nodes": ["节点1", "节点2"],  # 可选
        "url": "测速URL"  # 可选,url-test类型需要
    }
}

RULES

[
    {
        "file": "规则文件名.list",
        "route": "目标分组",
        "tag": "规则类型",  # 可选,如IP-CIDR
        "qtags": ["条件标签"]  # 可选,如sci
    }
]

其他常量:

  • HEALTH_CHECK_URL - 健康检查URL
  • HEALTH_CHECK_INTERVAL - 检查间隔(秒)
  • RULE_DIR - 规则文件目录

数据流

订阅源URL
    ↓
addproxies_providers() → proxy-providers配置
    ↓
自动拉取节点 → proxies列表
    ↓
buildgroups() + filter → proxy-groups配置
    ↓
addrules() → rules配置
    ↓
write() → 最终YAML文件

配置生成逻辑

节点池管理

nodes_pool = {}

if args.my:
    exclude_tags = []
    if args.nas:
        exclude_tags.append("nas")

    for node_name, node_config in SELF_HOSTED_NODES.items():
        node_tags = node_config.get("tags", [])
        should_exclude = any(tag in exclude_tags for tag in node_tags)

        if not should_exclude:
            nodes_pool[node_name] = node_config

分组构建

for group_name, group_config in GROUPS.items():
    # 构建分组
    sub.buildgroups(
        name=group_name,
        type=group_config["type"],
        filter=group_config["filter"],
        url=group_config.get("url")
    )

    # 添加特定节点
    for node_name in group_config.get("add_nodes", []):
        if node_name in nodes_pool or node_name == "DIRECT":
            sub.addproxies2group(node_name, group_name)

规则构建

sub.content["rules"] = []
sub.matchrules("QG_漏网之鱼")  # 先添加MATCH规则

for rule_config in RULES:
    rule_file = f"{RULE_DIR}/{rule_config['file']}"
    route = rule_config['route']

    # 处理条件标签
    if "sci" in rule_config.get("qtags", []) and not args.sci:
        route = "DIRECT"

    sub.addrules(
        rulesfile=rule_file,
        route=route,
        tag=rule_config.get('tag')
    )

命名规范

  • QG_* - 代理分组名(Groups)
  • QP_* - 自定义节点名(Proxies)
  • QR_* - 规则文件名(Rules)
  • qtags - 规则条件标签(用于条件控制)

配置文件格式

provider.yaml

订阅源名称:
  url: https://订阅链接

规则文件格式

DOMAIN-SUFFIX,example.com
DOMAIN,exact.example.com
DOMAIN-KEYWORD,keyword
IP-CIDR,1.2.3.0/24
IP-CIDR6,2001:db8::/32

规则分类说明

项目中的规则文件按优先级和用途分为三类:

QR_专用规则(最高优先级)

这些是项目创建的核心规则,针对特定场景优化:

  • QR_谷歌服务.list - 谷歌服务(Gemini等需要美国IP的服务)
  • QR_学术网站.list - 学术网站(Nature/PubMed/IEEE等,需学校IP或代理访问)
    • 使用 qtags: ["sci"] 条件控制,未启用 -sci 参数时路由到 DIRECT
  • QR_AI官方站.list - AI官方站(ChatGPT/Grok/Claude等AI Agent网站)
  • QR_地域限制.list - 地域限制服务(要求美国/欧洲等特定地区IP,港澳台、新加坡等亚洲节点都不行)
    • 包含:Docker Hub、Netflix、Disney+、Spotify等流媒体服务
    • 包含:GitHub、GitLab、Discord、Reddit、Steam等对IP切换敏感的服务(避免频繁切换IP导致账户被封禁)
  • QR_微软服务.list - 微软服务(有时需国内,有时需国外,单独处理)
  • QR_通用代理.list - 通用代理(任意非大陆IP可访问,对IP切换容忍度高)
    • 包含:Telegram、开发平台(Vercel/Netlify等)、软件源(PyPI/npm等)、技术社区(Stack Overflow等)
  • QR_ipv6.list - IPv6专用(只能通过IPv6节点访问的网站)
  • QR_DIRECT.list - 强制直连(禁止使用代理或检测代理的网站)

第三方规则(中等优先级)

从其他配置复制的通用规则:

  • sanmao.gfw.list - GFW列表
  • sanmao.ip.list - IP规则
  • gfwlist_proxy.list - GFWList代理规则

IP和直连规则(最低优先级)

兜底规则,确保国内流量直连:

  • direct.ip.list - 直连IP列表
  • LidaoNote_OpenCode_china_ip.txt - 中国IP段(使用 tag: "IP-CIDR"
  • sanmao.direct.list - 直连域名列表

场景配置对应关系

场景 命令 特点
config.yaml 无参数 公共配置,纯订阅源节点
office.yaml -my -ep extraprovider.yaml 默认配置,自建节点 + 额外订阅源
home.yaml -my -sci 远程配置,自建节点 + 学术网站代理
nas.yaml -my -sci -nas 软路由/NAS托管,排除NAS标签节点
node.yaml -my -node 仅自建节点,无路由规则