to_rule() 在判断 entry.endswith(',no-resolve') 之前没有剥掉行尾 # 注释,
导致带 inline 注释的条目走 else 分支,把注释当成 entry 一部分拼进去,
最终生成出 mihomo 解析失败的规则:
'IP-CIDR,162.254.192.0/18,no-resolve # Akamai Steam CDN 主段,DIRECT'
修法:
- to_rule() 先 split('#', 1)[0].rstrip() 剥注释再判断
- direct.yaml 第 91 行 inline 注释挪到独立行(避免再次踩坑)
验证:gen_clash_verge_script.py 重跑后 Script.js 第 49 行已变成
'IP-CIDR,162.254.192.0/18,DIRECT,no-resolve',
Clash Verge 重启内核后订阅配置校验失败消失。
vpn-rules
「哪些连接必须直连、绝不进代理」的规则真源(single source of truth),供电脑端 Clash Verge 和华硕路由器上的 mihomo(Magic Catling2)等消费端同步引用,一处维护、处处生效。
目录结构
vpn-rules/
├── direct.yaml # 规则真源(mihomo rule-provider 格式)
├── router/
│ ├── direct-rules.yaml # 路由器手动粘贴版(`- ` 前缀 + DIRECT 策略)
│ └── direct-plain.txt # 无 `- ` 前缀纯文本版(规则逐行、无策略)
└── scripts/
├── gen_clash_verge_script.py # 真源 → Clash Verge Script.js 生成器
├── gen_router_paste.py # 真源 → 路由器手动粘贴版生成器
└── gen_plain_list.py # 真源 → 纯文本版生成器
为什么需要它
- 香港代理节点有流量配额(如 BygCloud 100GiB 用满),国内站点/内网流量被隧道进代理会白白烧配额。
- 必须直连的对象:Windows OneDrive 客户端、FRP 控制面(mTLS)、B 站全系、DeepSeek/MiniMax 等国内 LLM API、 内网/私有 IP 段、国区 iCloud、UGREEN 绿联 NAS 云。
- 踩坑:Clash Verge 全局
Merge.yaml的prepend-rules会被内核忽略(不生效), 全局直连规则的唯一正确机制是profiles/Script.js(main(config)把规则 prepend 进config.rules)。
消费端接入
Clash Verge(Windows / macOS)
# 按当前平台生成并写入 Clash Verge 数据目录的全局 Script.js
python3 scripts/gen_clash_verge_script.py
# 然后在 Clash Verge 界面点「重启内核」生效
对当前及以后新增/切换的所有订阅生效;订阅更新不会覆盖它。
脚本还会把国内可达的阿里 DNS 和腾讯 DNS DoH 端点补入 dns.fallback,避免境外域名
命中 DIRECT 后因供应商的境外 DNS fallback 不可达而解析失败。
Windows 默认写入 %APPDATA%\io.github.clash-verge-rev.clash-verge-rev\profiles\Script.js;
macOS 默认写入 ~/Library/Application Support/io.github.clash-verge-rev.clash-verge-rev/profiles/Script.js。
路由器 mihomo(Magic Catling2 / OpenWrt)
rule-provider 引用(policy 在外层指定),定期自动拉取真源:
rule-providers:
vpn-direct:
type: http
behavior: classical
url: https://gitea.puyuanfh.cn/ageorge156/vpn-rules/raw/branch/main/direct.yaml
interval: 86400
path: ./ruleset/vpn-direct.yaml
rules:
- RULE-SET,vpn-direct,DIRECT
路由器内网自建 Gitea(192.168.50.2:3000)也可直连:
http://192.168.50.2:3000/ageorge156/vpn-rules/raw/branch/main/direct.yaml。
拉不到 URL 时(手动粘贴版):打开 router/direct-rules.yaml,把里面的规则行粘贴到路由器现有规则列表最前面即可,无需联网(生成命令 python3 scripts/gen_router_paste.py)。若工具不支持 - 前缀,用 router/direct-plain.txt(生成命令 python3 scripts/gen_plain_list.py)。
维护流程
- 改
direct.yaml(rule-provider 条目,不含策略字段)。 git commit+ push 到本仓库main。- Clash Verge 端重跑
python3 scripts/gen_clash_verge_script.py+ 重启内核; 路由器端等 rule-provider 到期自动拉新或手动 reload。