本文适合已能通过 v2rayN 连接节点、准备调整路由的 Mac 用户。先区分域名列表与 IP 地址库,再配置“私有地址直连、境内域名与 IP 直连、其余交给代理”的规则。示例展示可读的 routing 片段,并说明默认出站、DNS 与规则顺序如何共同决定实际结果。
geosite 与 geoip:匹配对象不同
分流不是根据网页语言或设备所在地判断线路。V2Ray 核心接收请求后,读取可用的目标域名、目标 IP、端口等信息,再按 routing.rules 的顺序寻找匹配项。命中规则后,流量交给该规则指定的 outboundTag。这里的标签必须对应 outbounds 中真实存在的 tag。
| 写法 | 匹配对象 | 主要限制 |
|---|---|---|
geosite:cn | 域名分类列表 | 依赖所用 geosite 数据文件,不等于全部境内网站 |
geoip:cn | 被数据库归入中国的 IP 网段 | 不代表网站所属公司或内容语言 |
geoip:private | 私有及特殊用途地址集合 | 具体范围应以所用数据文件为准 |
domain:example.com | 指定域名及其子域名 | 不覆盖名称相似的其他域名 |
full:example.com | 精确域名 | 不包含其子域名 |
geosite:cn 是分类条目,不是按域名后缀猜测位置。某个 .com 域名也可能在列表中;反过来,网站使用境外 CDN 时,域名分类与 IP 归属可能给出不同结果。域名信息存在时优先按域名分流,通常比只看解析后的地址更容易维护。
v2rayN 路由设置:先备份,再修改
v2rayN 是配置与连接管理客户端,真正执行规则的是选定的核心。Project V、V2Fly 与 Xray 生态中的配置有共同字段,也有各自扩展。本文只使用常见的 field 规则,不把某一核心的扩展参数直接移植到另一核心。
-
记录当前配置
在主界面记录当前服务器、路由模式及系统代理状态。打开「设置」→「参数设置」,记录当前使用的核心及本地监听端口。界面分组会随版本变化,以实际显示为准;不要为套用示例切换一个不支持现有节点协议的核心。
-
备份路由规则
进入「设置」→「路由设置」,先备份现有规则内容,再新建或编辑用于测试的路由配置。确认主界面实际选中了这套路由,而不是仍处于全局代理或全局直连模式。
-
核对出站标签
查看核心实际加载的配置,核对代理与直连出站的
tag。本文使用proxy和direct,它们只是示例标签;实际标签不同时,必须同步替换规则中的outboundTag。 -
应用并看日志
保存规则后让客户端重新加载核心配置,再查看日志中的启动结果。出现未知出站、数据文件加载失败或 JSON 解析错误时,先恢复备份,不要继续叠加规则。
客户端通常会重新生成运行配置。直接修改临时 config.json,可能在换节点或重启后被覆盖。日常使用应优先通过路由设置保存规则;手工配置用户则在自己的配置源中维护下面的片段。
routing 示例:境内直连,其余走代理
下面是一个独立的路由片段,不是完整客户端配置。使用前必须已有可用的代理出站,以及 protocol 为 freedom 的直连出站;两者标签分别为 proxy 与 direct。还需确认核心能读取包含相应分类的 geosite 与 geoip 数据文件。
{
"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"
}
]
}
}
- 第一条处理私有地址:例如
192.168.1.1、10.0.0.1这类本地网络目标,不应为了访问路由器或内部服务而绕到远端代理。 - 第二条处理境内域名:命中
geosite:cn后立即直连,不再等待后面的 IP 条件。 - 第三条处理境内 IP:适用于原本就是 IP 的目标,以及路由策略允许解析后得到的境内地址。
- 第四条明确兜底:剩余 TCP 与 UDP 请求交给
proxy,不依赖出站数组的默认顺序。
没有规则命中时,核心通常使用 outbounds 中的第一个出站。因此,“其余走代理”既可以用显式规则实现,也可以依赖代理作为默认出站。两种方式对 IPIfNonMatch 的影响不同,不能只复制 rules 而忽略出站顺序。
domainStrategy:何时为路由解析域名
routing.domainStrategy 决定路由匹配过程中是否尝试把域名转换为 IP。它不是系统 DNS 开关,也不等同于直连出站自己的域名处理策略。更改这个字段,不会自动完成 DNS 请求的接管、加密或上游选择。
IPIfNonMatch
推荐先用已有目标信息匹配;域名没有匹配任何规则时,再尝试解析,并使用结果重新匹配。适合作为起点,但要检查末尾是否已有覆盖所有请求的规则。需要解析补判时,使用代理首出站作为默认行为更清楚。
适合:域名规则优先、明确管理默认出站的配置
AsIs
路由阶段不主动为匹配而解析域名。域名请求主要依赖 domain 规则;本来就以 IP 为目标的请求仍可匹配 ip 规则。它不能保证整个连接过程完全不发生 DNS 查询。
适合:域名列表较完整、希望减少路由解析依赖的配置
IPOnDemand
域名请求匹配到需要 IP 信息的规则时,尝试解析再判断。若第一条就是 geoip:private,可能很早便触发解析,因此 DNS 的可用性与返回地址会更直接地影响分流。
适合:确实需要按解析地址决策、且已验证 DNS 路径的配置
结论:先确定兜底,再选解析策略
需要“域名列表之外再按 IP 补判”时,先把代理设为第一出站,删除末尾全匹配规则,再使用 IPIfNonMatch 验证。若保留显式兜底,应明确接受未知域名直接走代理,或单独测试 IPOnDemand 的解析结果。
同一域名可能返回多个 IPv4 与 IPv6 地址,也可能随 DNS 上游改变 CDN 落点。某次命中 geoip:cn,不代表以后所有连接都会命中。若业务需要稳定出口,应为明确的域名建立专用规则,而不是把偶然出现的 CDN 地址长期固定到规则里。
规则顺序:首条命中,不是自动择优
规则列表按从上到下的顺序检查,命中后就使用相应出站。核心不会比较两条规则谁“更具体”。把专用例外放在宽泛分类之前,把全匹配兜底放在最后,是维护规则的基本顺序。
{
"type": "field",
"domain": ["domain:example.com"],
"outboundTag": "proxy"
}
例如,某个域名虽然被域名库归入直连分类,但实际业务要求固定走代理,可以把上面的专用规则放在 geosite:cn 之前。example.com 是说明语法的示例域名,应用时要改成实际目标。若只覆盖根域名、不覆盖子域名,应改用 full:。
- 同一字段内通常是“或”:
domain数组写两个域名,任意一个匹配即可满足该字段。 - 同一规则的不同条件通常是“且”:同时填写
domain与port,需要目标域名和端口都符合。不要把domain与ip塞进同一条规则,误以为是在表达两者任选其一。 - 端口条件要考虑实际协议:只匹配 TCP 的规则不覆盖 UDP。浏览器的 HTTP/3 常使用 UDP 443,因此只看 TCP 443 的命中不能代表全部网页连接。
- 规则只处理已进入核心的连接:系统代理排除列表中的本地地址可能直接由应用访问,此时核心日志没有记录是正常现象。
验证与排错:看目标、规则和出站
网页能打开,只能证明这次请求完成,不能证明它经过了预期出口。先确认核心启动成功,再用固定请求观察访问日志中的目标与出站标签。不同核心的日志格式不同,有些格式会显示入站到出站的对应关系;日志级别较低时,需临时提高记录级别,测试完成后恢复。
curl --proxy http://127.0.0.1:10809 --connect-timeout 10 --max-time 20 -I https://www.baidu.com/
curl --proxy http://127.0.0.1:10809 --connect-timeout 10 --max-time 20 -I https://example.com/
这里的 10809 只是演示用 HTTP 代理端口,不是对当前 v2rayN 默认值的断言。请替换为「设置」→「参数设置」中实际启用的 HTTP 或混合监听端口。命令显式指定本地代理,便于把“终端是否遵循系统代理”这个变量排除;这两条请求主要验证 TCP 路径,不验证浏览器的 UDP 行为。
国内网站为什么还是走代理?
先从日志确认目标是域名还是 IP,再检查该域名是否在当前 geosite 数据中。若使用 IPIfNonMatch 且末尾有全匹配代理规则,域名不会再解析补判。可以先加一条精确域名直连规则测试,不要立刻改成整段 IP 直连。
加了 geoip:cn 后部分网站打不开?
检查 DNS 返回地址以及日志中的实际出口。若目标 IP 被判为境内,但该服务在当前网络无法直连,可先为该服务的域名添加代理例外,并放在境内直连规则前。每次只改一条规则,保留失败时的目标记录用于对照。
日志提示找不到 geosite 分类怎么办?
核对规则中的分类名、核心实际加载的数据文件路径及启动日志。不同数据发行内容不一定相同;订阅更新也不等同于规则数据库更新。使用客户端对应的数据更新入口后重启核心,仍失败就恢复已确认存在的分类。
改完规则没变化,需要重装吗?
先确认已切换到新路由配置,重新加载核心,并关闭测试应用的旧连接再发起请求。已建立的长连接不会因为修改规则就自动换出口。还应确认改的是配置源,而不是会被客户端覆盖的运行时文件。
最后保留三项记录:使用的核心、路由规则内容、测试请求对应的出站标签。公开日志前删除订阅地址、节点凭据和私人访问记录。分流配置的验收目标是“指定请求稳定进入指定出站”,而不是用一次测速结果判断所有规则是否正确。