国内站点走错出口、更新后提示规则类别不存在,先分清数据库、路由规则和订阅的职责。本文按识别文件、更新资源、检查规则、验证结果的顺序,说明 v2rayN 搭配 Xray 或 V2Fly 内核时如何处理 Geo 数据,并提供可读的路由配置片段与故障排查方法。
GeoIP 与 GeoSite:一个匹配 IP,一个匹配域名
geoip.dat 保存按国家、地区或特殊用途分类的 IP 网段;geosite.dat 保存按地区、服务或用途整理的域名规则。它们是供内核读取的二进制数据文件,不是节点列表,也不是可以用文本编辑器直接修改的 JSON 配置。
| 项目 | geoip.dat | geosite.dat |
|---|---|---|
| 匹配对象 | 目标 IP 地址 | 目标域名 |
| 常见引用 | geoip:cn、geoip:private | geosite:cn |
| 写入字段 | 路由规则的 ip | 路由规则的 domain |
| 典型用途 | 按 IP 归属分流、处理私有地址 | 按域名类别分流 |
geosite:cn 表示读取当前域名数据库中的 cn 类别,并不等于“所有以 .cn 结尾的域名”。同样,geoip:cn 是数据库记录的 IP 网段集合,不能据此判断页面使用哪种语言或服务商的身份。一个中文网站可能使用境外 CDN,一个国际服务也可能解析到境内地址。
v2rayN 是管理订阅、生成配置与启动内核的桌面客户端;实际读取这些规则的是内核。本文的 DAT 写法适用于使用对应 Geo 数据机制的 Xray、V2Fly 配置。安卓端的 v2rayNG 使用 Xray,v2flyNG 使用 V2Fly,但两者的菜单与文件存储方式不能直接套用桌面步骤。
更新前先分清:订阅、路由规则、Geo 数据
更新订阅主要改变服务器地址、端口、协议参数和节点列表。更新 Geo 文件改变分类数据;修改路由规则则决定哪些类别走哪个出口。三者不是同一个操作。更新了一次订阅,并不意味着 geosite.dat 已经刷新;替换数据库,也不会自动新增一条直连规则。
客户端内更新
推荐优先使用 v2rayN 的 Geo 文件更新入口,让客户端按已有资源地址保存数据。更新后重新加载配置,结合日志确认实际使用的文件。
适合:日常维护、沿用客户端资源配置
手动替换文件
先定位运行中内核的资源目录,再备份并替换对应文件。需要自行确认来源、类别集合与文件权限,不能只凭文件名判断兼容性。
适合:离线维护、内置更新失败后的定点修复
只更新订阅
用于刷新服务端连接信息。节点可用性有变化时应执行,但不应把它当作修复 Geo 类别缺失或本地路由顺序的办法。
适合:节点地址变化、订阅套餐内容调整
结论:先记来源,再做更新
更新前记录当前内核、Geo 资源地址与自定义类别名称;如果规则依赖额外分类,更新后先确认该分类仍存在,再恢复日常使用。
不同数据维护项目即使都输出 geosite.dat,包含的类别也可能不同。某份数据库能识别 cn,不代表它也提供路由模板引用的其他类别。更换来源时,应把“类别是否存在”与“文件能否下载”分开检查。
v2rayN 更新 Geo 文件:按这五步操作
以下按提供「检查更新」菜单的桌面版 v2rayN 说明。不同版本的入口布局可能调整;若界面没有「更新 Geo 文件」,应先核对当前版本的资源更新入口,不要把「更新订阅」当作替代按钮。操作前保留当前可用配置,避免同时修改节点、DNS 和路由。
-
记录当前配置
查看当前节点、所用内核与已启用的路由配置,记录自定义规则。若需要检查本地监听端口,进入「设置」→「参数设置」,查看本地监听相关选项;不要假定所有安装都使用 10808。
-
执行资源更新
主界面打开「检查更新」→「更新 Geo 文件」。观察客户端消息,确认下载任务结束;如果当前版本分别列出资源任务,应检查 GeoIP 与 GeoSite 的结果。
-
处理下载失败
遇到超时,先确认系统时间、资源地址和当前节点可用性。更新器是否走代理取决于客户端实现与设置;开启系统代理并不能保证所有更新请求都会经过代理。
-
重新加载配置
更新成功后重启内核;不确定界面入口时,可退出并重新打开客户端。文件已经落盘,不代表运行中的内核已经重新读取;随后检查启动日志是否出现资源加载错误。
-
验证路由结果
保留原有路由设置,分别测试一个预期直连的域名、一个预期代理的域名与一个局域网地址。对照连接日志中的出口标签,而不只看网页能否打开。
手动替换后还要检查读取权限与文件内容是否正确。下载任务若保存了错误响应页面,即使文件名仍叫 geoip.dat,内核也无法把它当作数据库解析。发生解析错误时优先恢复备份,再重新获取资源。
规则怎么写:geosite:cn 与 geoip:private 的位置
下面是用于讲解的 routing 配置片段,不是可以独立启动的完整配置。它假定 outbounds 已存在标签为 direct 的直连出口,并且默认出口是代理。若未匹配任何规则,Xray、V2Fly 通常使用第一个出站;因此必须一起检查出站顺序。
{
"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"
}
]
}
}
- 第一条:
geoip:private匹配数据库中的私有地址集合。它不是“所有内网域名”的简称,也不能保证不同来源对特殊用途地址的收录完全相同。 - 第二条:
geosite:cn匹配域名集合。请求必须携带域名,或者由适当配置的嗅探机制提供可用域名,才能进行这类匹配。 - 第三条:
geoip:cn按目标 IP 判断。请求本身带 IP 时可以直接判断;域名请求是否先解析,要看domainStrategy。 - 出口标签:
direct只是标签名,必须与实际出站配置一致。把标签写成一个不存在的名称,数据库再新也无法修好配置。
IPIfNonMatch 表示域名未匹配已有规则时,再尝试解析 IP 进行匹配。若在规则尾部加了一条能直接匹配所有 TCP、UDP 请求的兜底规则,域名阶段可能已经命中,便不会进入预期的 IP 补充匹配。不要一边使用这种策略,一边假定所有请求都会检查 GeoIP。
更新后仍然分流不对:按四层验证
“网站能打开”只能说明某条连接建立成功,不能证明流量走了预期出口。验证 Geo 数据时,应该固定节点、固定路由和测试目标,每次只改变一个条件。下面四层按顺序检查,通常比连续切换数据库更容易找到原因。
- 文件层:检查更新时间、实际资源路径和启动日志。出现文件不存在、读取失败或数据解析错误时,先修复资源加载,不急着修改路由。
- 规则层:检查引用类别是否存在、当前启用的路由配置是否正确,以及更靠前的规则是否已经截走流量。规则从上到下匹配,首个匹配结果生效。
- 域名层:确认内核收到的是域名还是 IP。浏览器自行解析、应用直连 IP 或 TUN 接管方式不同,都可能改变可用于匹配的信息。
- 出口层:查看连接日志中的出站标签;若当前日志级别不记录匹配信息,可临时调整日志设置。出口正确但速度慢,应转向节点与线路排查。
如果本地 SOCKS 入站确实监听 127.0.0.1:10808,可用下面的命令做一次固定入口测试。socks5h 让 curl 把域名交给代理端处理,便于保留域名匹配条件;命令只验证请求路径,不会单独证明某个 GeoSite 类别命中。
curl --proxy socks5h://127.0.0.1:10808 --head https://example.com/
这里的端口是示例值,必须与客户端实际监听一致。连接被拒绝通常先查监听端口和内核是否运行;请求成功则结合对应时间的日志检查出口。测试局域网目标时,也要区分“规则选择了直连”和“目标服务本身允许访问”,两者不是一回事。
常见问题:类别不存在、更新无效与维护频率
提示 geosite 类别不存在,重试下载有用吗?
先记录错误中的类别名,再核对当前资源来源。如果来源根本不提供这个类别,反复下载同一文件不会改变结果。恢复原来的数据来源,或按新来源提供的类别修改规则;修改前备份路由配置。
显示更新成功,国内网站怎么还走代理?
先重启内核,再检查启用的路由配置是否包含 geosite:cn 或 geoip:cn。随后查更靠前的规则、域名是否可见以及目标是否属于当前数据库;单次下载成功并不保证这四项都正确。
数据库需要每天手动更新吗?
没有统一的每日更新要求。日常可定期检查;遇到网站地址迁移、类别调整或明确的误分流时再针对性更新。每次更换来源都保留旧文件,避免把数据变化和其他设置修改混在一次操作里。
安卓端能照搬桌面资源目录吗?
不能直接照搬。v2rayNG 与 v2flyNG 的应用数据目录和资源更新入口由各自版本决定。优先使用应用提供的资源更新功能;导入自定义配置时,先确认所用内核、类别名称与资源文件兼容。
最后保留一条简单的维护记录:何时更新、使用哪个来源、是否更换路由模板、重启后是否正常。Geo 数据负责提供分类,规则负责选择出口,DNS 与入站方式负责提供匹配信息。把这几层分开,才能判断下一步该更新文件、调整规则,还是检查应用是否真的经过客户端。