本功能采用类似 Proxifier GUI 的三维规则配置模式,通过 进程(process) × 域名(hosts) × 端口(ports) 的组合来构建 Mihomo 的 AND 逻辑规则。
- ✅ 三维规则配置:进程 × 域名 × 端口的直观配置方式
- ✅ 自动转换:自动转换为 Mihomo AND 规则
- ✅ 规则验证:构建时自动验证规则有效性
- ✅ 灵活匹配:支持所有 Mihomo 域名和进程匹配类型
- ✅ 可选端口:端口条件可选,不填则匹配所有端口
- ✅ 规则开关:支持临时禁用规则(
enabled: false)
打开 custom-rules-config/user-rules.ts:
import type { UserCustomRulesConfig } from '../src/config/UserCustomRules';
export const userCustomRules: UserCustomRulesConfig = {
rules3D: [
{
process: 'chrome.exe', // 进程名
hosts: [ // 域名匹配(至少一个)
{ type: 'DOMAIN-SUFFIX', value: 'google.com' }
],
ports: [80, 443], // 端口(可选)
group: '🫧 Proxy A 🫧' // 代理组
}
]
};# 使用自定义规则构建
npm run build:cvr:auto:custom
# 或其他客户端
npm run build:cfw:auto:custom
npm run build:party:auto:custom构建日志会显示:
✅ 加载用户自定义三维规则: 3 条 → 5 条 Mihomo AND 规则
{
process: string | ProcessRule, // 进程匹配
hosts: HostRule[], // 域名/IP 匹配(必填,至少一个)
ports?: number[], // 目标端口(可选)
group: string, // 代理组名称
noResolve?: boolean, // 跳过 DNS 解析(可选)
enabled?: boolean, // 规则开关(默认 true)
description?: string // 规则备注(可选)
}最终匹配 = process AND (host1 OR host2 OR ...) AND (port1 OR port2 OR ...)
展开示例:
{
process: 'chrome.exe',
hosts: [
{ type: 'DOMAIN-SUFFIX', value: 'google.com' },
{ type: 'DOMAIN-SUFFIX', value: 'youtube.com' }
],
ports: [80, 443],
group: '🫧 Proxy A 🫧'
}会展开为 4 条 Mihomo AND 规则:
AND,((PROCESS-NAME,chrome.exe),(DOMAIN-SUFFIX,google.com),(DST-PORT,80)),🫧 Proxy A 🫧
AND,((PROCESS-NAME,chrome.exe),(DOMAIN-SUFFIX,google.com),(DST-PORT,443)),🫧 Proxy A 🫧
AND,((PROCESS-NAME,chrome.exe),(DOMAIN-SUFFIX,youtube.com),(DST-PORT,80)),🫧 Proxy A 🫧
AND,((PROCESS-NAME,chrome.exe),(DOMAIN-SUFFIX,youtube.com),(DST-PORT,443)),🫧 Proxy A 🫧
// 匹配特定进程
process: 'chrome.exe'
// 匹配所有进程
process: '*'// 进程名通配符
process: {
type: 'PROCESS-NAME-WILDCARD',
value: '*chrome*'
}
// 进程名正则
process: {
type: 'PROCESS-NAME-REGEX',
value: '.*chrome.*'
}
// 进程路径
process: {
type: 'PROCESS-PATH',
value: 'C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe'
}支持的进程匹配类型:
| 类型 | 说明 | 示例 |
|---|---|---|
PROCESS-NAME |
进程名匹配 | chrome.exe |
PROCESS-NAME-WILDCARD |
进程名通配符 | *chrome* |
PROCESS-NAME-REGEX |
进程名正则 | .*chrome.* |
PROCESS-PATH |
进程完整路径 | C:\\Program Files\\... |
PROCESS-PATH-WILDCARD |
进程路径通配符 | *\\chrome.exe |
PROCESS-PATH-REGEX |
进程路径正则 | .*Application\\\\chrome.* |
hosts: [
// 域名后缀
{ type: 'DOMAIN-SUFFIX', value: 'google.com' },
// 完整域名
{ type: 'DOMAIN', value: 'api.google.com' },
// 域名关键词
{ type: 'DOMAIN-KEYWORD', value: 'google' },
// 域名通配符
{ type: 'DOMAIN-WILDCARD', value: '*.google.*' },
// 域名正则
{ type: 'DOMAIN-REGEX', value: '^.*\\.google\\.com$' },
// Geosite
{ type: 'GEOSITE', value: 'google' },
// IPv4 网段
{ type: 'IP-CIDR', value: '192.168.1.0/24' },
// GeoIP
{ type: 'GEOIP', value: 'CN' }
]支持的域名/IP 匹配类型:
| 类型 | 说明 | 示例值 |
|---|---|---|
DOMAIN |
完整域名 | api.example.com |
DOMAIN-SUFFIX |
域名后缀 | example.com |
DOMAIN-KEYWORD |
域名关键词 | google |
DOMAIN-WILDCARD |
域名通配符 | *.example.* |
DOMAIN-REGEX |
域名正则 | ^.*\\.example\\.com$ |
GEOSITE |
Geosite 规则集 | google |
IP-CIDR |
IPv4 网段 | 192.168.1.0/24 |
IP-CIDR6 |
IPv6 网段 | ::1/128 |
IP-SUFFIX |
IP 后缀 | 8.8.8.8/24 |
IP-ASN |
IP ASN | 13335 |
GEOIP |
GeoIP 国家代码 | CN |
// 单个端口
ports: [443]
// 多个端口
ports: [80, 443, 8080]
// 不填或 [] 表示匹配所有端口
ports: [] // 或不写此字段预设代理组:
| 代理组名称 | 说明 |
|---|---|
DIRECT |
直连 |
REJECT |
拒绝 |
🫧 Proxy A 🫧 |
手动代理 A |
🍀 Proxy B 🍀 |
手动代理 B |
❄️ GFW |
GFW 代理 |
🌍 Foreign Media |
国外媒体 |
🦚 Region Media |
地区媒体 |
📲 Telegram |
Telegram |
🖥 AI |
AI 服务 |
Ⓜ️ Microsoft |
微软服务 |
🍎 Apple |
苹果服务 |
📥 Download |
下载 |
🐟 Final |
漏网之鱼 |
🟢 China Direct |
中国直连 |
也可以使用自定义代理组(需要在 groups 中定义)。
{
process: '*', // 所有进程
hosts: [
{ type: 'DOMAIN-SUFFIX', value: 'qoder.com' }
],
group: 'DIRECT',
description: 'qoder.com 直连'
}转换为:
DOMAIN-SUFFIX,qoder.com,DIRECT
{
process: 'chrome.exe',
hosts: [
{ type: 'DOMAIN-SUFFIX', value: 'google.com' },
{ type: 'DOMAIN-SUFFIX', value: 'googleapis.com' }
],
group: '🫧 Proxy A 🫧',
description: 'Chrome 访问 Google 走代理 A'
}转换为:
AND,((PROCESS-NAME,chrome.exe),(DOMAIN-SUFFIX,google.com)),🫧 Proxy A 🫧
AND,((PROCESS-NAME,chrome.exe),(DOMAIN-SUFFIX,googleapis.com)),🫧 Proxy A 🫧
{
process: 'steam.exe',
hosts: [
{ type: 'DOMAIN-WILDCARD', value: '*.steamcontent.com' },
{ type: 'DOMAIN-WILDCARD', value: '*.steamserver.net' }
],
ports: [80, 443],
group: 'DIRECT',
description: 'Steam 下载直连'
}转换为(4 条规则):
AND,((PROCESS-NAME,steam.exe),(DOMAIN-WILDCARD,*.steamcontent.com),(DST-PORT,80)),DIRECT
AND,((PROCESS-NAME,steam.exe),(DOMAIN-WILDCARD,*.steamcontent.com),(DST-PORT,443)),DIRECT
AND,((PROCESS-NAME,steam.exe),(DOMAIN-WILDCARD,*.steamserver.net),(DST-PORT,80)),DIRECT
AND,((PROCESS-NAME,steam.exe),(DOMAIN-WILDCARD,*.steamserver.net),(DST-PORT,443)),DIRECT
{
process: 'myapp.exe',
hosts: [
{ type: 'IP-CIDR', value: '192.168.1.0/24' },
{ type: 'IP-CIDR', value: '10.0.0.0/8' }
],
group: 'DIRECT',
noResolve: true, // 跳过 DNS 解析
description: '内网 IP 直连'
}转换为:
AND,((PROCESS-NAME,myapp.exe),(IP-CIDR,192.168.1.0/24)),DIRECT,no-resolve
AND,((PROCESS-NAME,myapp.exe),(IP-CIDR,10.0.0.0/8)),DIRECT,no-resolve
{
process: 'old-app.exe',
hosts: [
{ type: 'DOMAIN-SUFFIX', value: 'example.com' }
],
group: '🫧 Proxy A 🫧',
enabled: false, // 此规则不会生效
description: '已禁用的旧规则'
}如果不需要 AND 逻辑,可以使用简单规则:
simpleRules: {
prepend: [
{
type: 'DOMAIN-SUFFIX',
value: 'special.example.com',
group: 'DIRECT'
}
],
append: [
{
type: 'PROCESS-NAME',
value: 'wechat.exe',
group: '🟢 China Direct'
}
]
}groups: [
{
name: '🎯 My Custom Group',
type: 'select',
proxies: ['DIRECT', 'REJECT', '🫧 Proxy A 🫧', '🍀 Proxy B 🍀']
}
]- hosts 必填:每个三维规则必须至少有一个 host 匹配规则
- 进程匹配:Windows 需要
.exe后缀,macOS/Linux 不需要 - 端口范围:端口必须是 1-65535 之间的数字
- 规则数量:多个 hosts × 多个 ports 会展开为笛卡尔积,注意规则数量
- no-resolve:仅对 IP 相关规则有效(IP-CIDR、GEOIP 等)
- 检查
enabled是否为false - 查看构建日志中的验证警告
- 确认代理组名称正确
# 验证 TypeScript 语法
cd custom-rules-config
npm run validate检查是否不必要地设置了多个 ports,考虑简化规则:
// ❌ 会生成 10 条规则
hosts: [{ type: 'DOMAIN-SUFFIX', value: 'example.com' }],
ports: [80, 443, 8080, 8443, 9090, 9443, 10000, 10443, 11000, 11443]
// ✅ 只保留常用端口
hosts: [{ type: 'DOMAIN-SUFFIX', value: 'example.com' }],
ports: [80, 443]