本文适合已经能正常使用 v2rayN、v2rayNG 或 v2flyNG,希望进一步控制哪些请求直连、代理或拦截的用户。重点说明 domain、ip、geosite 的匹配边界、从上到下的优先级以及多条件组合方式,并给出可直接核对结构的 Xray 路由示例。
先理解路由规则处理什么
三个判断维度
操作要点
V2Ray 与 Xray 的路由模块不负责建立节点连接,它处理的是连接进入核心之后应该交给哪个出站。常见出站标签是 proxy、direct 与 block,分别对应代理、直连和拦截。标签名称不是协议关键字,而是配置中已经定义的 outboundTag;如果客户端生成的标签不同,规则也要使用客户端实际生成的名称。
操作要点
一次请求可能同时带有域名、目标端口、来源入口和解析后的 IP。规则数组按顺序检查,通常由第一条完整匹配的规则决定出站。因此,“更具体的规则放前面、范围更大的规则放后面”是最重要的排序原则。把覆盖面很大的 geosite:cn 或 geoip:cn 放在前面,可能会让后面的单域名代理规则永远没有机会生效。
操作要点
同一字段中的多个值是“任一匹配即可”,不同字段之间则是“必须同时满足”。例如一条规则同时写入 domain 与 port,表示域名条件和端口条件都成立才命中;domain 数组里写三个域名,则命中其中任意一个即可。这一差异经常导致规则看起来正确,实际却没有覆盖预期请求。
| 匹配对象 | 典型写法 | 适合场景 | 关键限制 |
|---|---|---|---|
| 域名 | domain:example.com |
网站、接口、下载域名分流 | 应用必须向核心提供域名,或允许核心进行解析 |
| IP | 192.0.2.0/24 |
固定网段、局域网与解析结果分流 | 域名请求是否转为 IP 匹配受 domainStrategy 影响 |
| geosite | geosite:category-ads-all |
按维护好的域名分类批量匹配 | 依赖客户端当前使用的地理数据文件及分类标签 |
| geoip | geoip:private |
私有地址或国家、地区 IP 段 | 只匹配目标 IP,不等同于 geosite 域名分类 |
domain 的五种常用写法
匹配边界
操作要点
domain: 是最适合日常维护的域名写法。domain:example.com 会匹配 example.com 及其子域名,例如 api.example.com,但不会把 notexample.com 当作同一域名后缀。希望覆盖某个站点及其所有服务子域名时,优先使用这种形式。
操作要点
full: 只做完整域名匹配。full:api.example.com 可以命中该主机名,但不会命中 www.example.com 或 v2.api.example.com。它适合把某个接口单独送入代理,同时让同一主域名下的其他服务继续遵循通用规则。
操作要点
不带前缀的纯字符串属于子串匹配。例如 example 可能匹配域名中任何包含该文本的位置,范围通常比预期更大。regexp: 支持正则表达式,灵活度最高,但规则数量多时不易排查,也更容易因边界书写不严谨而误匹配。能用 domain: 或 full: 表达时,没有必要先上正则。
domain 后缀匹配
推荐操作要点
同时覆盖主域名与全部下级子域名,语义清楚,适合多数网站规则。
适合:整站代理、整站直连
full 完整匹配
操作要点
只处理一个确定主机名,不扩大到同一主域名下的其他服务。
适合:单接口、单下载域名
regexp 正则匹配
操作要点
可以描述复杂命名规律,但需要自行处理点号转义与首尾边界。
适合:大量规律性子域名
{
"type": "field",
"domain": [
"full:api.example.com",
"domain:static.example.net",
"regexp:^img-[0-9]+\\.example\\.org$"
],
"outboundTag": "proxy"
}
操作要点
上例三个 domain 条目是“或”关系。请求只要命中其中一个,就会继续确认该规则的其他字段;因为示例没有额外字段,所以可直接进入 proxy 出站。正则中的点号必须转义,而 JSON 字符串本身还要再保留反斜杠,因此配置文本中会看到 \\.。
ip、CIDR 与 domainStrategy 的联动
地址规则
操作要点
IP 规则既可以写单个地址,也可以写 CIDR 网段。IPv4 单地址可写为 192.0.2.10,网段可写为 192.0.2.0/24;IPv6 可写为 2001:db8::/32。CIDR 后面的数字表示网络前缀长度,/24 覆盖 256 个 IPv4 地址,不能把它理解成端口或地址数量。
操作要点
geoip:private 常用于直连私有地址,可以覆盖典型局域网地址段。实际配置还应保留对回环地址与本地服务的处理,避免访问路由器管理页、NAS 或运行在 127.0.0.1 的程序时被送入远端代理。v2rayN 常见本地 SOCKS 监听端口为 10808,HTTP 端口可能由同一混合入口或相邻端口提供,具体值应以「设置」→「参数设置」中的本地监听配置为准。
- AsIs:优先按请求携带的域名进行匹配,不为了尝试 IP 规则而主动解析域名。
- IPIfNonMatch:先检查域名规则;域名规则没有结果时,再解析目标域名并尝试 IP 规则。
- IPOnDemand:检查到可能需要目标 IP 的规则时就可以触发解析,适合明确依赖 IP 分流的配置,但会更早引入 DNS 结果。
- 直接 IP 请求:应用本身连接的是 IP 时,不需要把域名转为地址,IP 与 geoip 规则可以直接参与匹配。
{
"domainStrategy": "IPIfNonMatch",
"rules": [
{
"type": "field",
"ip": [
"geoip:private",
"127.0.0.0/8",
"192.0.2.0/24"
],
"outboundTag": "direct"
}
]
}
结论:域名例外先于 IP 大类
如果某个域名必须代理,而它可能解析到会被直连规则覆盖的地址段,应把该域名的代理规则放到对应 IP 直连规则之前,并用日志确认请求最初携带的是域名还是 IP。
geosite 分类怎么用
分类与例外
操作要点
geosite 是按域名集合组织的数据分类,不是实时查询服务。geosite:cn 表示数据文件中归入相应分类的域名,geosite:category-ads-all 通常用于广告域名集合。分类内容会随客户端附带的数据版本变化,因此 geosite 适合承担大范围基础分流,自定义的关键域名例外仍应单独写在前面。
操作要点
geosite 与 geoip 不能互换。一个域名属于某个 geosite 分类,不代表它当前解析出的 IP 一定属于同名 geoip 分类;使用内容分发网络时,同一域名还可能在不同网络环境中得到不同地址。先用 geosite 处理域名语义,再用 geoip 为未命中的连接兜底,通常比只看 IP 更容易维护。
操作要点
拦截分类要特别注意顺序。假设某个业务接口被收录进广告分类,但该接口又是页面正常加载所必需,那么通用拦截规则会把它一起挡掉。解决方式不是删除全部广告分类,而是在拦截规则之前增加一条 full: 或 domain: 例外,并将其指向 direct 或 proxy。
[
{
"type": "field",
"domain": [
"full:required-api.example.com"
],
"outboundTag": "proxy"
},
{
"type": "field",
"domain": [
"geosite:category-ads-all"
],
"outboundTag": "block"
},
{
"type": "field",
"domain": [
"geosite:cn"
],
"outboundTag": "direct"
}
]
匹配优先级与规则编辑步骤
排序原则
操作要点
规则优先级不是由 domain、ip 或 geosite 的类型自动决定,而是主要由规则在数组中的位置决定。核心从第一条开始检查,命中后不再让后面的规则覆盖结果。因此,单域名例外应排在分类规则前,分类规则应排在最终兜底前,拦截规则也不能无条件压在业务例外之上。
操作要点
v2rayN 7.x 的界面文字可能随小版本调整,但检查顺序可以保持一致:先确定正在使用的核心,再打开路由设置,最后核对启用的路由方案和规则顺序。修改后应重启核心或重新载入配置,不能只保存窗口而继续使用旧的运行配置。
确认核心
打开「设置」→「参数设置」→「Core 类型」,确认当前配置使用 Xray 或 v2fly 对应核心;协议与路由字段必须由所选核心支持。
打开路由
进入「设置」→「路由设置」,选择当前启用的路由配置。若界面存在多个方案,先确认主界面实际选中的方案名称。
添加例外
先添加必须代理或必须直连的
full:、domain:规则,再添加 geosite、geoip 等范围较大的分类规则。核对出站
检查规则目标是代理、直连还是拦截。编辑原始配置时,还要确认
outboundTag与现有出站标签逐字一致。重载验证
保存后重启核心,分别测试一个命中例外的域名、一个命中分类的域名和一个局域网地址,并查看核心日志中的实际路由结果。
结论:按范围从小到大排序
完整域名、域名后缀、geosite 分类、geoip 网段、最终兜底依次展开,可以减少大范围规则提前截走请求的问题;真正的业务例外始终放在所属大类之前。
直连、代理、拦截三向规则示例
操作要点
下面是一组用于理解结构的完整路由片段。它先让指定 API 走代理,再拦截广告分类,然后让局域网与指定域名直连,最后让未被前述规则处理的连接走代理。使用前需要确认配置中已经存在名为 proxy、direct、block 的三个出站。
{
"routing": {
"domainStrategy": "IPIfNonMatch",
"rules": [
{
"type": "field",
"domain": [
"full:api.example.com",
"domain:services.example.net"
],
"outboundTag": "proxy"
},
{
"type": "field",
"domain": [
"geosite:category-ads-all"
],
"outboundTag": "block"
},
{
"type": "field",
"domain": [
"domain:printer.example.lan",
"geosite:cn"
],
"outboundTag": "direct"
},
{
"type": "field",
"ip": [
"geoip:private",
"127.0.0.0/8"
],
"outboundTag": "direct"
},
{
"type": "field",
"network": "tcp,udp",
"outboundTag": "proxy"
}
]
}
}
操作要点
最后一条规则只限定 network,覆盖 TCP 与 UDP,因此承担兜底作用。它必须位于数组末尾;如果放在第一条,几乎所有常见连接都会立刻进入代理,后面的直连和拦截规则不会被检查。若只希望代理 TCP,不要把 UDP 一并写入兜底,否则 DNS 或实时通信流量也可能改变出站。
操作要点
端口条件同样可以与域名组合。例如 domain 指定 domain:example.com,port 指定 443,则只有访问该域名的 443 端口时才命中。访问同一域名的 80 端口会继续检查后续规则。端口范围可写成核心支持的范围格式,但日常配置应尽量限制在明确业务端口,避免难以解释的宽范围覆盖。
- 测试代理例外:访问明确写入第一条规则的域名,确认日志显示
proxy。 - 测试拦截规则:选择确定属于当前 geosite 分类的域名,确认连接被送入
block。 - 测试局域网直连:访问路由器或局域网服务地址,确认命中
geoip:private或明确 CIDR。 - 测试最终兜底:选择不属于任何前置分类的目标,确认最后一条规则承担出站。
规则不生效时逐项排查
先确认运行状态
操作要点
排查的核心是确认“核心实际收到什么目标”以及“哪条规则先命中”。浏览器访问域名时,核心可能收到域名,也可能只看到由上游应用解析后的 IP;透明入口、系统代理和应用内代理产生的信息并不完全相同。不要只凭浏览器地址栏判断核心一定拿到了域名。
操作要点
其次检查客户端是否重新生成并载入了配置。v2rayN 修改路由方案后,如果当前选择的并不是刚编辑的方案,保存内容不会改变实际流量。v2rayNG 或 v2flyNG 使用订阅配置时,也要区分订阅更新与本地路由修改,避免更新订阅后覆盖此前调整。
单独写了域名,为什么还是直连?
把该域名规则移动到 geosite:cn 与 geoip:cn 之前,并确认它的 outboundTag 指向代理。随后重启核心,用日志检查是否先命中了更靠前的直连规则。
geosite 标签一加就启动失败?
查看核心错误日志中的具体标签名,确认当前数据文件包含该分类。先用常见分类做最小测试,不要同时加入多个来源不明的标签;标签不存在时应改用明确的 domain: 规则。
域名规则能命中,IP 规则不命中?
检查 domainStrategy。需要在域名规则未命中后继续解析并尝试 IP 规则时,可使用 IPIfNonMatch;改动后同时核对 DNS 是否能够返回预期地址。
局域网管理页被送进代理了?
在最终代理兜底之前加入 geoip:private 与所需局域网 CIDR 的直连规则。若访问使用自定义局域网域名,再补充对应的 full: 或 domain: 直连项。
规则保存后结果完全没变化?
确认主界面启用的是刚编辑的路由方案,然后重启核心。再检查「设置」→「参数设置」→「Core 类型」,避免把只适用于另一核心或另一数据集的配置当作当前运行配置。
操作要点
维护规则时,建议一次只调整一个目标:先解决明确域名的出站,再扩展到 geosite 分类,最后处理 IP 与 geoip 兜底。每次修改都保留一个代理、一个直连和一个拦截测试目标。这样即使订阅、核心或地理数据更新,也能快速定位变化发生在哪一层。