节点能够连接,只能说明代理出站基本可用;国内站点绕远、局域网地址进入代理、某个域名始终不走指定线路,则通常要继续检查路由层。GeoIP 与 GeoSite 正是路由层常用的两组匹配数据。它们不会替代 VMess、VLESS 等协议配置,也不负责更新订阅,而是给 Xray、V2Fly 内核提供可查询的 IP 与域名集合。
本文速览
适合已经导入订阅、节点连接正常,但在 v2rayN 或 v2rayNG 中遇到规则未命中、国内流量误走代理、启动时报数据文件错误的用户;操作重点是确认文件位置与更新时间、更新两份数据库、核对规则前缀和顺序,再通过日志与实际连接逐项验证。
GeoIP 与 GeoSite 分别处理什么
geoip.dat 保存按国家、地区或用途整理的 IP 网段集合。规则中的 geoip:cn 会把目标 IP 与对应集合比对,geoip:private 通常用于匹配局域网、回环地址和其他私有地址。它适合处理已经得到目标 IP 的连接,也适合作为域名规则之后的补充判断。geosite.dat 保存域名集合。规则中的 geosite:cn、geosite:category-ads-all 等标签不是普通域名,而是从数据文件中读取一组域名条目。内核会按照完整域名、子域名或正则条目进行匹配,因此它能够在连接真正发往目标服务器前完成域名分流。2 个文件
geoip.dat 与 geosite.dat
10808
v2rayN 常见本地 SOCKS 端口
10.6 MB
一次测试中的 GeoSite 文件大小
1.3 MB
同批次 GeoIP 文件大小
应用发起连接
取得目标信息
读取规则集合
按顺序匹配
选择出站线路
两类数据的作用不能互换。域名请求可能先由 GeoSite 命中;如果应用直接连接 IP,GeoSite 就没有域名可比对,只能依靠 GeoIP、端口或其他条件。启用 TUN 后还要结合嗅探和 DNS 设置判断:嗅探恢复出域名时,域名规则可能重新参与匹配;没有恢复域名时,连接仍会落到 IP 规则或最终规则。
在 v2rayN 中更新 Geo 文件
下面以 v2rayN 7.15.0 的中文界面为例。不同小版本可能把更新入口放进主菜单或托盘菜单,但菜单项通常仍包含“检查更新”和“Geo files”。更新前先让当前连接保持稳定;如果数据源只能经代理访问,需要先确认系统代理或 TUN 已经正常工作。
-
确认内核类型
打开「设置」→「参数设置」→「Core 类型」,确认当前配置实际使用 Xray 内核还是 V2Fly 内核。订阅名称里出现 VLESS 或 VMess,不等于已经确认了运行内核。 -
打开更新入口
回到主窗口,选择「检查更新」→「Geo files」。若当前版本显示为「更新 Geo 文件」,选择该项即可,不要误点“更新订阅”。 -
等待写入完成
观察消息区域,确认 geoip.dat 与 geosite.dat 都完成下载并写入。一次测试中两个文件合计约 11.9 MB,网络稳定时通常在 5 至 30 秒内结束。 -
重启运行内核
使用「重启服务」或先停止再启动当前配置。仅关闭设置窗口不会让已运行的内核重新加载数据文件。 -
核对启动日志
打开「日志」窗口,确认没有出现 load geosite、load geoip 或 failed to start 等信息,再测试目标域名的出站结果。
便携版 v2rayN 需要特别检查写入权限。如果程序位于受系统保护的目录,界面可能显示下载完成,但旧文件并未被替换。可退出客户端后查看程序目录中两个文件的修改时间;修改时间应接近刚才的更新时刻,而不是安装包解压时刻。
更新完成后不建议立刻同时修改 DNS、路由和节点配置。先保留原规则,仅重启内核并复测,可以判断变化是否确实来自数据文件。若同时改动三处设置,出现误分流时很难确定是哪一项导致。
结论:先确认文件被重新加载
“下载成功”只代表文件传输结束;修改时间已变化、内核完成重启、启动日志没有加载错误,三项同时满足后,才能把新数据视为已经生效。
在 v2rayNG 中更新 Geo 文件
下面以 v2rayNG 1.10.31 的中文界面为例。安卓端的菜单布局会随屏幕宽度略有变化,相关入口可能位于右上角菜单中。操作期间先保持一个可用配置处于选中状态,以便更新地址需要代理时能够正常访问。
-
检查文件地址
进入右上角菜单的「设置」→「Geo files 设置」,检查 GeoIP 与 GeoSite 下载地址是否分别指向对应的 dat 文件,避免两个输入框填入同一个文件地址。 -
执行数据更新
返回主界面,打开右上角菜单并选择「更新 Geo files」。等待页面提示两份文件处理完成,中途不要强制结束客户端进程。 -
重启连接服务
断开当前连接,等待约 2 秒后重新连接。这样可以让 Xray 内核重新初始化路由模块并读取新文件。 -
打开运行日志
从主界面进入「日志」,搜索geoip、geosite、routing等关键词,确认启动阶段没有文件读取错误。 -
复测目标连接
先测试一个明确应直连的国内域名,再测试一个应走代理的域名。分别记录出口地址和连接耗时,避免只凭页面能否打开判断规则是否命中。
若当前版本没有独立的 Geo 更新菜单,应先确认客户端版本及所用内核,不要把“更新订阅”当成数据库更新。订阅更新处理的是服务器配置列表,Geo 更新处理的是路由集合,两者存储位置和加载时机都不同。v2flyNG 同样使用 Geo 数据概念,但应使用与其 V2Fly 内核和规则标签相匹配的数据文件。
规则写法与匹配顺序检查
数据库是新的,规则仍可能因为写法错误而完全不生效。最常见的问题是漏掉前缀、把域名标签填进 IP 条件、使用数据文件里不存在的标签,或者让一条范围更大的规则排在前面。路由通常按顺序判断,连接命中第一条可用规则后,后面的规则不会再覆盖它。
{
"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"
},
{
"type": "field",
"network": "tcp,udp",
"outboundTag": "proxy"
}
]
}
}
这段示例先放行私有 IP,再按国内域名直连,然后按国内 IP 直连,最后让剩余 TCP 与 UDP 连接进入代理出站。实际配置中的
direct 与 proxy 必须和现有出站标签一致;如果客户端生成的标签是 freedom、block 或其他名称,应以当前完整配置为准。geosite:cn应写入域名条件,不应写入 IP 条件。geoip:cn与geoip:private应写入 IP 条件。domain:example.com用于匹配该域名及常见子域名范围,完整匹配可按内核支持的规则形式配置。- 自定义数据标签必须真实存在于所用 dat 文件中,不能根据文件名猜测标签。
- 阻断规则、直连规则和代理规则要按具体范围从窄到宽排列,最后再放兜底规则。
domainStrategy 也会影响结果。AsIs 主要按原始域名信息匹配;IPIfNonMatch 会在域名规则未命中时解析 IP,再尝试 IP 规则;IPOnDemand 可能更早触发解析。修改该选项会牵涉 DNS 路径,不应把它当成单纯的“增强分流”开关。结论:先查第一条命中规则
规则结果与预期相反时,优先向上检查是否存在更宽的域名、IP、端口或全网络规则;仅把目标规则移动到列表末尾,通常不会提高它的优先级。
启动报错与数据库异常排查
文件不存在、内容损坏或标签缺失时,内核一般会在启动日志里留下比“连接失败”更具体的信息。排查时应保留完整错误链,尤其是文件名、标签名和底层读取原因,不要只截取最后一行。
报错:failed to load geosite: geosite.dat: no such file or directory
原因与解法:内核工作目录中找不到 geosite.dat,或客户端指向了错误路径——重新执行 Geo files 更新,确认文件写入当前内核目录后重启服务。
报错:failed to load GeoIP: geoip.dat: no such file or directory
原因与解法:GeoIP 文件缺失、被移动或更新未完成——退出客户端,核对 geoip.dat 是否存在且大小不是 0 字节,再重新下载。
报错:failed to decode geosite.dat: invalid wire-format data
原因与解法:下载结果不是有效数据文件,常见于传输中断或地址返回了网页内容——删除异常文件,通过客户端更新入口重新获取并重启内核。
报错:failed to load geosite: list not found
原因与解法:规则引用的标签不在当前 geosite.dat 中——核对标签拼写和数据来源,临时移除该规则后确认内核能否正常启动。
如果更新后客户端无法启动,可以先备份路由配置,再暂时禁用所有引用 Geo 标签的自定义规则。内核能够启动时,说明节点协议和基础出站大概率正常,问题集中在数据文件或规则标签;仍然无法启动时,则应继续查看端口占用、配置语法和内核路径。
还要检查文件是否被重复放置。客户端目录、内核子目录和自定义资源目录里可能各有一份同名文件,实际读取的未必是刚更新的那份。最直接的办法是查看启动日志暴露的资源路径,再对照该路径下文件的修改时间与大小。
规则命中但仍然误分流
日志没有错误,不代表分流结果一定符合预期。Geo 数据按集合维护,域名归属与服务器 IP 都可能变化;大型站点还会使用多地解析和内容分发,同一个域名在不同网络下可能得到不同地址。此时需要区分“规则没有命中”和“规则命中后选择的出站不符合预期”。
| 现象 | 优先检查 | 验证动作 |
|---|---|---|
| 国内域名进入代理 | GeoSite 标签与规则顺序 | 把目标域名单独加入直连规则并置于宽泛代理规则之前 |
| 直接连接 IP 时未命中 | GeoIP 条件与目标 IP 归属 | 记录目标 IP,再检查是否命中 geoip:cn 或私有地址集合 |
| TUN 下结果与系统代理不同 | 嗅探、DNS 与 domainStrategy | 保持节点不变,分别记录两种模式下日志中的目标域名和 IP |
| 更新后只有部分规则失效 | 自定义标签是否存在 | 逐条停用扩展标签,保留 geosite:cn 与 geoip:cn 做基线测试 |
| 局域网设备无法访问 | geoip:private 的位置 | 将私有 IP 直连规则放到代理兜底规则之前重新连接 |
建议建立最小测试配置:保留一个可用节点、一条私有地址直连、一条国内域名直连、一条国内 IP 直连和一条代理兜底。确认这组规则正常后,再逐批恢复广告域名、自定义域名、进程或端口规则。每恢复一批就测试一次,比一次加载数十条规则更容易定位冲突。
验证时至少记录三个结果:目标域名解析出的 IP、内核选择的出站标签、最终出口地址。网页打开速度容易受到缓存、服务器负载和网络抖动影响,不能单独证明分流是否正确。若本地 SOCKS 监听端口设为 10808,还要确认测试工具确实连接该端口,而不是绕过客户端使用系统直连。
结论:用最小规则集区分数据问题与顺序问题
基础的 geosite:cn 与 geoip:cn 能正常工作,逐步恢复扩展规则后才出现误分流,问题通常在新增规则的范围或顺序,而不是两份数据库本身。
更新后的完整验证清单
一次可靠的更新应同时覆盖文件、内核、规则和连接四个层面。只看到菜单提示“完成”,不足以证明路由已经按新数据运行。完成下面的检查后,再恢复自动启动、定时订阅更新等日常设置。
- 确认 geoip.dat 与 geosite.dat 都存在,文件大小大于 0 字节,修改时间接近本次更新时刻。
- 确认当前运行的是预期内核,v2rayN 可从「设置」→「参数设置」→「Core 类型」核对。
- 断开并重新连接,确保旧内核进程已经退出,新进程重新读取资源文件。
- 查看启动日志,排除 file not found、decode、list not found 等加载错误。
- 检查 GeoSite 标签位于域名条件,GeoIP 标签位于 IP 条件,出站标签与现有配置一致。
- 将私有地址、精确域名等窄规则放在宽泛代理兜底之前,避免提前命中。
- 分别测试域名连接与直接 IP 连接,记录实际选择的出站,而不是只看页面是否打开。
- 确认系统代理或 TUN 模式下的应用流量确实进入客户端,测试工具未绕过本地代理端口。
Geo 数据不需要在每次订阅更新后重复下载。订阅变化主要影响节点列表,Geo 文件变化主要影响路由集合。可以按实际需要定期更新,也可以在出现新域名无法分类、旧 IP 归属明显变化、扩展标签缺失时手动更新。频繁覆盖文件却不重启内核,反而容易让磁盘版本与运行版本不一致。
如果最终确认某个域名长期被集合错误分类,最稳妥的临时处理是添加一条范围更窄的自定义域名规则,并放在对应集合规则之前。这样既能修正当前连接,也不必删除整组 GeoSite 或 GeoIP 规则。后续数据更新后,再复测该域名是否仍需保留例外项。