v2rayN 路由规则实战:geosite/geoip 写法与绕过大陆分流

从规则匹配顺序讲起,演示 direct、proxy、block 三类出站如何搭配 geosite 与 geoip,写出稳定的分流规则集。

本文速览

本文适合已经导入订阅、节点能够连接,但还不确定国内网站与局域网流量该如何直连的用户。以下以 v2rayN 管理的 Xray 内核为例,拆解规则顺序、域名与 IP 匹配、默认出站和验证方法;读完可以建立一套可回退的绕过大陆规则,并分清“规则没命中”与“请求根本没进入客户端”。

一、先区分流量入口、路由规则与出站

系统代理、TUN 与路由分流不是同一个开关。系统代理告诉遵循该设置的应用把请求交给本地代理;TUN 接管系统路由范围内的流量;内核的路由规则则决定收到请求之后交给哪个出站。请求没有进入内核时,修改 geosite 列表不会产生效果。

应用请求 本地入站 规则匹配 出站选择 目标服务

本文约定 proxy 是代理出站标签,direct 是直连标签,block 是阻断标签。标签只是配置内的名字,不是写上去就自动存在的协议。当前生成配置里必须有同名的 outbounds[].tag,否则可能出现配置加载失败或出站查找错误。

直连与代理

direct
通常对应 freedom 出站
proxy
对应当前选中的代理节点或代理出口
适用目标
局域网与大陆资源直连,其余按默认出口处理

VMess、VLESS 是节点连接协议,不是 geosite 分类名。

阻断与默认出口

block
通常对应 blackhole 出站
未命中
Xray 使用 outbounds 数组中的第一个出站
检查位置
实际运行配置中的 routing 与 outbounds

默认出口不是标签名字决定的,要检查出站顺序。

二、geosite 与 geoip 分别写在哪里

geosite:cn 写在规则的 domain 数组中,表示匹配域名数据库里的 cn 分类;geoip:cn 写在 ip 数组中,表示匹配 IP 数据库里的 cn 地址范围。两者都不是在线查询服务,也不能保证把每个国内业务自动分得准确。

表达式所在字段匹配含义
geosite:cndomain域名集合中的 cn 分类
geoip:cnipIP 地址集合中的 cn 分类
domain:example.comdomainexample.com 及其子域名
full:example.comdomain仅精确匹配 example.com
192.168.0.0/16ip指定 IPv4 网段

裸写 example.com 在 Xray 域名规则中属于关键词匹配,并不等同于“该域名及其子域名”。给某项业务添加例外时,优先明确写 domain: 或 full:,避免意外匹配到名称里包含同一字符串的其他域名。

三、规则从上往下匹配,特殊例外放前面

Xray 的路由规则按顺序检查,第一条满足条件的规则决定出站。规则不是先计算“哪个更精确”再自动择优。一个覆盖范围很大的规则放在前面,后面再细的规则也可能没有执行机会。

  1. 业务例外:确实需要强制代理或强制直连的精确域名,放在一般分类规则前。
  2. 可选阻断:已确认不会影响业务的广告域名分类,可以交给 block;遇到误拦截时先移除这一条验证。
  3. 局域网直连:匹配私有域名和私有地址,避免把路由器、打印服务等请求送往远端。
  4. 大陆直连:先用 geosite 匹配域名,再用 geoip 补充 IP 目标。
  5. 剩余流量:交给已确认的默认代理出站,或按所选策略安排兜底。

同一条规则里的多个不同字段通常是“同时满足”。例如同时填写 domain 与 ip,并不表示“域名属于大陆或者 IP 属于大陆”。要表达这种“或者”的分流目的,应拆成两条规则,分别匹配域名和 IP,再指向同一个 direct。

{
  "type": "field",
  "domain": ["full:example.com"],
  "outboundTag": "proxy"
}

这是一条语法演示用的精确域名例外,不代表该示例域名需要代理。实际使用时,将域名改成需要处理的业务域名,并把此规则放在可能覆盖它的通用规则之前。若该业务还有登录、静态资源与接口域名,也要按日志逐个确认,不能只处理浏览器地址栏里的一个主机名。

四、绕过大陆的 Xray 路由片段

下面仅展示 routing 对象,不是一份可以独立启动的完整客户端配置。它假定已经存在 proxy、direct、block 三个出站,并且 outbounds 的第一个出站是 proxy。这里不添加全匹配兜底规则,目的是保留 IPIfNonMatch 的解析补充机会。

5 条
示例路由规则
3 个
需要存在的出站标签
10808
后文验证使用的本地端口示例
{
  "routing": {
    "domainStrategy": "IPIfNonMatch",
    "rules": [
      {
        "type": "field",
        "domain": ["geosite:category-ads-all"],
        "outboundTag": "block"
      },
      {
        "type": "field",
        "domain": ["geosite:private"],
        "outboundTag": "direct"
      },
      {
        "type": "field",
        "ip": ["geoip:private"],
        "outboundTag": "direct"
      },
      {
        "type": "field",
        "domain": ["geosite:cn"],
        "outboundTag": "direct"
      },
      {
        "type": "field",
        "ip": ["geoip:cn"],
        "outboundTag": "direct"
      }
    ]
  }
}

IPIfNonMatch 的含义是:目标为域名且首轮规则没有匹配结果时,再尝试解析域名,用得到的 IP 继续匹配。直接以 IP 发起的连接,本来就可以参与 IP 规则匹配。域名已经命中 geosite 规则时,不会为了后面的 geoip 规则再额外执行这一轮解析。

