搜索 K
Appearance
绝大多数人的分流翻车,不是规则写错了,而是心智模型错了。先把下面六条背下来,后面所有配置都是它们的排列组合:
MATCH 指向谁。DOMAIN-SUFFIX 直连,并且尽量配 no-resolve。任何一条会触发 DNS 解析的规则,都可能让你的内网域名被公共 DNS 解析成一个不存在的公网 IP。DOMAIN-SUFFIX 永远优先于 GEOIP。把 GEOIP,CN,DIRECT 放在顶部是新手最经典的错误——它会把大量走国内 CDN 的境外服务一起直连掉,表现为"某些网站时快时慢、时通时断"。fake-ip 模式下,域名规则是生效的;但如果你在规则链靠前的位置写了 IP-CIDR 且没加 no-resolve,就会强制触发一次真实解析,破坏 fake-ip 的语义。一句话结论:能写域名规则就别写 IP 规则,能用 DOMAIN-SUFFIX 就别用 DOMAIN-KEYWORD,能限定到策略组就别直接写 DIRECT/PROXY。
以 mihomo(Clash.Meta)内核 + TUN 模式为例,一次访问大致经历五个阶段:
应用发起请求
→ 内核截获(TUN / 系统代理 / redirect)
→ 判定目标形态(域名 or 裸 IP)
→ [若为域名且 fake-ip 开启] 分配 198.18.x.x 假 IP 并建立域名映射
→ 规则引擎自顶向下匹配,命中即返回策略组
→ 按策略组选定出口节点,建立出站连接关键点在第 3、4 步:fake-ip 让"域名"这个信息在连接建立阶段被保留下来,所以域名规则能命中。一旦你把 fake-ip-filter 里的域名排除出去,或者客户端跑的是 redir-host 模式,域名匹配的成功率就会显著下降——这是很多人"规则明明写了却不生效"的根因。
DOMAIN / DOMAIN-SUFFIX / DOMAIN-KEYWORD / IP-CIDR / GEOIP / PROCESS-NAME / SRC-PORT 等。RULE-SET(订阅式远程规则集)与 GEOSITE(内置域名集合)。规则集本质是把成百上千条基础规则打包,内核会用前缀树 / 哈希优化匹配,性能通常比手写大量 DOMAIN-SUFFIX 更好。AND / OR / NOT 组合条件,例如"目标域名是某 SDK 且进程名是某 App 才走代理"。这一层消耗 CPU 更高,建议只用于极少数高价值场景。四个真实高频原因,按出现频率排序:
nameserver-policy 干预。IP-CIDR 规则今天命中、明天不命中,因为同一域名解析到了不同的边缘节点。RULE-SET 拉取失败时,多数内核会静默跳过该条规则,而不是报错——于是"莫名其妙全走直连了"。| 规则类型 | 匹配对象 | 是否触发 DNS | 单条匹配开销 | 建议排序区间 | 典型场景 | 误伤风险 | 维护成本 |
|---|---|---|---|---|---|---|---|
DOMAIN | 精确域名 | 否 | 极低(哈希) | 10–20 | 登录、支付、API 网关 | 极低 | 高 |
DOMAIN-SUFFIX | 域名后缀 | 否 | 低(前缀树) | 20–40 | 私有域名、内网 OA | 低(注意泛后缀) | 中 |
DOMAIN-KEYWORD | 子串包含 | 否 | 中(线性扫描) | 40–60 | 广告、统计、埋点 | 中高 | 低 |
IP-CIDR | 目标 IP 段 | 默认会 | 低 | 60–80 | 内网、公司 VPN 段 | 中(CDN 漂移) | 中 |
IP-CIDR,no-resolve | 目标 IP 段 | 否 | 低 | 60–80 | 内网直连、局域网 | 低 | 中 |
GEOIP | IP 归属地 | 是 | 中 | 85–95 | 国内直连兜底 | 高 | 低 |
GEOSITE | 内置域名集 | 否 | 低 | 25–45 | 大厂域名分组 | 中 | 极低 |
PROCESS-NAME | 进程名 | 否 | 中 | 5–15 | 分应用代理 | 低 | 中 |
RULE-SET | 远程规则集 | 否 | 中 | 30–70 | 订阅式统一维护 | 中 | 极低 |
MATCH / FINAL | 全部剩余 | 否 | — | 9999(恒定末位) | 兜底策略 | — | — |
读表要点:
MATCH 必须且在最后,它是兜底。写成"黑名单"就指向 DIRECT,写成"白名单"就指向你的主力策略组。PROCESS-NAME 排在极前的原因很直接:这是用户意图最明确的判据,优先级天然高于按域名猜。别碰 GEOIP,别自己造规则。直接使用订阅商提供的规则集,最多补两条:
DOMAIN-SUFFIX,内网域名,DIRECTDOMAIN-SUFFIX,xxx.com,PROXY这是最容易翻车的场景。核心诉求是内网域名绝对不能走代理,否则会出现"打开 OA 白屏、远程桌面连不上":
rules:
- DOMAIN-SUFFIX,corp.example.com,DIRECT
- DOMAIN-SUFFIX,internal,DIRECT
- IP-CIDR,10.0.0.0/8,DIRECT,no-resolve
- IP-CIDR,172.16.0.0/12,DIRECT,no-resolve
- IP-CIDR,192.168.0.0/16,DIRECT,no-resolve诉求是"同一浏览器不同 Profile 走不同地区出口"。建议用策略组 + 域名规则绑定,而不是靠 IP 规则:
DOMAIN-SUFFIX,后台域名,US-GroupPROCESS-NAME 锁定到具体浏览器进程最省心的做法不是逐条加规则,而是代理兜底 + 国内镜像双保险:
rules:
- DOMAIN-SUFFIX,github.com,PROXY
- DOMAIN-SUFFIX,githubusercontent.com,PROXY
- DOMAIN-SUFFIX,npmjs.org,PROXY
- DOMAIN-SUFFIX,pypi.org,PROXY
- DOMAIN-SUFFIX,docker.io,PROXY
- DOMAIN-SUFFIX,docker.com,PROXY注意:docker.io 的镜像拉取走的是 registry-1.docker.io 与大量 CDN 域名,仅加一条往往不够,建议直接搜社区维护的 dev 规则集。
为什么在分流文章里提节点? 因为分流做得再精细,出口节点如果超售严重,分流也只是把拥堵从 A 路换到 B 路。选型与调优是两件事,不能互相替代。
rules:
- PROCESS-NAME,Telegram.exe,PROXY
- DOMAIN-SUFFIX,mycompany.cn,DIRECT
- DOMAIN-SUFFIX,example-private.com,DIRECT
- DOMAIN-SUFFIX,openai.com,AI-Group
- GEOSITE,category-ads-all,REJECT
- GEOIP,CN,DIRECT
- MATCH,PROXY坑位:GEOIP,CN,DIRECT 必须在所有域名规则之后。另外 GEOIP 会触发 DNS 解析,在纯 IP 流量多的情况下会拖慢首包。
sing-box 用的是 route.rules 数组 + rule_set,语义接近但字段名不同:
{
"route": {
"rules": [
{ "domain_suffix": ["internal", "corp.example.com"], "outbound": "direct" },
{ "ip_cidr": ["10.0.0.0/8"], "outbound": "direct" },
{ "rule_set": "geosite-cn", "outbound": "direct" }
],
"final": "proxy"
}
}坑位:sing-box 1.11 之后 geoip / geosite 字段被精简,需要改用 rule_set 远程引用,老教程直接抄会报错。
Surge 用 RULE-SET 加模块化配置,支持 AND / OR / NOT 组合:
RULE-SET,SYSTEM,DIRECT
DOMAIN-SUFFIX,internal,DIRECT
FINAL,Proxy坑位:Surge 的 SYSTEM 规则集会兜住大量本地服务,务必放在域名规则之前。
分区文件 filter_local / filter_remote,语法是 host-suffix / ip-cidr:
host-suffix, internal, direct
host-suffix, corp.example.com, direct
ip-cidr, 10.0.0.0/8, direct坑位:QX 的 ip-cidr 默认不带 no-resolve 语义,内网场景建议写 ip-cidr, 10.0.0.0/8, direct, no-resolve。
配置段写在 [Rule] 下,语法与 Clash 接近但大小写和别名不完全一致,DOMAIN-SUFFIX 需写成 DOMAIN-SUFFIX,而 IP-CIDR 的 no-resolve 支持良好。坑位:Shadowrocket 的规则条数超过约 3000 条后加载速度明显下降,建议改用 RULE-SET 远程引用。
规则写完没生效,别猜,按下面的顺序打命令。
# 看内核是否按你的 nameserver-policy 解析
dig +short api.example.com
# 对比公共 DNS 解析结果,判断是否存在污染/CDN 差异
dig +short api.example.com @1.1.1.1
nslookup api.example.com 223.5.5.5# 对比直连与经代理的延迟、丢包、路由跳数
mtr -rwzc 50 api.example.com
# 强制指定 IP 验证是否被分流正确
curl -v --resolve api.example.com:443:203.0.113.10 https://api.example.com/
# 只看握手耗时与首字节,定位是 DNS 慢还是链路慢
curl -s -o /dev/null -w "dns:%{time_namelookup} conn:%{time_connect} tls:%{time_appconnect} ttfb:%{time_starttransfer}\n" https://api.example.com/# 端口连通性(Windows 可用 tcping.exe)
tcping -t 5 api.example.com 443mihomo 的外部控制器打开后:
curl -s http://127.0.0.1:9090/connections | head -c 2000看到每条连接的 rule 与 rulePayload 字段,就能直接确认命中了��条规则——这是排查分流问题最有效的单一手段。
# macOS / Linux
lsof -i :7890
ss -tunp | grep 443
# Windows
netstat -ano | findstr :7890| 现象 | 高概率原因 | 验证方式 | 处置 |
|---|---|---|---|
| 目标站走直连 | GEOIP,CN 位置过前 | 查 /connections 的 rule 字段 | 把 GEOIP 下移 |
| 内网域名打不开 | 被公共 DNS 解析 | dig + 对比内网 DNS | 加 DOMAIN-SUFFIX,...,DIRECT |
| 改了规则不生效 | 连接复用未断开 | 关闭应用重连 | 重启内核 + 断开会话 |
| 延迟忽高忽低 | CDN/Anycast 漂移 | 多次 mtr 对比 | 改域名规则,弃用 IP 规则 |
| 部分应用完全没走代理 | 应用硬编码 DoH | 抓包看解析目标 | 关闭应用内"安全 DNS" |
| 首包特别慢 | GEOIP 触发同步解析 | curl 看 time_namelookup | 加 no-resolve 或前置域名规则 |
| 规则集失效 | 远程订阅拉取失败 | 日志搜 rule-set | 换可达的规则集地址 |
| 宣传话术 | 真实含义 | 如何验证 | 风险等级 |
|---|---|---|---|
| "AI 智能分流,无需配置" | 大概率是 GEOIP,CN 一刀切 | 访问境内 CDN 的境外站测速 | 中 |
| "原生 IP 全解锁" | 可能只是 DNS 解锁或共享 IP | 多设备并发登录同一流媒体 | 高 |
| "不限速不限量" | 通常有隐性 QoS 或并发连接数限制 | 高峰时段多线程测速 | 高 |
| "专线直连" | 可能只是普通 BGP 中转 | mtr 看跳数与 AS 路径 | 中 |
| "规则自动更新" | 可能更新频率极低或缺维护 | 查规则集 GitHub 提交记录 | 中 |
| "一条规则解决所有问题" | 不存在,分流是持续维护过程 | 自查 /connections | 低 |
通用原则:任何"零维护"的分流方案都要打问号。分流本质是一个持续迭代的黑名单/白名单维护工程,不是一次配置就永久生效的开关。
Q1:我加了 DOMAIN-SUFFIX,example.com,DIRECT,但访问 www.example.com 还是走代理? 先确认规则写在内核真正加载的那份配置里(很多客户端有"配置覆盖"机制,UI 里改的被订阅覆盖了)。其次检查 example.com 是否同时匹配了更靠前的 GEOSITE 或 RULE-SET——first-match 会优先命中前面的规则。
Q2:IP-CIDR 规则加了 no-resolve 之后失效了,为什么?no-resolve 的语义是"如果目标在连接建立阶段已经是 IP 而不需要解析,就直接匹配;如果需要解析,则跳过这条规则"。也就是说,它不会主动解析域名去匹配。如果你的目标本身是域名,就只能靠域名规则。
Q3:黑白名单到底该怎么选? 看你日常访问的构成。境外为主 → 白名单(兜底走代理);国内为主 → 黑名单(兜底直连)。混合型用户建议用成熟规则集,而不是自己拍脑袋定。
Q4:为什么 DOMAIN-KEYWORD 这么危险? 因为它做的是子串匹配。DOMAIN-KEYWORD,ai 会把 taian.com、waicai.cn 这类完全无关的域名一起命中。除非是广告拦截这种"宁可错杀"的场景,否则别用。
Q5:改了规则,测速变快了但实际网页打开更慢,怎么回事? 很可能你把某些走国内 CDN 的境外服务误判成直连了。直连快的是 ping,但真实的 TLS 握手和回源路径可能很差。用 curl 看 time_appconnect 而不是看 ping。
Q6:规则条数太多会不会影响性能? 会。经验上,DOMAIN / DOMAIN-SUFFIX 在几千条量级下几乎无感知(前缀树 + 哈希),但 DOMAIN-KEYWORD 超过几百条就会出现明显线性扫描开销。超过 5000 条建议全部改为 RULE-SET。
Q7:需要给私有域名做 DNS 分离吗? 需要。内网域名建议在 nameserver-policy 里单独指定内网 DNS,否则会出现"域名规则写对了,但解析到了公网地址"的诡异现象。
| 主题 | 推荐阅读 |
|---|---|
| 分流与规则整体入门 | /tutorial/ |
| 配置目录与文件结构 | /tutorial/usage/config/ |
| 客户端安装与初始化 | /tutorial/usage/ |
| 底层协议与链路原理 | /tech/ |
| 按场景选型的完整方案 | /scenario/ |
| 测速与延迟判读方法 | /help/ |
| 排障与常见故障处理 | /help/ |