本文面向已经能连接节点、准备调整分流规则的用户。先区分域名表与 IP 地址表,再组合中国大陆站点直连、局域网直连与默认代理。示例重点说明 IPIfNonMatch 的解析条件、第一条出站的兜底作用,以及如何用客户端日志验证实际命中的出口,避免把“页面能打开”当作分流正确的证据。
一、geosite 与 geoip 分别匹配什么
geosite 是域名分类数据,geoip 是 IP 地址范围数据。二者不是两套自动识别网站归属的服务,也不会实时查询网站运营主体。路由结果取决于本机数据文件、请求交给内核时携带的目标信息,以及规则顺序。
| 写法 | 匹配对象 | 使用边界 |
|---|---|---|
geosite:cn | 数据集中 cn 分类的域名 | 需要内核获得域名;不是所有使用中文的站点 |
geoip:cn | 数据集中中国大陆 IP 网段 | 依赖目标 IP,不能直接说明网站属于哪家公司 |
geoip:private | 私有、保留等特殊用途地址集合 | 常用于局域网直连;具体范围以所用数据文件为准 |
domain:example.com | 指定域名及其子域名 | 用于手动补充单个站点,不依赖分类标签 |
full:example.com | 精确域名 | 不会同时匹配 www.example.com |
网站可能使用跨地区 CDN。同一个域名在不同网络下解析到不同地址,因此“域名命中 cn”和“解析地址命中 cn”不是同一个判断。浏览器先自行解析再把 IP 交给代理时,域名规则也可能失去直接匹配的机会;嗅探可以在部分协议中补充域名信息,但不能保证恢复所有请求的域名。
二、可合并的 routing 片段与默认出口
下面是完整的 routing 对象片段,不是可以直接连接节点的完整配置。将它合并到已有的 V2Ray 或 Xray 配置前,必须核对出站标签:本文约定 direct 指向使用 freedom 协议的直连出站,proxy 指向已经测试可用的代理出站。标签只是名字,不会自动创建出口。
{
"routing": {
"domainStrategy": "IPIfNonMatch",
"rules": [
{
"type": "field",
"domain": [
"full:localhost",
"geosite:cn"
],
"outboundTag": "direct"
},
{
"type": "field",
"ip": [
"geoip:private",
"geoip:cn"
],
"outboundTag": "direct"
}
]
}
}
这个片段要求已有配置的 outbounds 第一项是代理出站。在本文这种普通路由配置中,没有规则命中时,流量使用第一条出站;它不由 proxy 这个标签名自动决定。如果第一项实际是直连,未命中的境外站点也会直连。不要仅为了满足顺序而复制一条缺少服务器信息的代理出站。
- 目标是 cn 分类域名:第一条域名规则命中,选择
direct。 - 目标是
192.168.1.1这类私有地址:IP 规则命中,选择direct。 - 目标域名未命中:在没有其他规则命中的情况下,IPIfNonMatch 尝试解析并重新匹配 IP 规则。
- 解析地址仍未命中直连范围:使用第一条出站,也就是事先核对过的代理出站。
这里的“境外站点走代理”准确含义是:未被上述直连规则接收的流量默认走代理。它不是实时、完整的国家归属判定。需要严格按某个域名指定出口时,应添加显式域名规则,而不是期待 IP 地址归属始终符合业务需求。
结论:先核对兜底,再改分类
保存规则前,先检查生成配置中 outbounds[0] 的实际协议与标签。默认出口正确后,再用一条域名例外验证规则顺序;否则分类列表调整得再细,也可能把未命中流量送到错误出口。
三、domainStrategy 的选择与兜底陷阱
routing.domainStrategy 控制路由阶段是否为了匹配 IP 规则解析域名。它不等同于 DNS 服务器选择,也不等同于出站连接时的地址选择策略。相同名称的设置出现在不同配置层级时,应先确认所在对象。
IPIfNonMatch
推荐先按已有目标信息匹配规则;没有规则命中时,再尝试解析域名并重新匹配。本文片段采用此策略,并通过第一条出站兜底,不添加全匹配末尾规则。
适合:域名分类优先,同时需要中国大陆 IP 补充直连的配置。
AsIs
路由阶段不为域名额外解析 IP。已有目标 IP 仍可匹配 IP 规则,但仅以域名进入的请求不会因此获得 geoip 分类结果。连接阶段仍可能需要解析域名。
适合:以域名规则为主,希望减少路由阶段额外 DNS 查询的配置。
IPOnDemand
匹配过程中需要判断 IP 规则时,可以触发域名解析。IP 规则放得越靠前,越可能提前发生查询;不能简单理解为每个请求都一定先解析。
适合:明确需要在规则流程中较早执行 IP 判断,并能接受对应查询开销的配置。
常见错误是在 IPIfNonMatch 配置末尾再加 network: "tcp,udp" 的代理规则。它可以在第一轮直接匹配请求,使“没有规则命中”这个条件不再成立。结果是域名不在 geosite:cn 中时,可能直接走代理,而没有机会通过解析结果命中 geoip:cn。
路由解析也有隐私与连通性成本。哪些域名发给哪台 DNS 服务器,需要结合完整的 dns 配置、查询流量路径以及浏览器自身的解析方式判断。把 domainStrategy 改为某个值,不能单独保证 DNS 查询使用代理,也不能单独解决解析污染。
四、规则顺序:例外优先,分类其次
同一次规则匹配从上到下检查,首个匹配的规则决定出口。若一个规则对象同时含有 domain 和 ip 等多个条件,这些条件需要同时满足;同一个 domain 数组里的多个条目则是任选其一。需要“域名命中或 IP 命中就直连”时,应像本文一样拆成两条规则。
例如某个站点虽然在 cn 分类中,业务测试却要求它固定走代理,可以把以下对象插入 rules 数组首位。这里的 example.com 是说明语法用的保留域名,实际使用时应填写需要测试的域名。
{
"type": "field",
"domain": [
"domain:example.com"
],
"outboundTag": "proxy"
}
- 手动例外放前面:只覆盖确实需要改变出口的域名,便于回滚。
- 域名分类随后:让已知站点按明确的域名策略处理。
- IP 分类补充:接收直接访问 IP 的请求,以及策略允许解析后再判断的请求。
- 兜底最后确认:本文使用第一条出站,不再追加全匹配规则。
“私有 IP 必须最先匹配”也不是对所有场景都成立。如果希望域名例外优先于其解析地址,就要保持相应顺序;如果要求任何私有地址都直连,则还需考虑域名例外、DNS 返回结果与解析策略之间的关系。企业内网尤其应先确认地址规划,不能把一套公共网络示例直接覆盖到现有策略上。
五、在客户端中应用并核对实际配置
v2rayN 是桌面客户端;v2rayNG 使用 Xray 内核,v2flyNG 使用 v2fly 内核。客户端界面负责生成或载入配置,真正执行规则的是所选内核。完整自定义配置与普通节点模式的设置入口、覆盖范围并不相同,不应同时修改两套设置后猜测哪一套生效。
-
备份当前配置
记录当前启用的节点、路由方案与本地监听端口,并保存现有自定义配置。先确认未改路由时节点能连接,再开始调整分流。
-
进入路由设置
v2rayN 常见入口为「设置」→「路由设置」;v2rayNG 常见入口为侧边菜单→「路由设置」。不同版本的名称可能变化,应以当前界面为准。先查看现有规则,不要直接删除整套方案。
-
选择配置方式
使用界面规则编辑器时,分别填写域名、IP 与目标出口,并核对排序。使用完整自定义配置时,才合并本文的 routing 对象;不要把整个 JSON 对象粘进只接收域名列表的输入框。
-
检查实际标签
核对生成或载入的配置,确认 direct、proxy 都存在,并检查第一条出站。界面上的“直连”“代理”选项可能映射到其他标签,应使用实际配置中的名称。
-
重启并看日志
保存并启用对应路由方案后,停止再启动连接。查看运行日志是否出现规则解析、资源文件或出站标签错误。仅保存编辑窗口,不代表运行中的内核已经重载。
若要比较内核行为,应分别记录所用内核及版本,而不是只记录客户端版本。v2rayNG 与 v2flyNG 不应被当作同一内核的两个界面;自定义配置中的扩展字段和资源加载方式需要分别核对。基础字段的进一步说明可参阅本站JSON 手册。
六、用请求与日志验证分流结果
测试必须先证明请求进入了内核,再证明命中了预期出口。浏览器扩展、系统代理绕过列表、终端环境变量都可能改变入口。下面以本机已经启用 127.0.0.1:10808 SOCKS 监听为前提;10808 是测试端口,不代表所有安装的默认值,执行前应替换为当前监听端口。
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/
socks5h 让 curl 把域名交给代理端处理,适合观察域名规则;它并不等于 DNS 查询一定经过远端代理。第一条请求用于观察 cn 域名分类,第二条用于观察非直连分类的兜底行为。HTTP 响应成功只能说明连接完成,实际出口仍应以访问日志中的目标地址和出站标签为准。
| 测试项目 | 预期观察 | 异常时优先检查 |
|---|---|---|
| 数据中属于 cn 的域名 | 日志选择直连出口 | geosite 数据、域名是否传入、前置规则 |
| 实际存在的局域网地址 | 日志选择直连出口 | private 数据、IP 规则、内网连通性 |
| 不属于直连范围的域名 | 日志选择代理出口 | 第一条出站、额外规则、解析结果 |
| 手动指定代理的例外域名 | 优先命中例外规则 | 例外位置、domain 与 full 的区别 |
测试局域网地址时,应使用自己网络中确实存在的设备,例如管理地址为 192.168.1.1 的路由器;该地址只是示例。设备未提供网页服务时,连接失败不意味着路由规则错误。日志能够显示选择了哪个出站,目标服务是否响应则属于下一层检查。
加了 geoip:cn,为什么部分国内网站还走代理?
先查看请求是域名还是 IP,再检查 domainStrategy。如果使用 AsIs,域名不会为 IP 规则额外解析;如果使用 IPIfNonMatch,检查末尾是否有全匹配规则提前接收请求。最后核对实际解析地址是否在所用 cn 数据中。
国内域名为什么连接到了境外地址?
域名分类不保证服务器地址所在地区。若 geosite:cn 已经命中直连,后面的 geoip 规则不会再改变出口。需要按 IP 决策时,应明确调整策略和顺序,并重新测试 CDN 解析结果。
规则保存了,日志为什么还是旧的出口?
确认启用的是刚编辑的路由方案,再停止并启动内核。完整自定义配置可能不使用普通节点模式的路由编辑结果;应检查本次实际加载的配置,而不是只看编辑窗口。
所有请求都直连,应该先改哪一项?
先检查 outbounds 第一项是否为直连,以及是否存在靠前的全匹配规则。再用上述带明确 SOCKS 端口的 curl 命令确认流量进入内核。没有对应访问日志时,先处理入口问题,不要继续扩大规则列表。