V2Ray 路由规则实战:geosite/geoip 国内外分流配置

从 domainStrategy 讲到 geosite、geoip 规则的书写顺序,给出国内直连、国外走代理、广告拦截三类常见场景的可用路由配置示例。

本文速览

本文适合已经能连接节点、准备调整分流规则的用户。先区分域名集合与 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,这条兜底规则会在第一次匹配时命中,未分类域名就不会触发“无匹配后解析”。另一种写法是移除全匹配兜底,并让配置中第一个出站为代理;这时必须确认客户端生成的出站顺序,不能只修改策略名称。

3. 配置前检查:出站标签、端口与数据文件

以下配置约定三个出站标签:proxy 为已经可用的代理节点,direct 为 Freedom 直连,block 为 Blackhole 阻断。它们是区分大小写的字符串引用,不是界面显示名称。节点使用 VMess 还是 VLESS,不改变路由引用标签的方式;节点的传输与安全参数仍由原有出站负责。

3 个
示例所需出站标签
5 条
组合示例的有序规则
10808
下文验证使用的本地 SOCKS 示例端口

端口 10808 只是本文测试命令的约定,不代表所有安装环境的默认值。执行命令前,应在客户端的本地监听设置中确认真实端口;若本机监听不同,就替换命令中的数字。监听地址保持 127.0.0.1,不需要为了路由测试开放给局域网其他设备。

  1. 保存备份

    备份现有配置与自定义路由。先用当前节点访问一个已知可用的网站,确认基础连接正常,再开始调整分流。

  2. 核对路由入口

    v2rayN 常见入口为「设置」→「路由设置」。先记录当前启用的规则集;不同界面版本若菜单位置不同,以实际出现的「路由设置」页面为准,不要把原生配置直接粘贴进订阅地址框。

  3. 核对出站

    查看导出的运行配置,确认代理出站的实际 tag。若不是 proxy,就替换下文全部对应引用;保留既有节点的服务器、认证和传输设置。

  4. 核对资源

    确认内核能够读取 geosite.dat、geoip.dat,并包含 cn、private、category-ads-all 等本文使用的分类。缺少分类时先修复资源,或移除对应规则再测试。

  5. 应用并重启

    保存规则后重新启动代理服务,再看启动日志。先处理 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. 验证分流:看出站日志,不只看网页

测试时先保持代理模式和节点不变,每次只修改一个规则。短时启用可记录连接去向的日志级别,观察同一请求的目标及出站标签;完成后恢复日常日志级别。日志可能包含访问目标,分享截图前应清理订阅地址、节点凭据和个人访问记录。

  1. 国内域名:选择确认被当前 geosite:cn 收录的站点,检查连接是否交给 direct,而不是只观察页面加载速度。
  2. 代理兜底:选择确认不命中前置规则的目标,检查出站是否为 proxy;出口 IP 检测只能辅助验证这一条请求。
  3. 广告命中:从本机分类数据或访问日志中找到确认属于广告集合的域名,检查是否交给 block,不必主动打开不熟悉的站点。
  4. 私有地址:访问自己管理的局域网服务,检查是否走 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。这样能把“规则没匹配”和“匹配正确但节点连接失败”分开处理,减少反复改配置造成的干扰。

下载客户端