本文速览

网页走错出口,不一定是节点失效。本文适合已经能连接、但想调整国内直连和局域网访问的用户:先区分域名库与 IP 库,再更新客户端实际使用的资源,最后用一组可读的 JSON 规则核对命中顺序。重点是让规则、资源文件与运行中的内核对应起来,而不是反复更新订阅。

两个 dat 文件分别匹配什么

geosite.dat 保存按标签组织的域名集合,geoip.dat 保存按标签组织的 IP 地址段集合。它们是路由查询用的数据文件,不是节点订阅,也不负责提供服务器地址、账号或传输参数。更新数据库不会自动增加节点,也不会替你新建一条分流规则。

项目geosite.datgeoip.dat
匹配对象请求中的域名目标 IP 地址
常用表达式geosite:cngeoip:cn、geoip:private
规则字段domainip
容易误解的点cn 是集合标签,不是只匹配 .cn 后缀IP 归属不等于网站所属地区

geosite:cn 的具体内容由资源维护方决定。某个域名是否收录、是否包含某些子域名,要看该集合的数据,不能仅靠域名后缀猜测。同样叫 geosite.dat 的两个文件,也可能来自不同数据源,包含不同的标签。

geoip:private 常用于让局域网等非公网目标直接连接。常见私有 IPv4 地址段如下;这只是常用范围举例,不是对该标签全部内容的展开。

10.0.0.0/8
私有 IPv4 地址段
172.16.0.0/12
涵盖 172.16 至 172.31
192.168.0.0/16
家用局域网常见范围

结论:先确认请求带的是域名还是 IP

访问路由器的 192.168.1.1 时先检查 IP 规则;某个网站走错出口时先检查域名规则。不要用更新域名库的方式修复一个写错的局域网 IP 规则。

v2rayN:更新 Geo 资源并确认生效

桌面端先确认当前配置使用的内核和资源格式。以下针对使用 Xray 或 V2Fly 内核、读取 dat 资源的配置。若当前配置使用的是其他资源格式,更新 dat 文件不会改变那套规则。菜单名称会随客户端版本调整,先以当前界面为准,不要在安装目录里批量替换同名文件。

  1. 保留当前规则

    进入主界面「设置」→「路由设置」,记录当前启用的路由方案及规则顺序。使用自定义配置时,另外保留原 JSON 文件,避免后面无法对照。

  2. 执行资源更新

    在带有该入口的版本中,打开「检查更新」→「更新 Geo files」。等待更新任务结束,不要把「更新订阅」当作这一步的替代操作。

  3. 核对更新日志

    查看主界面日志中的下载结果,分别确认 geoip 和 geosite 的处理状态。只有一个文件成功时,应先处理另一个失败项,而不是直接宣布分流已经恢复。

  4. 重启当前服务

    更新完成后重启核心服务,或退出客户端后重新启动。重新发起网页连接,再看新的路由日志;原有长连接不适合作为规则更新的验证对象。

下载失败通常要分成两类:请求资源时超时,说明更新通路需要排查;下载完成后启动报错,则要检查文件格式与集合标签。若客户端提供通过代理更新资源的选项,可在已有可用连接时尝试。切换了数据源以后,尤其要留意自定义规则引用的标签是否仍然存在。

v2rayNG:从资源文件入口更新

安卓上的 v2rayNG 使用 Xray 内核。支持资源管理的版本可从左上角菜单进入「资源文件」,查看资源条目,并通过页面提供的更新操作获取新文件。不同版本可能使用文字按钮或更新图标;操作前先读清当前条目的文件名,避免只更新了 geoip 而漏掉 geosite。

  1. 确认现用路由

    从左上角菜单进入「路由设置」,记录当前选择的模式与自定义规则。若使用完整自定义 JSON,还要检查其中是否引用了额外的数据文件。

  2. 打开资源文件

    返回菜单,进入「资源文件」,检查 geoip.dat、geosite.dat 对应的资源条目。旧版没有该入口时,不要把文件随意复制进系统下载目录后就认为已经导入。

  3. 更新并看结果

    执行页面上的更新操作,等待每个资源返回结果。失败时记录提示文字;网络超时、资源地址不可用和文件无法加载,需要分别处理。

  4. 重新连接测试

    停止连接后重新启动,再进入「日志」观察启动与访问记录。用一次新的浏览器访问验证,而不是只看主界面连接按钮是否处于开启状态。

