先把路由分流拆成三个判断对象
v2rayN 中的路由规则最终交给 Xray 内核执行。每一条连接进入内核后,路由模块会读取目标域名、目标 IP、端口、网络类型和入站标签等属性,再从上到下检查规则。首条满足条件的规则决定连接使用哪个出站。常见出站通常包括代理、直连和阻断,其中本文只处理代理与直连的精确分离。
在中国大陆的日常网络环境中,一套容易维护的规则可以分成三个逻辑层。第一层处理局域网和本机私有地址,避免访问路由器、存储设备或本地服务时绕入代理链路。第二层处理明确属于中国大陆站点或地址段的目标,使其直接连接。第三层不再枚举域名类别,而是把剩余流量交给代理出站。
- 私有地址层:匹配
geoip:private,使用直连出站。 - 中国大陆目标层:分别匹配
geosite:cn与geoip:cn,使用直连出站。 - 默认处理层:匹配其余 TCP 与 UDP 连接,使用代理出站。
这里的“层”是策略结构,不代表每层只能写一个规则对象。域名条件与 IP 条件最好拆成独立规则,因为同一条规则中不同字段通常是同时满足关系,而同一字段内的多个值才是任一命中关系。把 domain 和 ip 不加区分地塞进一个规则,可能让实际匹配范围比预期更窄。
geosite 与 geoip 分别解决什么问题
geosite 根据域名类别判断
geosite 数据按域名特征整理类别。geosite:cn 用于匹配被归入中国大陆类别的域名。应用访问目标时,如果内核能够取得原始域名,域名规则可以在建立目标连接之前完成判断,不必先依赖目标地址属于哪个 IP 段。
域名类别适合处理使用内容分发网络、动态地址或多地址调度的站点。某个站点的解析结果可能随运营商、地区和时间变化,但域名归属通常更稳定。将这类域名直接匹配到直连出站,可以减少因地址变化造成的规则漂移。
需要注意,geosite:cn 表示数据文件中的域名分类,不等于“当前解析结果一定位于中国大陆”。站点可能使用跨区域节点,企业也可能调整托管位置。因此,geosite 更适合表达域名策略,不能替代实时网络测量。
geoip 根据目标地址判断
geoip 数据把 IP 地址段按用途或地区归类。geoip:private 覆盖局域网等非公网目标,常用于直连本机网段、家庭路由器管理地址、局域网打印服务和内部存储设备。它应放在普通地区规则之前,因为私有地址不是一个适合交给远端代理处理的目标类别。
geoip:cn 则用于匹配归入中国大陆地址段的目标。当应用直接连接某个 IP,或者域名没有命中已有 geosite 规则但随后完成了解析,IP 规则便可以补充判断。它与 geosite:cn 不是替代关系,而是分别覆盖“按域名识别”和“按地址识别”两条路径。
| 规则项 | 判断依据 | 典型用途 | 建议出站 |
|---|---|---|---|
geoip:private |
目标 IP 属于私有地址范围 | 局域网、本机网段、内部服务 | 直连 |
geosite:cn |
目标域名属于对应分类 | 按域名识别中国大陆站点 | 直连 |
geoip:cn |
目标 IP 属于对应地址段 | 直接访问 IP 或域名解析后的补充判断 | 直连 |
network: tcp,udp |
连接使用 TCP 或 UDP | 接收前面规则未命中的常规流量 | 代理 |
domainStrategy 决定何时把域名解析成 IP
只写 geosite 与 geoip 还不够。域名请求是否会继续进入 IP 判断,取决于路由配置中的 domainStrategy。这个参数影响路由阶段的解析行为,不是简单的“DNS 开关”。理解它,可以解释很多“域名规则正常,IP 规则却没有接管”的现象。
AsIs:保持原始目标形式
AsIs 表示路由阶段优先按连接携带的原始目标进行判断。目标是域名时,主要使用域名相关规则;路由模块不会为了尝试 geoip 规则而主动把域名解析成 IP。目标本身就是 IP 时,geoip 规则仍然可以正常匹配。
这种模式解析动作少,路径直观,但对“域名未被 geosite 收录、希望再按解析地址判断”的场景覆盖不足。例如某个中国大陆域名没有命中 geosite:cn,即使它解析到 geoip:cn 地址段,也可能直接落入最后的代理规则。
IPIfNonMatch:域名规则未命中后再解析
IPIfNonMatch 适合本文的三段式分流。内核先使用域名信息尝试规则;当域名规则没有得到结果时,再解析目标域名,并使用得到的 IP 尝试地址规则。这样可以先发挥 geosite:cn 的分类优势,再让 geoip:private 与 geoip:cn承担补充判断。
这一策略在准确性和额外解析之间较为平衡。它不会在每次域名连接开始时立即要求 IP 判断,但当域名分类不足时仍有第二条匹配路径。对于“国内域名直连、国内地址直连、其余代理”的常规桌面配置,通常比 AsIs 更符合预期。
IPOnDemand:存在 IP 条件时提前解析
IPOnDemand 会在路由判断需要 IP 信息时更积极地解析域名。配置中存在可参与匹配的 IP 规则时,解析可能较早发生。它适合确实依赖目标地址进行细粒度控制的配置,但也意味着 DNS 路径、缓存状态和解析结果会更直接地影响路由过程。
如果规则目标只是常见的国内直连与其余代理,没有必要仅为了“看起来更彻底”而选择更积极的解析策略。先使用 IPIfNonMatch,再根据日志中未命中的具体目标调整,通常更容易定位问题。
可直接调整的三段式路由模板
下面的片段只展示 routing 部分。它假定现有完整配置中已经存在标签为 direct 的直连出站和标签为 proxy 的代理出站。若当前配置使用其他标签,应将模板中的 outboundTag 改成实际值。标签必须完全一致,包括大小写。
{
"routing": {
"domainStrategy": "IPIfNonMatch",
"rules": [
{
"type": "field",
"ip": [
"geoip:private"
],
"outboundTag": "direct"
},
{
"type": "field",
"domain": [
"geosite:cn"
],
"outboundTag": "direct"
},
{
"type": "field",
"ip": [
"geoip:cn"
],
"outboundTag": "direct"
},
{
"type": "field",
"network": "tcp,udp",
"outboundTag": "proxy"
}
]
}
}
从策略上看,这仍然是三段。第一条对应私有地址层;第二、第三条共同构成中国大陆目标层,但为了避免不同字段间的同时满足关系而拆开;第四条是代理兜底层。
当目标是局域网 IP 时,第一条规则直接命中。目标是 geosite:cn 分类中的域名时,第二条规则命中。目标是直接输入的中国大陆 IP,或未命中域名分类但在 IPIfNonMatch 阶段解析到中国大陆地址时,第三条规则接管。其余常规 TCP、UDP 流量进入最后的代理出站。
如果完整配置中还包含阻断特定域名、固定某个业务走代理、指定某个进程使用特定出站等规则,应把这些更具体的规则放在兜底之前。是否放在中国大陆直连规则之前,则取决于优先级。例如某个被归入 geosite:cn 的域名必须走代理,对它的单独代理规则就要排列在 geosite:cn 之前。
在 v2rayN 中落地时先确认四个位置
一、确认规则使用的出站标签
模板中的 direct 与 proxy 只是常见标签。实际运行配置可能由 v2rayN 根据当前服务器、路由模式和内核设置生成。修改自定义配置或高级路由前,先查看当前出站标签,确保规则引用的目标确实存在。引用不存在的标签会导致规则无法按设计转发,内核日志通常会给出对应错误。
二、确认 geosite 与 geoip 数据可被当前内核读取
geosite:cn 与 geoip:cn 依赖数据文件。内核程序本身负责执行规则,分类内容则来自配套数据。若日志提示类别无法加载、文件不存在或条目未知,应先处理内核与数据文件的配套状态,而不是反复改变规则顺序。
更新数据后应重新启动相关内核进程,使新进程重新读取资源。只关闭设置窗口并不一定代表运行中的内核已经重载。测试前可在 v2rayN 中停止并重新启动连接,再观察新生成的日志。
三、确认系统流量确实进入 v2rayN
路由规则只能处理已经进入内核的连接。使用系统代理时,应用需要遵循系统代理设置;使用 TUN 模式时,则要检查 TUN 是否启动、路由是否建立以及 DNS 是否按预期接管。如果某个应用完全绕过当前入口,修改 geosite 或 geoip 规则不会改变它的网络路径。
排查时不要先根据网页打开速度猜测分流结果。更可靠的方法是观察访问目标时是否产生连接日志、命中了哪个出站标签,以及目标在日志中以域名还是 IP 出现。没有任何对应记录时,应先检查流量入口,而不是继续增加路由条件。
四、确认订阅更新不会覆盖自定义路由
订阅负责提供服务器节点及相关连接参数,路由规则属于客户端本地策略。更新订阅后,节点列表会变化,但自定义路由是否保留取决于规则保存位置和当前配置方式。应把长期使用的规则保存在 v2rayN 提供的路由设置或明确管理的自定义配置中,不要只修改一次性生成的临时运行文件。
规则顺序错误时会出现哪些典型现象
兜底代理放在最前面
如果 network: tcp,udp 的代理规则位于列表开头,大多数常规连接会立即命中,后面的 geoip:private、geosite:cn 与 geoip:cn 没有机会执行。表现通常是国内站点和局域网目标都进入代理。修正动作不是新增排除项,而是把宽泛兜底移动到末尾。
单独例外放在 geosite:cn 后面
假设某个中国大陆分类中的业务域名因测试需求必须使用代理,而它的单独规则排在 geosite:cn 后面,那么连接会先被国内直连规则接管。应将具体域名规则放到类别规则之前。路由列表越靠前,越适合放置范围窄、意图明确的例外。
只写 geosite:cn,没有 geoip:cn
这种配置能处理大量带域名的访问,但无法覆盖直接连接中国大陆 IP 的场景,也无法利用解析结果补充未收录域名。日志中如果目标经常直接显示为 IP,增加独立的 geoip:cn 规则会比不断扩展域名列表更有效。
只写 geoip:cn,没有 geosite:cn
只依赖地址判断会让解析过程承担更多工作,并受内容分发节点和地址调度影响。某个中国大陆业务域名可能解析到不属于预期类别的地址,进而落入代理。域名策略明确时,优先使用 geosite:cn 表达意图,再用 geoip:cn 补充更合适。
把多个条件误当成任一命中
若一条规则同时写入 domain、ip、port 和 network,通常意味着连接需要同时满足这些字段。规则没有命中时,应逐个检查字段,而不是只验证其中一个域名是否在列表里。为了降低维护难度,可以把不同判断维度拆成多条意图单一的规则。
用日志验证,而不是用感觉判断
一套分流规则完成后,至少选择四类目标进行测试:局域网地址、中国大陆分类域名、中国大陆直连 IP,以及预期进入代理的普通外部域名。每次只测试一个目标,并记录目标形式、解析结果和最终出站标签。
- 访问路由器或局域网服务,确认连接使用
direct。 - 访问一个稳定的中国大陆域名,确认
geosite:cn对应的直连路径生效。 - 对一个明确的中国大陆 IP 发起连接,确认
geoip:cn能够独立命中。 - 访问不属于前述类别的目标,确认最终由
proxy兜底。
如果内核日志级别过低,看不到足够的路由信息,可以在排查期间提高日志详细程度,完成后再恢复日常设置。日志中重点关注目标地址、域名解析、规则错误和出站标签。测试期间还应避免浏览器缓存、已有长连接或后台请求混入判断;关闭目标页面后重新建立连接,结果更容易辨认。
从基础模板扩展时保持“具体在前,宽泛在后”
三段式模板适合作为起点,不适合无限堆叠未经验证的类别。扩展时可以先写清业务意图,再决定使用域名、IP、端口还是入站标签。某个固定域名必须代理,就添加具体域名代理规则;某个内部网段必须直连,就添加对应 IP 网段直连规则;某类 UDP 业务需要特殊出站,再单独添加网络与端口条件。
每增加一条规则,都应回答三个问题:它要覆盖什么目标,它必须排在哪条规则之前,它未命中时应落到哪里。无法回答时,说明规则范围或优先级还不清楚。比起大量规则,顺序明确、字段单一、日志可验证的短规则集更容易长期维护。
对于本文场景,最终原则可以压缩为一句话:先保护私有网络,再识别明确的中国大陆域名和地址,最后把剩余连接交给代理。geosite:cn 负责域名层面的策略,geoip:private 与 geoip:cn 负责地址层面的补充,IPIfNonMatch 则连接两种判断路径。只要出站标签准确、数据文件可读、流量确实进入内核,这套结构就能提供可解释、可排查的直连代理分离。