本文适合已经能够导入节点、希望进一步控制直连、代理与拦截范围的用户。重点包括域名与 IP 条件的实际匹配方式、geosite 与 geoip 数据集的定位、规则冲突时的处理顺序,以及一份可以按现有出站标签调整的 routing 配置。
先理解 routing 的匹配过程
V2Ray 路由不会改变 VMess、VLESS 等节点协议本身。它处理的是请求进入核心之后应交给哪个 outbound,也就是决定某个连接走代理、直连、拦截出站或其他已经定义的出口。路由结果依赖请求目标、规则顺序和出站标签,节点能够连接并不代表分流规则一定正确。
一次请求通常先由本地 SOCKS、HTTP 或透明代理入口接收,再进入 routing.rules。核心从数组第一条规则开始检查,遇到第一条满足条件的规则便停止继续匹配,并使用该规则的 outboundTag 或 balancerTag。后面的规则即使写得更具体,也不会覆盖已经命中的前置规则。
同一条规则里的多个字段通常是“同时满足”的关系。例如一条规则同时设置 network: "tcp" 和 port: "443",它只匹配 TCP 443 连接;字段内部的数组则是“任意一个匹配即可”,例如 domain 数组包含三个域名条件,命中其中一个就满足该字段。
- 规则之间:按数组顺序自上而下检查,先命中者生效。
- 不同字段:domain、network、port 等条件需要共同满足。
- 同一字段数组:数组中的多个值通常按任意一项命中处理。
- 最终出站:outboundTag 必须与 outbounds 中已经存在的 tag 完全一致。
domain、full、regexp 与 geosite 怎么写
domain 字段接收一个字符串数组,但数组中的字符串可以采用不同匹配语法。普通字符串用于域名子串匹配;domain: 用于匹配指定域名及其子域名;full: 只匹配完整域名;regexp: 使用正则表达式;geosite: 则引用外部域名分类数据。日常分流优先使用 domain、full 和 geosite,只有现有语法无法表达目标范围时才考虑 regexp。
精确与后缀匹配
- 完整域名
- full:api.example.com
- 域名及子域
- domain:example.com
- 普通字符串
- example
- 正则表达式
- regexp:^.+\.example\.com$
已知固定主机名时优先使用 full,覆盖整站及子域时使用 domain。
分类数据匹配
- 境内常见域名
- geosite:cn
- 广告分类
- geosite:category-ads-all
- 非境内分类
- geosite:geolocation-!cn
- 数据来源
- 核心加载的数据文件
分类名称能否使用取决于当前核心实际加载的数据文件及其版本。
domain:example.com 可以覆盖 example.com 以及 www.example.com,适合整站策略;full:example.com 不会自动覆盖子域名,适合只处理一个固定主机名。普通字符串的范围更宽,容易意外匹配域名中包含相同字符的其他站点,因此不建议把过短的单词作为规则。
{
"type": "field",
"domain": [
"full:api.example.com",
"domain:static.example.com",
"geosite:cn"
],
"outboundTag": "direct"
}
geosite 不是实时联网查询服务,而是核心读取的本地域名分类数据。更新客户端或核心后,分类内容可能随数据文件变化。如果日志提示找不到某个 geosite 分类,应先确认分类名称是否存在,再检查客户端使用的是 V2Ray 还是 Xray 内核,不要通过反复调整规则顺序掩盖数据缺失问题。
ip、CIDR 与 geoip 的匹配条件
ip 字段针对连接目标的 IP 地址进行判断,可以填写单个地址、CIDR 网段或 geoip: 分类。常见写法包括 127.0.0.0/8、192.168.0.0/16、geoip:private 和 geoip:cn。CIDR 后缀表示网络前缀长度,写错一位就可能扩大或缩小匹配范围。
如果应用直接请求 IP,核心可以立即使用 ip 规则判断;如果应用请求的是域名,是否为路由匹配执行解析取决于 routing.domainStrategy。AsIs 主要保留原始域名进行判断,IPIfNonMatch 会在域名规则没有得到结果时尝试解析并继续进行 IP 匹配,IPOnDemand 则可能在匹配过程需要 IP 条件时触发解析。
| 写法 | 匹配范围 | 典型用途 |
|---|---|---|
127.0.0.0/8 |
本机回环地址段 | 避免本地服务进入远程代理 |
192.168.0.0/16 |
常见局域网地址段 | 访问路由器、存储设备和内网服务 |
geoip:private |
数据文件定义的私有地址 | 集中处理多个私有网段 |
geoip:cn |
数据文件归类的境内地址 | 作为域名分流之外的补充条件 |
结论:域名规则负责主要分流,IP 规则负责补充
先用 full、domain 和 geosite 表达清晰的业务范围,再用 geoip:private、geoip:cn 或明确 CIDR 处理直接访问 IP 的连接。这样可以减少不必要的 DNS 解析,也更容易从日志判断请求为什么命中某个出站。
使用 IPIfNonMatch 时还要注意解析路径:路由判断得到的 IP 与实际远端连接使用的解析结果应尽量一致。若内置 DNS、系统 DNS 和远端解析采用不同结果,同一域名可能在不同时间落入不同地址分类。遇到分流偶尔变化的问题,应同时检查 dns 配置、domainStrategy 和核心日志中的目标地址。
规则优先级与常见冲突
V2Ray 不会自动判断哪条规则“更具体”。数组靠前就是更高优先级,因此规则组织应遵循“例外在前、范围在后、兜底最后”。例如某个域名需要代理,但它同时属于 geosite:cn,就必须先写该域名的代理规则,再写 geosite 的直连规则。
- 先放必须拦截或必须单独处理的精确规则,例如
full:域名。 - 再放局域网和私有地址直连规则,避免本地设备请求进入代理。
- 然后放业务域名组、geosite 分类与指定网段规则。
- 最后放覆盖范围较大的代理或直连兜底规则。
- 修改后用核心日志逐个验证域名、IP、TCP 和 UDP 请求。
{
"routing": {
"domainStrategy": "IPIfNonMatch",
"rules": [
{
"type": "field",
"domain": [
"full:service.example.com"
],
"outboundTag": "proxy"
},
{
"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"
}
]
}
}
上面的第一条规则是 geosite 直连范围中的例外,因此放在最前;第二条先保护局域网访问;第三、第四条分别处理境内域名和地址;最后一条将剩余 TCP、UDP 请求交给 proxy。实际使用前必须确认 outbounds 中确实存在 proxy 和 direct 两个标签,否则核心会因引用不存在的出站而启动失败。
在 v2rayN 中配置与验证路由
v2rayN 的菜单名称可能随版本调整,常见入口是「设置」→「路由设置」。创建自定义规则集后,应先确认当前规则集已被选中,再保存配置并重启当前核心。若使用完整自定义配置文件,则要检查客户端是否会在切换节点或更新订阅时重新生成配置,避免手动修改被覆盖。
| 检查项目 | 具体操作 | 预期结果 |
|---|---|---|
| 本地入口 | 在「设置」→「参数设置」核对 SOCKS 10808、HTTP 10809 | 浏览器或测试程序连接到实际启用的端口 |
| 出站标签 | 检查规则中的 proxy、direct 是否对应现有 outbound tag | 核心启动日志不出现未知出站标签 |
| 规则顺序 | 分别测试精确域名、geosite 域名、直接 IP 和局域网地址 | 四类请求命中预期出站 |
| UDP 请求 | 确认兜底规则包含 udp,并核对节点及入口相关设置 | DNS 或其他 UDP 流量不被遗漏 |
验证时不要只看网页能否打开。应开启核心日志,准备至少六个目标:一个精确代理域名、一个 geosite 直连域名、一个境内 IP、一个局域网 IP、一个应拦截的域名和一个未被前述规则覆盖的域名。逐个请求后记录命中的 outboundTag,能够比对规则序号时也应一并记录。
结论:每次只调整一组条件
先固定 domainStrategy 和出站标签,再移动一条规则或修改一个匹配项。一次同时改变 DNS、geosite 分类和规则顺序,会让日志结果无法对应到单一原因,排查时间反而更长。
- 修改规则后保存配置,并重启当前核心,而不是只关闭设置窗口。
- 切换节点后再次检查日志,确认客户端没有恢复默认路由。
- 订阅更新只负责节点数据时,不要假设它会保留所有自定义字段。
- 规则数量增加后按用途分组记录,避免出现两条含义相反的宽泛规则。
高频问题与排查顺序
路由问题通常表现为某个网站走错出口、局域网设备无法访问、规则保存后没有变化,或者核心直接启动失败。排查时应先确认配置是否实际加载,再检查标签和顺序,最后才处理 DNS 解析与分类数据。按这个顺序可以先排除配置未生效等基础问题。
写了 domain 规则,为什么还是命中前面的 geosite?
把精确 domain 或 full 规则移动到 geosite 规则之前,保存后重启核心。规则不会按精确程度自动排序,先命中的 geosite 已经结束了本次匹配。
访问 IP 能分流,访问域名却没有走 geoip?
检查 routing.domainStrategy。使用 AsIs 时,域名请求不会为了所有 IP 规则统一执行解析;需要域名规则未命中后再尝试 IP 判断时,可评估使用 IPIfNonMatch。
添加 geosite 后核心启动报错怎么办?
先删除刚加入的分类并恢复启动,再核对分类名称与当前核心加载的数据文件。分类不存在或数据文件无法读取时,调整规则顺序不能解决错误。
局域网地址为什么被送进代理?
在宽泛代理规则之前加入 geoip:private,或明确加入 10.0.0.0/8、172.16.0.0/12、192.168.0.0/16。随后测试路由器和内网服务地址是否命中 direct。
规则看起来正确,保存后仍没有变化?
确认当前启用的是刚编辑的路由配置,然后重启核心并查看生成配置。若切换节点后规则消失,应检查客户端是否重新生成了 routing 段。
一套可维护的分流配置不需要堆积大量重复规则。先保留精确例外、私有地址、主要 geosite 或 geoip 分类以及最终兜底,再根据日志补充确有必要的条目。新增规则时写明用途、目标出站和验证结果,后续更新数据文件或更换核心时就能快速判断哪些规则仍然必要。
- 先查是否加载:查看核心启动日志与生成后的 routing 配置。
- 再查标签:核对 outboundTag 拼写、大小写和对应出站。
- 然后查顺序:把精确例外放到宽泛分类之前。
- 最后查解析:结合 domainStrategy、DNS 配置和实际目标 IP 判断。