本文适合已经导入节点、准备调整分流的桌面用户。先分清域名规则与 IP 规则,再把具体例外放在通用规则前面,最后用日志验证出口。示例采用 Xray/V2Fly 的路由字段语义;v2rayN 图形界面负责生成配置,不能把完整内核 JSON 直接粘到单个域名输入框。
一、路由规则先看匹配顺序
系统代理决定应用是否把请求交给 v2rayN,路由规则决定内核收到请求后选择哪个出口。两者不是同一个开关。应用若绕过系统代理直接联网,修改域名规则不会影响它;使用 TUN 接管时,还需要检查流量是否确实进入内核。
Xray/V2Fly 的常规路由规则按数组顺序检查,首个满足条件的规则决定出口。不是“越精确越优先”,也不会自动让 full: 压过 domain:。若第一条已将 domain:example.com 送往代理,后面针对 full:files.example.com 的直连例外就不会生效。
| 排列位置 | 规则意图 | 示例出口 |
|---|---|---|
| 最前面 | 明确的域名例外或阻断目标 | direct / block |
| 中间 | 业务域名、局域网 IP、地区集合 | proxy / direct |
| 最后 | 剩余 TCP、UDP 请求的兜底 | proxy 或按需直连 |
同一条规则里,domain 数组中的多个条目通常是“或”;ip 数组中的多个条目也通常是“或”。不同条件字段之间则是“且”。例如把域名、目标端口和网络类型写在同一条规则里,表示三个条件都满足才命中,不是满足任意一个就命中。
二、domain、full、regexp 的写法
域名规则写主机名,不写协议、路径和查询参数。访问 https://api.example.com:443/v1/status 时,域名条件应填写 api.example.com。端口 443 是另一个条件,路径 /v1/status 不属于这类路由规则的匹配范围。
| 写法 | 匹配含义 | 容易误解的地方 |
|---|---|---|
domain:example.com | 匹配根域名及其子域名 | 会匹配 api.example.com,不会匹配 notexample.com |
full:api.example.com | 只匹配这个完整主机名 | 不会匹配 v2.api.example.com |
regexp:^api[0-9]+\.example\.com$ | 按正则表达式匹配 | 点号须转义;锚点限制整个域名 |
example | 未带类型前缀时按普通字符串包含关系匹配 | 范围比后缀域名匹配更宽,可能误命中 |
domain: 不是通配符表达式。覆盖整个域名家族时,写 domain:example.com 即可,不要写 domain:*.example.com。只希望一个主机走特定出口时,选 full:;需要匹配有规律的编号主机时,再考虑正则。
{
"type": "field",
"domain": [
"full:files.example.com",
"regexp:^api[0-9]+\\.example\\.com$"
],
"outboundTag": "direct"
}
上面是内核 JSON 片段,所以反斜杠写成 \\。在 v2rayN 的普通域名文本框中,通常填写单个反斜杠:regexp:^api[0-9]+\.example\.com$。把 JSON 的转义写法原样搬进普通文本框,可能改变正则含义。请先判断输入位置究竟是 JSON 编辑器还是规则字段。
结论:先用 full,再扩大范围
新加业务例外时,先用一个 full: 主机验证出口。确认命中后再改成 domain:,只有确实需要模式匹配时才使用 regexp:,这样更容易定位误分流。
三、ip、CIDR 与 geoip 的边界
IP 条件写在 ip 字段中,常用形式是单个地址、CIDR 网段或 geoip: 集合。这里匹配的是目标 IP。不要把源设备的局域网地址误填成目标规则;按来源分流属于其他条件,不能用目标 IP 字段替代。
{
"type": "field",
"ip": [
"192.168.50.0/24",
"203.0.113.10/32",
"2001:db8::10/128",
"geoip:private"
],
"outboundTag": "direct"
}
192.168.50.0/24 覆盖这个 IPv4 子网。203.0.113.10 与 2001:db8::10 是文档示例地址,不是可连接节点。实际配置应换成需要分流的目标网段。局域网直连规则优先使用明确网段,再按需要补充 geoip:private。
geoip:cn 根据加载的 IP 数据集合判断,geoip:private 用于该数据集合定义的私有或本地地址范围。集合内容会随数据文件变化,不宜把某一条集合规则当成永久准确的地域结论。特别是 CDN、跨区服务和新分配网段,可能需要单独添加例外。
- 目标是域名时,IP 规则能否参与匹配,取决于内核是否获得目标地址以及路由解析策略。
- 目标已经是 IP 时,不必为了命中 IP 规则再做域名解析。
- 同一服务可能同时使用 IPv4 和 IPv6;只补 IPv4 规则,不能覆盖它的 IPv6 连接。
- 把所有私有目标送直连前,应确认所在网络的访问需求;直连不等于绕过本机防火墙。
四、geosite 数据集与 DNS 策略
geosite:cn 是域名集合,geoip:cn 是 IP 集合,两者不能互换。前者不表示“解析结果一定在国内”,后者也不表示“这个域名属于国内业务”。用域名集合做业务分类,用 IP 集合补充地址分类,才能减少判断混乱。
{
"type": "field",
"domain": [
"geosite:cn"
],
"outboundTag": "direct"
}
传统 Xray/V2Fly 配置引用这些集合时,需要内核能够找到相应的数据文件,常见文件名为 geosite.dat 和 geoip.dat。集合名称以实际加载的数据内容为准。不能仅凭文章中的名字就假定本机存在某个分类;数据缺失或标签不存在,可能导致配置加载失败。
| domainStrategy | 路由解析行为 | 排查重点 |
|---|---|---|
AsIs | 路由阶段不主动为匹配 IP 规则解析域名 | 域名请求没有命中 IP 集合,不一定是规则语法错 |
IPIfNonMatch | 域名阶段没有规则命中时,尝试解析并再次匹配 | 过早命中的通用规则可能阻止这次补充匹配 |
IPOnDemand | 匹配过程需要目标 IP 时,尝试解析域名 | 检查 DNS 可用性与解析结果是否符合预期 |
尤其注意 IPIfNonMatch 与兜底规则的关系:如果第一轮检查域名时,最后的 network: tcp,udp 已经命中代理出口,就不会因为前面的 geoip:cn 没匹配而自动重试。若希望依赖 IP 集合分流,需要连同解析策略和默认出口一起设计,不能只追加一条 IP 规则。
五、代理、直连、阻断的配置示例
下面的片段先阻断一个明确主机,再允许文件主机直连,然后让同域名下的其他请求走代理。局域网目标直连,剩余 TCP、UDP 请求走代理。为了让域名目标也能参与 IP 条件判断,示例选择 IPOnDemand;使用前应确认内核 DNS 配置可用。
{
"routing": {
"domainStrategy": "IPOnDemand",
"rules": [
{
"type": "field",
"domain": ["full:telemetry.example.com"],
"outboundTag": "block"
},
{
"type": "field",
"domain": ["full:files.example.com"],
"outboundTag": "direct"
},
{
"type": "field",
"domain": ["domain:example.com"],
"outboundTag": "proxy"
},
{
"type": "field",
"ip": ["192.168.50.0/24", "geoip:private"],
"outboundTag": "direct"
},
{
"type": "field",
"network": "tcp,udp",
"outboundTag": "proxy"
}
]
}
}
这只是 routing 配置片段,不是完整节点配置。proxy、direct、block 必须与实际 outbounds 中的 tag 对应。标签只是名字,本身不会创建出口:直连通常对应 freedom 出站,阻断通常对应 blackhole 出站,代理出口则使用已有节点。
具体例外优先
推荐把单个主机和明确网段放在通用分类前面,改动范围容易检查。新增例外只需核对其上方是否存在抢先命中的规则。
适合:已有日常分流,希望补充少量业务例外
代理兜底
未被直连或阻断规则覆盖的请求交给代理。覆盖面清楚,但代理节点必须承担更多请求,内网目标应提前排除。
适合:多数外部业务需要代理,并能维护直连清单
直连兜底
只把明确列出的业务交给代理,其余请求直连。新业务和遗漏域名不会自动走代理,需要持续维护清单。
适合:代理目标少且稳定,其余访问以直连为主
没有任何路由规则命中时,Xray/V2Fly 通常使用出站列表中的第一个出口。不要把这个默认行为当成“必定直连”。v2rayN 生成配置时可能调整出站排列,因此需要核对实际配置,或用符合当前解析策略的明确兜底规则表达意图。
六、在 v2rayN 中添加并验证规则
操作前先备份现有路由。以下以带有「设置」→「路由设置」入口的 v2rayN 桌面界面为例;跨平台界面和经典界面的按钮位置可能不同。应编辑一套路由方案,再在主界面的路由选择入口启用它。只保存规则但没有选择该方案,是常见的“不生效”原因。
-
备份方案
进入「设置」→「路由设置」,先导出或记录当前方案与规则顺序。保留原方案,测试时新建一套,避免一次改坏全部日常分流。
-
打开规则
在「路由设置」中选择要修改的方案,进入方案的规则编辑窗口。新增规则时先选择出口,再在域名字段填写
full:files.example.com,不要粘贴完整 JSON。 -
调整顺序
将明确主机的例外移到
domain:example.com等宽泛规则之前。域名字段与 IP 字段分别建规则;多条输入按界面提示的分隔方式填写,不自行假定逗号会被拆分。 -
启用方案
保存后回到主界面的路由选择入口,选中刚编辑的方案。确认内核已重新加载;若日志出现配置错误,先恢复备份,不继续叠加新规则。
-
检查出口
把示例域名换成自己有权限测试的真实主机,建立一次新连接,再查看内核日志。若开启了访问日志,核对目标与出站标签;不要仅凭网页能打开判断已经直连。
路由一般在建立连接时确定。浏览器已有的长连接可能继续使用原出口,因此保存规则后,应关闭测试站点的连接或重启测试应用,再重新访问。不要用旧页面刷新一次就判定规则失败。日志若没有这次请求,先检查系统代理、应用代理或 TUN 接管,而不是立即重写正则。
- 先验语法:检查前缀拼写、正则转义、集合名称和出口标签,确认内核能成功启动。
- 再验目标:确认实际请求的主机名。网页主域名、登录域名、下载域名可能是三个不同目标。
- 最后验顺序:从第一条向下找第一个可能命中的规则,尤其检查通用域名集合与兜底规则。
七、自定义路由常见问题
写了 full,为什么还是走代理?
先在「设置」→「路由设置」确认当前启用的方案,再把这条精确规则移到通用域名规则前面。关闭旧连接重新测试,同时核对请求是否实际使用了另一个下载或登录主机名。
geosite:cn 与 geoip:cn 要都写吗?
不必机械地同时添加。需要两类判断时分成两条规则:一条填域名集合,一条填 IP 集合。再确认路由解析策略,否则域名请求可能无法参与 IP 集合匹配。
能不能只让某个 HTTPS 路径直连?
这里介绍的域名规则不能按加密请求中的 URL 路径分流。可按完整主机名分流,或在确有需求时给规则增加目标端口 443;端口条件仍无法区分同一主机下的两个路径。
为什么加了 geosite 后内核启动失败?
先看启动日志是否提示数据文件缺失或集合不存在。使用客户端提供的路由数据更新入口维护数据,再核对当前内核的数据路径。暂时改成一个 full: 规则验证配置,不要随机替换集合名。
订阅更新会改变自定义规则吗?
节点订阅与路由方案属于不同配置,但切换节点、内核或路由预设后,生成配置可能发生变化。更新后检查当前路由方案及出口标签;不要把节点订阅链接粘进域名规则字段。
处理分流问题时,按“请求进入内核 → 目标信息可用 → 首条命中规则 → 对应出口存在”的顺序检查。域名写法负责描述目标,解析策略负责补充 IP,规则顺序负责决定优先级。每次只修改一处,并保留能恢复的方案,比反复切换整套预设更容易定位问题。