· 路由分流 · 约 10 分钟

V2Ray 路由规则配置实战:geosite/geoip 实现国内直连与海外代理分流

从 domainStrategy 讲到 geosite:cn、geoip:private 规则的书写顺序,演示在 v2rayN 中搭建国内直连、海外走代理、广告拦截的分流方案。

本文速览

本文适合已能通过节点访问网络、准备在 v2rayN 中调整分流的用户。先区分域名集合与 IP 集合,再确定路由解析策略、出口标签和规则顺序,最后通过日志验证国内直连、私网访问与广告拦截。文中的 JSON 是内核配置片段,不是可以直接导入的完整节点配置。

一、分流前先确认流量与出口

路由分流发生在流量进入内核之后。应用没有使用系统代理,或者只接入了未被当前代理模式覆盖的连接时,修改规则不会影响它。先选择一个可用节点,确认浏览器使用 v2rayN 提供的本地代理,再开始调整路由。系统代理主要服务于遵循系统代理设置的应用,不等于接管整台设备的所有连接。

规则中的 outboundTag 是出口标识,不是协议名称。本文约定 proxy 指向已配置好的节点,direct 指向 freedom 直连出口,block 指向 blackhole 拦截出口。标签区分大小写,必须与实际配置保持一致。

10808
本地代理端口示例,按实际设置替换
3 个
出口标签:proxy / direct / block
4 条
基础分流规则,未匹配流量交给默认出口

二、geosite 与 geoip 的匹配对象

geosite:cn 表示域名集合,适合识别已归类的国内站点;geoip:cn 表示 IP 地址段集合,适合处理直接访问 IP 或需要按解析结果补充分流的连接。二者都是规则数据,不代表对网站业务、实际机房位置或访问质量的实时判断。国内域名可能使用海外基础设施,海外服务也可能解析到国内地址。

域名集合规则

字段
domain
国内集合
geosite:cn
广告集合
geosite:category-ads-all
数据文件
geosite.dat

需要目标域名可供路由判断,并且数据文件包含指定分类。

IP 集合规则

字段
ip
国内集合
geoip:cn
私网集合
geoip:private
数据文件
geoip.dat

目标为 IP 时可直接匹配;目标为域名时,是否解析取决于路由策略。

同一条规则同时写入 domain 和 ip,不是表达“域名或 IP 命中即可”。不同条件字段通常需要同时满足;同一个数组中的多个条目才是候选匹配项。为了避免误解,应把国内域名和国内 IP 拆成两条规则。

三、domainStrategy 如何影响国内 IP 补充规则

domainStrategy 写在 routing 对象内,与 rules 并列。它控制路由判断时是否把域名解析为 IP,不负责决定应用是否走代理,也不等同于完整的 DNS 配置。名称相似的出站解析设置属于不同作用域,不能相互替代。

AsIs

按收到的目标形式进行路由,不为了 IP 规则主动解析域名。目标原本就是 IP 时,仍可参与 IP 规则匹配。

适合:主要依赖域名列表,希望减少路由阶段解析的方案。

IPIfNonMatch

推荐

域名在首轮规则判断中未匹配时,再尝试解析并参与 IP 规则判断。本文用它保留域名规则优先、国内 IP 补充的逻辑。

适合:国内域名直连,同时补充国内 IP 识别的日常分流。

IPOnDemand

路由判断遇到需要 IP 的规则时就尝试解析域名。IP 规则放置位置会更直接地影响解析时机与最终去向。

适合:明确需要较早参与 IP 判断,并已设计好 DNS 与规则顺序的配置。

四、按广告、国内域名、私网、国内 IP 排序

规则自上而下判断,首先命中的规则决定出口。将广告分类放在国内域名前面,是为了避免某些已归入国内集合的广告域名先被放行;随后处理国内域名、私网 IP 和国内 IP,其余连接回落到代理出口。下面只展示 routing 片段,必须合并到已有的完整配置中。

{
  "routing": {
    "domainStrategy": "IPIfNonMatch",
    "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"
      }
    ]
  }
}

上述规则要求已经存在对应出口。保留原有节点的认证、传输和安全设置,并将其出口标签设为 proxy;不要为了套用示例重新编写节点参数。下列两个对象仅用于展示直连与拦截出口的定义,应放进现有的 outbounds 数组,并位于代理出口之后。

[
  {
    "tag": "direct",
    "protocol": "freedom",
    "settings": {}
  },
  {
    "tag": "block",
    "protocol": "blackhole",
    "settings": {}
  }
]

五、在 v2rayN 中落地并检查生成配置

v2rayN 的路由编辑界面负责生成内核配置,订阅则主要提供节点信息,两者不要混为一谈。桌面不同发行版本的标签可能略有变化,下面按具有「设置」→「路由设置」入口的界面说明;若界面不同,应以最终生成的 routing 和 outbounds 为核对依据。

  1. 备份现有规则

    进入「设置」→「路由设置」,先保存现有规则内容或导出当前配置,记录正在使用的路由方案,避免直接覆盖已有的工作例外。

  2. 建立独立方案

    在「路由设置」中新建或复制一个路由方案。将域名策略设置为 IPIfNonMatch,逐条添加广告、国内域名、私网和国内 IP 规则,不要把完整内核 JSON 粘到单条规则的域名输入框。

  3. 检查出口对应

    逐条确认规则使用的代理、直连和阻断出口。界面可能显示中文选项,但生成配置的 outboundTag 必须能找到实际出口定义;同时检查默认出口是否为所选节点。

  4. 启用并重载

    保存后将新方案设为活动路由,再重启服务或重新启动内核。仅保存方案而未启用时,原来的分流仍可能继续生效。

  5. 核对代理入口

    在「设置」→「参数设置」中核对本地监听端口。本文使用 127.0.0.1:10808 作为测试入口示例,实际端口与入站协议必须以当前配置为准,再通过托盘菜单确认系统代理状态。

六、用日志区分规则问题与 DNS 问题

测试时一次只改变一个条件。先访问一个已确认归入国内集合的域名,再访问一个不在国内集合中的域名,最后测试需要访问的私网地址。临时启用访问日志;必要时提高错误日志的详细程度,观察目标地址与最终出口标签,验证结束后恢复常用日志级别。

验证方案:先判断命中,再排查解析

域名规则验证
  • 国内集合域名应显示 direct 出口。
  • 广告集合中的测试域名应显示 block。
  • 若日志只有 IP,检查应用是否已自行解析域名。
  • 关闭旧连接并重新发起请求,避免复用连接干扰判断。
IP 与默认出口验证
  • 确认私网目标由 direct 处理。
  • 查看未命中域名集合时的解析结果。
  • 国内 IP 补充命中应进入 direct。
  • 其余连接应使用首个代理出口,而非意外直连。

日志显示的出口比网页能否打开更能说明规则是否生效;连通性还取决于 DNS、节点和目标服务。

当应用提前把域名解析为 IP,再把 IP 交给本地代理时,geosite 无法直接获得原始域名。入站嗅探可在部分 HTTP 或 TLS 流量中恢复可识别的域名信息,但不能保证覆盖所有协议和加密形式。开启前应了解当前内核的嗅探配置,不要把它当作 DNS 设置的替代品。

DNS 配置也需要单独设计:用于路由判断的解析请求不一定自动通过代理发送。若解析结果异常,先核对内核使用的 DNS 服务器及其连接路径,再判断是否保留国内 IP 补充规则。分享排错日志时,应先移除订阅地址、认证信息和个人访问记录。

客户端下载v2rayN / v2rayNG