Android 的应用私有目录与普通下载目录不是一回事。手动下载文件后,必须通过客户端支持的导入或资源管理流程交给内核读取。另一个容易漏掉的前提是分应用代理:如果浏览器被排除在 VPN 接管范围之外,修改内核路由不会改变这个浏览器的出口。

路由 JSON:字段、出口标签与匹配顺序

下面是供 Xray/V2Fly 风格配置参考的 routing 片段,不是可以独立启动的完整配置。它假定已有名为 direct 和 proxy 的出站:前者指向直连出站,后者指向已有节点。标签只是引用名称,写成 direct 并不会自动创建直连功能。

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

规则按顺序检查,首先命中的规则决定出口。最后一条覆盖普通 TCP、UDP 流量,所以必须放在这些具体规则后面。若提前放到第一条,后面的国内直连规则就没有机会处理这些连接。

字段或写法含义检查重点
domain对域名进行匹配geosite:cn 应放在这里
ip对目标 IP 进行匹配geoip:private 应放在这里
outboundTag引用已有出站的 tag拼写、大小写必须对应
AsIs不为路由匹配额外解析域名域名未命中时,不会主动查 IP 集合

这里选择 AsIs,是为了把行为讲清楚:如果传给路由的是域名,而域名不在 geosite:cn 中,内核不会仅为命中 geoip:cn 再解析一次地址,最终会落到代理规则。请求已经带着 IP 时,才可直接检查这里的 IP 条件。

同一条规则中,domain、ip、port 等不同条件通常需要同时满足;同一字段数组中的多项则表示该字段的多个候选。想表达“域名属于国内,或者 IP 属于国内”,应像示例一样分成两条,而不是把两个字段塞进同一个对象。

自动更新还是手动替换:按维护方式选择

日常使用更需要稳定的数据源和明确的更新结果,而不是每次都换一套标签。只有当内置资源确实缺少所需集合、或者需要定位某次更新带来的变化时,手动管理才更有意义。

客户端内置更新

推荐

从客户端的 Geo 更新或资源文件入口执行,资源位置由客户端管理。更新后仍要重启服务,并核对日志是否成功加载。

适合:使用常见集合、希望减少路径错误的日常配置

手动替换资源

先确认内核实际资源目录,再保留旧文件并替换。还要确认新文件包含规则引用的标签,不能只看文件名是否相同。

适合:自定义数据源、需要固定资源或回退对照的配置

结论:一次只改变一层

先只更新资源并重启,验证后再调整规则。若同时换节点、改 DNS、换数据库和重排路由,即使问题消失,也很难知道是哪一步起了作用。

更新后仍然走错出口:按日志逐项排查

验证时选三类目标即可:一个确实可访问的局域网服务、一个需要直连的网站、一个预期走代理的网站。记录测试目标、预期出口和实际日志。不必追求一张复杂测速表,先确认每类连接是否进入了正确出站。

更新完成,为什么还提示找不到 cn 集合?

先确认更新的是内核实际读取的文件,再看数据源是否提供 cn 标签。停止核心、恢复此前可用的资源后重新启动;若恢复后正常,再检查新数据源的集合说明,不要只重复点击更新。

国内网站还是走代理,应该把 geoip:cn 放最前面吗?

先查看请求是域名还是 IP。使用 AsIs 时,把 IP 规则提前并不会让一个未解析的域名自动变成 IP。先检查 geosite:cn 和更早的规则,再决定是否调整域名解析策略。

有 private 规则,怎么还打不开家里的设备?

先用设备的实际局域网 IP 测试。若只用主机名失败,要单独核对局域网名称解析;若 IP 也失败,检查客户端是否绕过局域网、VPN 是否接管该流量,以及目标服务是否监听在可访问的地址上。

把 domain 和 ip 写在一条里,为什么更难命中?

不同字段不是简单的“或”关系。把国内域名与国内 IP 拆成两个规则对象,按预期顺序排列,再重启核心。客户端路由编辑器若会自动生成配置,也要核对最终生成的规则,而不是只看输入框。

最后保留一份可工作的配置和资源来源记录。下一次出现分流异常时,先比较规则顺序与资源变化,再检查连接路径。这样能分清是集合内容改变、配置引用错误,还是流量根本没有进入内核。