V2Ray 与 Xray 的路由模块不负责建立协议连接,它接收已经进入核心的连接信息,再根据目标域名、目标 IP、端口、网络类型与入口标签决定交给哪个出站。订阅中的 VMess 或 VLESS 节点解决“怎样连接”,路由规则解决“这条请求走哪个出口”,两者处于不同层级。
最常见的需求是让本地网络和常用直连域名进入 direct,其余请求进入 proxy,再把广告域名送入 block。规则本身并不会提高节点带宽;正确设置的价值是减少不必要的代理流量,并让内网地址、局域网设备与指定站点使用预期出口。
本文适合已经能正常导入订阅、希望继续配置分流的用户;重点说明 domain、ip、geosite 的匹配边界、同一规则内的组合关系、规则数组的优先级,以及在 v2rayN 中保存和验证配置的方法。
先理解一次请求怎样进入路由判断
应用发起访问后,请求先进入本地 HTTP、SOCKS 或 TUN 入口。核心根据嗅探结果、目标地址及当前 domainStrategy 收集可供匹配的信息,然后逐条检查 routing.rules。第一条完整满足条件的规则立即决定出站,后面的规则不再参与。
一条字段规则通常使用 type: "field"。该规则可以包含 domain、ip、port、network、inboundTag 等条件,并通过 outboundTag 指向出站。规则未填写的字段不参与判断,填写的不同字段通常需要同时成立。
- 不同规则之间:按数组顺序自上而下检查,先命中者生效。
- 同一字段的多个值:通常是“或”关系,例如两个 CIDR 命中任意一个即可。
- 同一规则的不同字段:通常是“且”关系,例如同时限制域名和 TCP 端口。
- 没有规则命中:进入核心配置中的默认出站,通常是出站列表里的首个可用项。
domain、full、regexp 与 geosite 的写法
domain 数组可以接受多种前缀。没有前缀的普通字符串采用子串匹配,范围可能比预期更大;domain: 用于匹配指定域名及其子域;full: 只匹配完整域名;regexp: 使用正则表达式;geosite: 则引用核心随附的域名分类数据。
domain:example.com
- 匹配
- 主域及子域
- 可命中
- www.example.com
- 不命中
- example.com.test
适合按一个完整站点范围分流。
full:api.example.com
- 匹配
- 完整域名
- 可命中
- api.example.com
- 不命中
- www.api.example.com
适合只处理单个固定接口域名。
regexp:正则表达式
- 匹配
- 正则结果
- 灵活度
- 高
- 维护成本
- 较高
仅在普通域名规则无法表达时使用。
geosite:cn
- 数据类型
- 域名分类
- 匹配对象
- 域名
- 常见出口
- direct
分类内容随本地规则数据版本变化。
例如,domain:example.com 可以匹配 example.com 和 cdn.example.com,但不会把 example.com.test 当作该域名的子域。相比之下,直接写 example.com 属于子串条件,可能覆盖名称中包含这段字符的其他域名,因此自定义规则优先使用带前缀的明确写法。
{
"type": "field",
"domain": [
"full:api.example.com",
"domain:static.example.com",
"geosite:category-ads-all"
],
"outboundTag": "block"
}
geosite 虽然写在 domain 数组中,但它不是在线查询服务。核心读取本地域名分类数据,把分类条目用于匹配。若某个新域名尚未进入当前数据版本,可在分类规则之前增加一条 full: 或 domain: 自定义规则,不必等待分类更新。
| 语法 | 匹配范围 | 适用情况 |
|---|---|---|
关键词 |
域名字符串包含该内容 | 快速覆盖一组具有共同片段的域名 |
domain: |
指定域名及其子域 | 按站点整体设置出口 |
full: |
仅完整域名 | 精确处理单个主机名 |
regexp: |
符合表达式的域名 | 处理复杂命名规律 |
geosite: |
本地域名分类集合 | 批量设置常见域名分组 |
ip、CIDR 与 domainStrategy 怎样配合
ip 字段匹配目标 IP,可以写单个地址、CIDR 网段,也可以引用 geoip: 分类。常用的 geoip:private 用于识别私有网络地址,适合放在代理规则之前并指向直连,避免路由器管理页、局域网存储或本机服务被送入远端出口。
上面的 300 条测试样本由 100 个域名、100 个私有或保留地址、100 个公网地址组成,在启用规则日志后逐条发起连接,检查记录中的出站标签。该测试用于验证规则顺序和匹配边界,不代表网络速度。端口值是 v2rayN 常见默认值;如果本机参数设置已经修改,应以当前客户端显示为准。
{
"type": "field",
"ip": [
"geoip:private",
"10.20.0.0/16",
"192.168.50.10"
],
"outboundTag": "direct"
}
域名请求能否参与 IP 规则,与 domainStrategy 有关。AsIs 尽量按原始域名匹配,不会为了 IP 规则主动解析域名;IPIfNonMatch 会先检查域名规则,未命中时再解析 IP 并继续检查 IP 规则;IPOnDemand 在遇到需要目标 IP 的规则时更早触发解析。
AsIs:解析行为较少,适合主要依赖 domain 与 geosite 的配置。IPIfNonMatch:先域名、后 IP,适合作为同时使用 geosite 与 geoip 时的常见起点。IPOnDemand:可能更早进行解析,适合明确依赖目标 IP 的精细规则。
规则优先级:第一条完整命中的规则生效
路由规则没有单独的数字优先级字段,数组位置就是优先级。核心从第一条开始检查,一旦某条规则的全部条件成立,就使用该规则指定的出站。把大范围规则写在前面,会遮住后面更精确的例外规则。
- 最精确的单域名、单 IP 与特殊例外放在最前。
- 广告、私有地址等明确分类规则放在通用区域规则之前。
geosite:cn、geoip:cn等较大集合放在中间。- 覆盖全部 TCP、UDP 或其余请求的兜底规则放在最后。
下面的顺序先处理广告域名,再放行私有地址,然后检查常用直连域名与对应 IP,最后把剩余 TCP、UDP 流量送入代理。若把 geosite:cn 放在广告规则之前,分类中同时满足直连条件的广告域名可能先进入 direct,后面的阻断规则便不会执行。
{
"routing": {
"domainStrategy": "IPIfNonMatch",
"rules": [
{
"type": "field",
"domain": ["geosite:category-ads-all"],
"outboundTag": "block"
},
{
"type": "field",
"ip": ["geoip:private"],
"outboundTag": "direct"
},
{
"type": "field",
"domain": [
"full:intranet.example.com",
"geosite:cn"
],
"outboundTag": "direct"
},
{
"type": "field",
"ip": ["geoip:cn"],
"outboundTag": "direct"
},
{
"type": "field",
"network": "tcp,udp",
"outboundTag": "proxy"
}
]
}
}
如果一条规则同时写了 domain 和 port,请求必须同时满足域名条件和端口条件。例如域名命中但目标端口不是 443,该规则仍会跳过。若想让域名规则与端口规则分别生效,应拆成两条独立规则,而不是塞进同一个对象。
结论:按“例外、分类、兜底”排列
先写必须精确控制的例外,再写 geosite 与 geoip 分类,最后保留一条通用代理规则;每次新增规则都应检查它会不会被前面的宽范围条件提前截获。
在 v2rayN 中录入、保存并验证规则
v2rayN 7.x 可从主窗口进入「设置」→「路由设置」查看路由配置。不同小版本的按钮位置可能略有调整,但核心操作都是新建或编辑路由配置、调整规则顺序、保存后将其设为当前路由。若需要核对本地入口端口,可进入「设置」→「参数设置」查看 SOCKS 与 HTTP 监听值。
基础直连
- domainStrategy
- IPIfNonMatch
- 域名分类
- geosite:cn
- IP 分类
- geoip:cn
- 出站
- direct
适合域名规则与 IP 规则并用的起始配置。
局域网放行
- IP 分类
- geoip:private
- 规则位置
- 代理规则之前
- 出站
- direct
- 验证目标
- 192.168.1.1
用于路由器页面与局域网服务访问。
- 先记录当前可用配置,确认
proxy、direct、block等出站标签。 - 在「设置」→「路由设置」中新建一份配置,不直接覆盖仍在使用的规则。
- 先加入
geoip:private直连,再加入需要测试的 domain、geosite 或 CIDR 条目。 - 保存并选中该路由配置,重新连接当前服务器,使核心载入新设置。
- 打开日志面板,分别访问一个精确域名、一个子域名和一个局域网地址,核对出站标签。
测试时不要只看网页是否打开,因为直连和代理都可能访问成功。更可靠的方法是查看核心日志中的目标地址与出站标签,或者暂时把一条测试域名规则指向 block,确认请求被规则捕获后再改回目标出口。临时测试完成后应立即恢复正式设置。
常见误匹配与排查方法
路由问题通常不是协议连接失败,而是匹配对象、解析策略或规则顺序与预期不一致。排查时先确认节点本身可用,再查看请求进入了哪个出站,不要在 VMess、VLESS 参数和路由规则之间来回修改。
写了 domain 规则,为什么还是走代理?
先确认写法是否为 domain:example.com,再检查它是否位于通用代理规则之前。保存后重新连接当前服务器,并在日志中核对核心是否载入了新路由配置。
geosite:cn 命中了,geoip:cn 还会继续检查吗?
不会。当前请求一旦完整命中前面的 geosite 规则并取得出站,后续 geoip 规则不再检查。只有域名规则未命中且策略允许解析时,才可能继续进入 IP 判断。
局域网地址被送进代理怎么办?
在通用代理规则之前加入 geoip:private 并指向 direct。若使用特殊内网网段,再补充明确的 CIDR,例如 10.20.0.0/16。
同一个域名有时直连、有时走代理?
检查是否主要依赖 geoip,以及 DNS 是否返回不同地址。需要固定结果时改用 full: 或 domain: 规则,并把精确规则放在分类规则之前。
规则保存后完全没有变化?
确认新配置已被选为当前路由,而不只是保存在列表中;随后重新连接服务器。若日志显示出站标签不存在,应修正规则中的 outboundTag。
一份易维护的路由配置应当能回答三个问题:目标用什么字段匹配、为什么排在当前位置、命中后进入哪个出站。只要围绕这三点检查,domain、ip、geosite 混合配置也能保持清晰。遇到异常时从第一条规则开始顺序推演,通常比反复切换节点更快找到原因。
最终检查:日志结果比页面现象更可靠
完成配置后至少验证精确域名、子域名、私有 IP、公网 IP 四类目标,并记录各自命中的出站标签;只有四类结果都符合预期,才说明规则边界与优先级设置正确。