先区分域名集合、IP 地址集合与出站标签,再按“指定例外、国内域名、国内及私有地址、其余代理”的顺序组织规则。本文适合已经导入节点、希望调整 v2rayN 分流的用户;示例采用 V2Ray/Xray 的传统路由字段,并说明 DNS、规则库与客户端生成配置之间的边界。
区分 geosite、geoip 与代理出站
路由分流处理的是“这条连接交给哪个出站”,不是“应该使用哪一种节点协议”。VMess、VLESS 等协议属于代理出站的连接方式;geosite:cn 与 geoip:cn 则是匹配条件。即使订阅中的节点协议换了,只要实际出站标签保持一致,路由规则也不必跟着更换。
| 写法 | 匹配对象 | 不能据此推断的事 |
|---|---|---|
geosite:cn | 当前规则库中 cn 分类收录的域名 | 不是所有中文网页,也不等于所有国内 IP |
geoip:cn | 当前规则库中归入 CN 的 IP 网段 | 不能据此确定网站运营方所在地或访问质量 |
geoip:private | 规则库定义的私有及特殊用途地址集合 | 不是操作系统全部局域网路由的替代品 |
outboundTag | 现有出站的 tag 字符串 | 写上 proxy 不会自动创建代理节点 |
传统配置通常从 geosite.dat 与 geoip.dat 读取集合。这里的“cn”是数据分类名,不是内核在线查询得到的地理结论。规则库来源、发布日期与分类维护方式都会影响结果;一个刚启用的域名没有进入集合时,应先加精确例外,再考虑更新数据。
按匹配顺序安排国内直连与代理兜底
路由规则一般按数组顺序从上到下检查,遇到第一个完整匹配的规则就选定出站,不会自动寻找“更精确”的下一条。单条规则同时填写 domain、ip、port 等不同条件时,通常要求这些字段共同满足;同一个 domain 列表内的多个条目则是任选其一匹配。
选择方案:国内直连,其余代理
域名优先层
- 先写需要强制代理或直连的精确例外。
- 再用
geosite:cn匹配国内域名集合。 - 已命中域名规则的连接不再检查后续 IP 规则。
IP 与兜底层
- 通过
geoip:private处理私有地址。 - 通过
geoip:cn处理国内 IP。 - 最后将剩余 TCP、UDP 连接交给代理出站。
精确例外必须放在宽泛集合之前;代理兜底放在最后,并与域名解析策略配套。
例如,某个域名既在 cn 集合里,又需要走代理,应把它的代理规则放在 geosite:cn 前面。只在底部追加代理规则没有作用,因为前面的直连规则已经结束匹配。反过来,把“所有 TCP、UDP 都代理”放到第一条,也会让后面的国内分流失去机会。
full:example.com:只匹配这个完整域名,不包含它的子域名。domain:example.com:匹配该域名及其子域名,不会匹配notexample.com。regexp::用于正则表达式;普通网站例外优先使用前两种,避免表达式过宽。
对照 JSON 配置与 domainStrategy
下面是一个路由片段,不是包含节点、入站与 DNS 的完整配置。它假定已有标签为 proxy 的可用代理出站,以及标签为 direct、协议为 freedom 的直连出站。示例域名 example.com 仅用于演示精确例外;不需要这条例外时,删除第一条规则即可。
{
"routing": {
"domainStrategy": "IPOnDemand",
"rules": [
{
"type": "field",
"domain": ["full:example.com"],
"outboundTag": "proxy"
},
{
"type": "field",
"domain": ["geosite:cn"],
"outboundTag": "direct"
},
{
"type": "field",
"ip": ["geoip:private", "geoip:cn"],
"outboundTag": "direct"
},
{
"type": "field",
"network": "tcp,udp",
"outboundTag": "proxy"
}
]
}
}
这里有意选用 IPOnDemand:域名没有命中前两条规则时,检查到 IP 规则便尝试解析域名,再用解析结果匹配国内或私有地址。已经命中 cn 域名集合的连接直接选定直连,不需要为了后续路由规则额外解析。若请求本来就是 IP 地址,则直接进入地址匹配。
本文配置
- 解析策略
IPOnDemand- 国内域名
geosite:cn → direct- 国内及私有 IP
geoip:cn / private → direct- 最终兜底
tcp,udp → proxy
执行到 IP 条件时按需解析,适合本文的显式兜底结构;解析失败或结果不准确仍会影响判断。
另一种写法
- 解析策略
IPIfNonMatch- 解析时机
- 域名未匹配任何规则后
- 宽泛兜底
- 避免提前匹配全部连接
- 未命中行为
- 通常交给配置中的第一个出站
需要同时检查出站顺序。不能只把本文策略名改掉,就认为行为仍然相同。
AsIs 则不为路由判断主动把域名解析成 IP。它适合主要依赖域名规则的设计,但不能期待一个只有域名的请求自动命中 geoip:cn。此外,路由用的 domainStrategy 与直连出站中的同名设置各司其职:前者决定如何匹配,后者影响连接目的地址的处理,不能相互替代。
在 v2rayN 中保存规则并验证生效
以下以提供“设置”与“路由设置”入口的 v2rayN 中文桌面界面为操作基准。不同版本的弹窗布局、规则编辑按钮文字可能不同;先确认当前启用的是哪套路由配置,再改规则内容。本文片段按 V2Ray/Xray 的 JSON 结构编写,不要粘贴到不接受 JSON 的单行域名输入框。
-
保留原配置
打开「设置」→「路由设置」,记录当前启用的路由项,并保留原始内容。能够新增路由项时优先新建一份测试配置,避免覆盖已经可用的规则。
-
核对出站
确认当前节点能够连接,并核对客户端规则所使用的直连、代理出站标识。示例中的
proxy、direct必须对应实际生成配置的标签,不能用节点显示名称替代。 -
依次录入
在「设置」→「路由设置」中编辑目标路由项,按示例顺序填写 domain、ip、network 与目标出站。将域名解析策略设为
IPOnDemand,不要把所有条件合并成一条规则。 -
应用并重连
保存并启用该路由项,重新启动核心或按界面提示应用配置。确认当前不是强制全部代理或全部直连的覆盖模式,再新建连接测试;已有长连接不一定立即换路。
-
查看日志
打开客户端日志,分别访问国内域名、其他域名和局域网地址。若访问日志可用,检查目的地址及选中的出站标签;出现规则库加载失败或找不到出站时,先修正配置再继续测试。
客户端往往会根据界面设置重新生成核心配置。直接修改临时生成文件,下一次切换节点或重启后可能被覆盖。因此,长期使用的规则应存放在客户端支持的路由配置入口;只有明确使用完整自定义配置时,才自行维护整份 JSON。
在 Android 端,v2rayNG 使用 Xray 内核,v2flyNG 使用 v2fly 内核。不能因为规则字段相似,就假定两者的界面入口、内置规则库和自定义配置导入方式完全一致。迁移规则时,先对照当前核心与客户端提供的配置能力,订阅地址也不应被当作路由规则导入。
用端口、日志和 DNS 逐项检查分流
判断是否生效,应看连接是否进入核心、命中了哪个出站,而不是只比较网页打开速度。一次 DNS 缓存命中、复用连接或远端内容缓存,都可能让速度看起来变化很大,却不能证明路由选择正确。下面三个数字是测试输入,不是本站实测结果,也不是所有客户端的默认值。
先到「设置」→「参数设置」核对本地监听端口与 SOCKS 支持情况。若本地 SOCKS 确实监听 127.0.0.1:10808,可在终端执行下面的命令;Windows 可明确调用 curl.exe。socks5h 会把目标域名交给代理端处理,适合检查域名规则;socks5 通常在本地解析,送到核心的可能已经是 IP。
curl --proxy socks5h://127.0.0.1:10808 --head --max-time 15 https://www.baidu.com/
curl --proxy socks5h://127.0.0.1:10808 --head --max-time 15 https://example.com/
- 第一条用于观察国内域名路径,最终是否直连仍以当前 geosite 数据和日志为准。
- 第二条在保留示例首条规则时,应由精确域名例外选择
proxy。 - 请求超时不一定代表没有命中规则;还要分别检查代理节点、目标服务与 DNS 是否可用。
- 每次修改后重新发起请求,避免浏览器复用之前建立的连接。
如果应用只把 IP 交给核心,域名规则可能根本没有可匹配的域名。嗅探在某些协议和连接中可以补充域名信息,但并不保证识别全部流量,也可能改变匹配结果。排错时先记录实际目标形式,再决定是否调整嗅探,避免同时更改 DNS、嗅探与路由后无法定位原因。
处理国内网站走代理与规则不生效
加了 geosite:cn,国内网站还是走代理?
先在「设置」→「路由设置」确认该路由项已启用,再检查前面是否存在全部代理规则。若日志显示域名未被集合收录,可临时添加 domain: 例外并放在兜底之前;若收到的是 IP,则转查 geoip 与 DNS,而不是继续追加域名。
提示 geosite 或 geoip 加载失败怎么办?
检查错误中指向的规则库名称、分类名与路径。使用客户端提供的数据更新入口恢复相应文件,再重启核心;不要把其他格式的规则文件改名为 .dat。自定义数据源还应确认它确实提供 cn 与 private 等所需分类。
换了 IPIfNonMatch,国内 IP 规则反而不命中?
检查末尾是否还有 network: tcp,udp 这样的全覆盖规则。域名先命中它后,不会触发“未匹配再解析”。恢复本文的 IPOnDemand 结构,或重新设计不含提前兜底的规则并核对第一个出站。
局域网访问失败,是不是加 private 就够了?
先确认实际地址,例如网关是否确为 192.168.1.1。若请求已进入核心,检查私有地址是否命中 direct;若被 TUN 排除、操作系统路由或防火墙拦截,核心路由无法单独解决。直连也只代表选择本机出口,不代表目标一定可达。
更新订阅后,分流为什么没有跟着更新?
普通节点订阅主要更新节点连接参数,不等于同步路由规则库或本地路由配置。分别检查订阅更新、geo 数据更新与当前路由项三个位置。每次只改一项,并用同一组测试域名复查日志,才能判断变化来自哪里。
维护时保留一份简短的例外清单,写清域名、期望出站与添加原因。优先修正过宽规则和排序,再考虑堆叠更多分类。国内直连、其余代理是一套可解释的默认方案,不是所有网络环境下的唯一选择;最终应以实际访问需求、解析结果与核心日志共同确认。