这套策略并非“国内域名绝对直连”的承诺。域名分类可能缺项,解析结果也可能受 CDN 调度影响。对于稳定性要求高的业务,先添加明确的域名规则,再把 geoip 视为补充依据。广告分类是可选项,初次部署可以先去掉第一条,确认基础分流正常后再启用。

五、在 v2rayN 中保存、启用与验证

先确认当前节点使用的是 Xray。本文的 routing 字段不能直接当作其他内核的配置格式使用。v2rayN 不同桌面版本的窗口标题可能略有差异,以下按中文界面的「设置」→「路由设置」查找;规则窗口内要区分路由方案列表与方案内部的规则列表。

  1. 保留回退方案:在「设置」→「路由设置」记录当前启用的方案。支持复制时先复制再修改;不要直接覆盖唯一可用的规则集。
  2. 新建或编辑方案:按上面的顺序添加域名规则与 IP 规则,出站选择 direct、proxy 或 block。图形界面的单项输入格式以该窗口提示为准,不要把整个 routing 对象粘贴到“域名”输入框。
  3. 设置域名策略:在路由方案的域名解析策略中选择 IPIfNonMatch;保存后回到主界面,切换到刚编辑的路由方案。只保存但没有启用,运行行为不会改变。
  4. 确认入口:在「设置」→「参数设置」检查本地监听端口。下面使用 10808 作为示例,实际值以界面为准;系统代理测试时,在主界面系统代理菜单选择「自动配置系统代理」。
  5. 检查运行结果:应用设置并重启内核,查看日志是否出现资源加载、规则解析或出站标签错误。通过客户端提供的查看配置功能或运行配置文件,核对实际生成的 routing 和 outbounds。

不要直接修改由客户端自动生成的临时配置作为长期方案。切换节点、更新订阅或重启后,这类文件可能被重新生成。应在路由设置中保存规则;确实使用自定义配置时,再由自定义配置承担入口、DNS、出站与路由的完整管理。

curl --proxy socks5h://127.0.0.1:10808 --head https://example.com
curl --proxy socks5://127.0.0.1:10808 --head https://example.com

以上命令用于对照“域名交给代理处理”与“由本机先解析”的差别,不是速度基准。socks5h 会把目标域名交给代理端;socks5 通常先在本机解析,再把 IP 交给代理。先确认该端口确实接受 SOCKS 请求,且命令行环境有 curl。不要使用 -k 跳过证书验证来掩盖连接问题。

验证目标预期结果需要记录
已确认在 cn 分类中的域名direct目标域名、时间、出站标签
局域网地址,如 192.168.1.1direct目标地址是否实际存在、服务端口
不属于直连与阻断规则的目标默认 proxy首个出站与日志中的实际出口
已确认在广告分类中的域名block分类是否存在、是否影响业务

日志显示细节取决于内核与日志级别,不一定直接打印“第几条规则”。可以结合连接记录中的目标与出站标签判断,必要时短时间提高日志级别,复现一次后恢复。测试数据只记录目标类型与出站,不公开订阅地址、节点凭据或完整私人访问记录。

六、DNS、流量探测与 TUN 的分流边界

domainStrategy 解决的是路由判断时是否解析目标域名,不等于已经配置好全部 DNS。客户端 DNS 设置、系统 DNS、浏览器安全 DNS,以及应用是否直接发送 IP,都会改变内核实际收到的目标信息。不能只看到 geosite 已添加,就认定每条连接都有域名可匹配。

修改分流时一次只动一个环节:先用显式代理命令确认路由,再测试系统代理,最后按需要测试 TUN。这样能避免同时改 DNS、规则与接管方式后,无法判断究竟是哪一项修复了问题。更多接管步骤可参照入门指南的 TUN 设置。

七、路由不生效时的四个常见问题

已经选了绕过大陆,为什么国内网站还走代理?

先检查当前启用的路由方案,而不是仅查看保存的方案。再检查该域名是否在 geosite:cn 中,以及前面是否存在强制代理规则。需要临时纠正时,把该业务的 domain: 规则放到通用规则之前,并从连接记录确认出站变为 direct。

geoip:cn 已经写了,为什么还是没有命中?

确认它写在 ip 数组而不是 domain 数组。若目标以域名进入,检查 domainStrategy;采用 IPIfNonMatch 时,还要删除会提前匹配所有请求的兜底规则,或重新评估解析策略。最后核实实际解析出的 IP 是否属于当前数据库的 cn 范围。

添加广告阻断后,登录或支付页面打不开怎么办?

先停用 category-ads-all 那条规则并重试,确认是否为误拦截。若确实需要保留阻断,再依据失败请求的真实域名添加更靠前的 direct 或 proxy 例外。不要直接把整个业务涉及的所有地址都加入宽泛的关键词白名单。

更新订阅后,之前设置的规则会被改掉吗?

普通服务器订阅更新主要改变节点资料,不等于更新本地路由规则和地理资源。先检查当前路由方案及所选内核是否发生切换;若使用自定义配置或额外的配置导入流程,则要单独确认覆盖范围。不要反复刷新订阅来修复规则分类缺失。

判断一套分流规则是否稳定,重点不是规则数量,而是能否解释每个测试请求的出口。保留一份可用方案,记录修改项和验证目标;出现异常时先回退最近一项,再检查入口、目标信息、匹配顺序与出站。基础操作可继续查看路由设置教程,连接错误则转到问题诊断逐项定位。

下载v2rayN