本文适合已经能连接节点、准备调整分流规则的用户。先区分域名集合与 IP 集合,再选择解析策略,最后把广告拦截、国内直连和代理兜底按顺序组合。示例使用 V2Ray/Xray 的原生路由字段,说明如何接入现有客户端配置,并通过日志确认实际出站,避免只凭网页是否打开判断规则有效。
1. geosite 与 geoip:分别匹配什么
路由分流发生在连接进入内核之后。内核取得目标域名或 IP,依次检查 routing.rules,找到第一条满足条件的规则后,把连接交给对应的 outboundTag。它不会把所有命中的规则合并,也不会在后面自动寻找“更精确”的规则。因此,规则内容与排列顺序同样重要。
| 写法 | 匹配对象 | 依赖与边界 |
|---|---|---|
geosite:cn | 域名集合 | 依赖 geosite.dat 中的 cn 分类,不等于所有以 .cn 结尾的域名。 |
geoip:cn | 中国地区 IP 网段 | 依赖 geoip.dat;按地址归属匹配,不判断网站的语言和运营主体。 |
geoip:private | 私有及特殊用途地址集合 | 常用于局域网直连;实际收录范围以当前数据文件为准。 |
domain:example.com | 指定域名及其子域名 | 不依赖域名分类,适合补充自己的例外规则。 |
full:example.com | 完整域名 | 只匹配该名称,不连带匹配其子域名。 |
geosite 是分类数据,不是实时搜索服务。同一名称的分类,在不同数据来源或更新日期下可能包含不同条目。启动时报找不到 category-ads-all,首先应检查数据文件是否包含这个分类,而不是调整节点协议。Xray 与 V2Fly 的常见数据文件可以提供这些标签,但具体内容仍需以本机文件为准。
2. domainStrategy:何时为了分流解析域名
routing.domainStrategy 控制的是路由判断阶段如何使用域名解析,不是全局 DNS 开关,也不等同于直连出站的同名设置。如果应用向内核提交的是目标 IP,域名规则通常无法凭空还原网站名称;如果提交的是域名,是否进一步查询 IP 则由下列策略决定。
IPIfNonMatch
推荐先使用域名等现有信息匹配;没有规则命中时,再解析目标域名并尝试 IP 规则。适合作为国内外分流的起点,但末尾的全匹配规则会让第一轮直接结束,使用时必须检查兜底方式。
适合:域名优先、希望未分类域名继续按 IP 判断
AsIs
不主动为路由判断解析域名。域名交给 geosite 或显式域名规则,应用直接提交的 IP 仍可匹配 geoip。它的行为容易预测,但未收录的域名不能靠 geoip:cn 补充判定。
适合:希望减少路由解析、主要依赖域名分类
IPOnDemand
当匹配过程遇到需要 IP 的规则时,按需解析目标域名。把明确的域名规则放在 IP 规则前,再设置代理兜底,可以保留域名优先,同时让未分类域名进入 IP 判断。
适合:需要 IP 补充匹配且使用显式兜底规则
本文的组合示例采用 IPOnDemand,因为最后会明确添加 network: "tcp,udp" 代理兜底。若改成 IPIfNonMatch,这条兜底规则会在第一次匹配时命中,未分类域名就不会触发“无匹配后解析”。另一种写法是移除全匹配兜底,并让配置中第一个出站为代理;这时必须确认客户端生成的出站顺序,不能只修改策略名称。
- 域名已命中广告规则:直接交给阻断出站,不必继续查 IP。
- 域名已命中国内域名规则:直接交给直连出站,不再受后续 IP 分类影响。
- 域名未命中前面的规则:在 IP 规则处按需解析;国内地址直连,其他连接落到代理兜底。
3. 配置前检查:出站标签、端口与数据文件
以下配置约定三个出站标签:proxy 为已经可用的代理节点,direct 为 Freedom 直连,block 为 Blackhole 阻断。它们是区分大小写的字符串引用,不是界面显示名称。节点使用 VMess 还是 VLESS,不改变路由引用标签的方式;节点的传输与安全参数仍由原有出站负责。
端口 10808 只是本文测试命令的约定,不代表所有安装环境的默认值。执行命令前,应在客户端的本地监听设置中确认真实端口;若本机监听不同,就替换命令中的数字。监听地址保持 127.0.0.1,不需要为了路由测试开放给局域网其他设备。
-
保存备份
备份现有配置与自定义路由。先用当前节点访问一个已知可用的网站,确认基础连接正常,再开始调整分流。
-
核对路由入口
v2rayN 常见入口为「设置」→「路由设置」。先记录当前启用的规则集;不同界面版本若菜单位置不同,以实际出现的「路由设置」页面为准,不要把原生配置直接粘贴进订阅地址框。
-
核对出站
查看导出的运行配置,确认代理出站的实际 tag。若不是 proxy,就替换下文全部对应引用;保留既有节点的服务器、认证和传输设置。
-
核对资源
确认内核能够读取 geosite.dat、geoip.dat,并包含 cn、private、category-ads-all 等本文使用的分类。缺少分类时先修复资源,或移除对应规则再测试。
-
应用并重启
保存规则后重新启动代理服务,再看启动日志。先处理 JSON 解析、标签不存在和资源加载错误,再做网页访问测试。
4. 国内直连、广告拦截与代理兜底配置
下面是可合并到原生配置顶层的 routing 对象,不是一份包含节点凭据的完整客户端配置。它依次执行:广告域名阻断、国内域名直连、私有地址直连、国内 IP 直连、其余 TCP/UDP 走代理。保持前文约定的三个出站标签存在,即可在现有配置中使用这些规则。
{
"routing": {
"domainStrategy": "IPOnDemand",
"rules": [
{
"type": "field",
"domain": [
"geosite:category-ads-all"
],
"outboundTag": "block"
},
{
"type": "field",
"domain": [
"geosite:cn"
],
"outboundTag": "direct"
},
{
"type": "field",
"ip": [
"geoip:private"
],
"outboundTag": "direct"
},
{
"type": "field",
"ip": [
"geoip:cn"
],
"outboundTag": "direct"
},
{
"type": "field",
"network": "tcp,udp",
"outboundTag": "proxy"
}
]
}
}
如果已有 routing,应替换或整理其中的策略和规则数组,而不是在同一级重复添加第二个同名键。下面给出直连与阻断出站对象:把需要的对象加入现有 outbounds 数组即可。已有相同标签时保留一份,不要用这段数组覆盖原有代理节点。
[
{
"tag": "direct",
"protocol": "freedom",
"settings": {}
},
{
"tag": "block",
"protocol": "blackhole",
"settings": {}
}
]
两种接入方式:保留节点,只调整路由
图形界面管理规则
- 在路由设置中建立或复制一组自定义规则。
- 按示例顺序填写域名、IP、网络条件。
- 用客户端提供的代理、直连、阻断出口选项映射标签。
- 启用该规则集,检查生成的运行配置。
原生 JSON 配置
- 在顶层合并 routing 对象。
- 保留已经验证可用的 proxy 出站。
- 补齐 direct、block 两个出站对象。
- 由客户端加载受管理的自定义配置并查看启动日志。
图形界面可能改写标签或出站顺序,最终判断依据是内核实际加载的配置,不是规则集的显示名称。
这个方案中的“国外走代理”准确含义是“未被前面规则判定为阻断或直连的流量走代理”,不是逐一列举所有海外网站。采用兜底可以覆盖新出现的域名,但 geoip:cn 仍可能让某个海外服务的国内 CDN 地址直连。如果某站必须使用代理,应把该站的显式域名规则放在 IP 规则之前。
5. 规则排序与例外:先精确,再宽泛
广告规则放在国内域名规则前,意味着被广告分类收录的国内域名同样会被阻断。若一个必要的登录或静态资源域名被误拦截,可以先添加精确例外,再保留广告规则。例外应尽量窄,不要为了修复一个资源域名就把整个大型域名集合直连。
{
"type": "field",
"domain": [
"full:static.example.com"
],
"outboundTag": "direct"
}
static.example.com 是用于展示匹配语法的示例域名,不是需要放行的实际业务资源。使用时换成日志中确认的完整目标名称,把这条规则插入广告规则之前。需要连同全部子域名处理时才使用 domain:;只处理单一主机名则优先使用 full:。
| 需求 | 插入位置 | 检查重点 |
|---|---|---|
| 广告误拦截放行 | 广告阻断规则之前 | 只放行日志中确认的必要域名。 |
| 指定网站强制代理 | 国内域名及 IP 直连规则之前 | 必要时覆盖网站的独立资源域名。 |
| 局域网指定地址直连 | 代理兜底之前 | 应用是否确实把请求交给了内核。 |
| 调整默认出口 | 规则数组末尾 | 不要让全匹配规则提前遮住后续规则。 |
广告域名阻断不是页面元素过滤。若广告与正文共用同一个主机名,路由无法只删除广告区域;按域名阻断也可能同时影响视频播放、登录或统计回调。出现功能异常时,先确认具体命中的域名和出站,再缩小拦截范围。
6. 验证分流:看出站日志,不只看网页
测试时先保持代理模式和节点不变,每次只修改一个规则。短时启用可记录连接去向的日志级别,观察同一请求的目标及出站标签;完成后恢复日常日志级别。日志可能包含访问目标,分享截图前应清理订阅地址、节点凭据和个人访问记录。
- 国内域名:选择确认被当前 geosite:cn 收录的站点,检查连接是否交给 direct,而不是只观察页面加载速度。
- 代理兜底:选择确认不命中前置规则的目标,检查出站是否为 proxy;出口 IP 检测只能辅助验证这一条请求。
- 广告命中:从本机分类数据或访问日志中找到确认属于广告集合的域名,检查是否交给 block,不必主动打开不熟悉的站点。
- 私有地址:访问自己管理的局域网服务,检查是否走 direct。浏览器若按系统设置绕过代理,请求可能根本不会出现在内核日志里。
命令行验证可以减少浏览器缓存和扩展带来的干扰。以下命令要求本地 SOCKS 监听为 127.0.0.1:10808,并使用 socks5h 将目标域名交给代理端处理。在 Windows 中使用 curl.exe 可避免命令别名差异,其他系统可使用 curl。
curl --proxy socks5h://127.0.0.1:10808 --connect-timeout 10 --max-time 20 -I https://www.baidu.com
curl --proxy socks5h://127.0.0.1:10808 --connect-timeout 10 --max-time 20 -I https://example.com
这两个地址用于产生可观察的请求,不预设它们在任意数据版本和网络环境下的最终分类。收到 HTTP 状态码只说明请求获得了响应,不能证明走了哪个出站;应同时查看日志。若第一条命令返回重定向,也应按每个连接的实际目标判断,不能把后续新域名沿用为同一条匹配结果。
7. 常见问题:DNS、模式覆盖与分类缺失
加了 geoip:cn,国内网站为什么还走代理?
先检查实际配置是否为 IPIfNonMatch 且末尾存在全匹配规则。这种组合可能让域名在解析前就命中代理兜底。按本文改用 IPOnDemand,并把 IP 规则放在兜底之前;再查看解析得到的地址是否属于当前 geoip:cn。
规则保存了,为什么日志没有任何变化?
确认保存后已启用该规则集并重启服务。检查是否仍使用全局代理或全局直连模式,覆盖了自定义路由;再检查应用是否真的进入本地代理。系统代理只影响遵循该设置的应用,并不接管所有网络连接。
启动提示找不到 geosite 分类怎么办?
先查看错误中具体缺失的标签,再核对内核实际加载的数据文件位置与内容。可临时移除该条规则验证其他部分能否启动,随后补齐兼容的数据文件。只更新订阅节点列表,通常不会自动修复分类资源问题。
安卓端能直接复制桌面的路由配置吗?
v2rayNG 使用 Xray 内核,v2flyNG 使用 V2Fly 内核;本文的基础字段在相应内核中广泛使用,但客户端界面、自定义配置入口和资源管理方式不同。先核对出站标签与数据分类,再按客户端支持的方式导入,不要把桌面端整个配置文件当成订阅地址。
用了 geosite,是否就不用检查 DNS 了?
仍需检查。未分类域名的 IP 判断依赖解析结果,直连建立连接也需要可用的目标地址。routing.domainStrategy 不保证所有应用的 DNS 请求都被接管,也不自动构成完整的 DNS 隐私方案。先确认应用提交的是域名还是 IP,再检查解析路径和实际出站。
排查顺序可以固定为:配置能否加载、请求是否进入内核、目标是域名还是 IP、第一条命中规则是什么、出站能否建立连接。先完成这五项,再考虑补充分类或调整 DNS。这样能把“规则没匹配”和“匹配正确但节点连接失败”分开处理,减少反复改配置造成的干扰。