适合已经导入订阅、节点能够连接,但需要调整国内外分流的用户。先确认流量进入客户端,再区分 domain 与 ip 的匹配对象,最后按“自定义例外、通用分类、默认出口”的顺序设置规则。本文提供 V2Ray/Xray 格式的路由片段、v2rayN 操作步骤和验证方法;代码中的出口标签必须与当前配置对应,不能直接当作完整客户端配置导入。
路由前提:流量必须先进入内核
路由规则负责选择出口,不负责让所有应用自动进入代理。浏览器遵循系统代理时,请求才会送到本地代理端口;忽略系统代理的程序通常需要单独配置代理,或使用 TUN 接管。开启 TUN 也不等于全局代理:流量进入内核以后,仍然可以根据路由规则直连。
v2rayN 是桌面客户端,路由最终由当前运行的内核执行。本文 JSON 采用 V2Ray/Xray 路由格式,适用于对应内核配置,不是所有内核通用的配置语法。Android 上的 v2rayNG 使用 Xray 内核,v2flyNG 使用 v2fly 内核;两者的界面入口、内置规则和资源更新方式并不完全相同。
domain 与 ip:匹配对象和写法
domain 匹配请求中的目标域名,ip 匹配目标 IP 或按策略解析得到的 IP。域名规则不是完整网址过滤器:不要把 https://、网页路径或查询参数填进去。访问同一域名的不同路径,通常不会因此走不同出口。
| 写法 | 实际含义 | 适用场景 |
|---|---|---|
full:example.com | 仅匹配 example.com 本身 | 只为一个主机名设置例外 |
domain:example.com | 匹配根域名及其子域名 | 让同一域名下的服务走相同出口 |
example | 普通字符串按关键词匹配域名 | 范围较宽,容易误匹配,谨慎使用 |
geosite:cn | 引用域名资源中的 cn 分类 | 按维护好的域名集合分流 |
192.168.0.0/16 | 匹配指定 IPv4 网段 | 局域网地址直连 |
geoip:cn | 引用 IP 资源中的 cn 分类 | 按目标 IP 所属地址集合分流 |
例如 domain:example.com 可以匹配 api.example.com,但不会把 notexample.com 当成其子域名。需要精确控制时,优先使用 full: 或 domain:,不要用过短的关键词替代域名边界判断。
域名例外规则
- 规则字段
- domain
- 匹配内容
- domain:example.com
- 目标出口
- direct
- 建议位置
- 通用分类之前
适合明确知道域名的业务;示例域名仅用于说明格式。
局域网 IP 规则
- 规则字段
- ip
- 匹配内容
- geoip:private
- 目标出口
- direct
- 检查重点
- IPv4 与 IPv6 地址范围
确认资源文件提供该分类;也可按实际网络填写明确的 CIDR 网段。
规则顺序:第一条命中即决定出口
规则按列表从上向下检查,命中后不会继续寻找“更精确”的后续规则。把范围很大的规则放在最前面,后面的自定义例外可能永远不会执行。同一个字段数组中的多个值通常是“或”的关系;同一条规则中同时填写 domain、ip、port 等不同条件,则需要满足这些条件的组合。
- 先放例外:必须直连或必须代理的特定域名,放在通用国家分类之前。
- 再放分类:依次处理局域网、国内域名和国内 IP 等常规范围。
- 最后处理剩余流量:明确默认出口,避免依赖不清楚的出站排列。
- 域名与 IP 分开写:要表达“国内域名或国内 IP 直连”,应建立两条规则,而不是把两类条件塞进同一条。
核心配置未命中任何规则时,一般使用 outbounds 数组中的第一个出站。下面通过末尾的 TCP/UDP 规则明确兜底到代理,避免把“未命中”误认为一定直连。此片段只有 routing 部分;direct、proxy 必须是当前完整配置里已经存在的出站标签。
{
"routing": {
"domainStrategy": "IPIfNonMatch",
"rules": [
{
"type": "field",
"domain": ["domain:example.com"],
"outboundTag": "direct"
},
{
"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、geoip 与 DNS 策略
geosite 是域名集合,geoip 是 IP 地址集合,两者不是实时查询服务。引用了不存在的分类,或者资源文件缺失、格式不兼容,可能导致内核加载失败。更新订阅只代表重新获取节点,并不保证路由资源也同步更新。
domainStrategy 决定路由阶段如何对待域名解析,不等于完整的 DNS 服务器设置。设置为 IPIfNonMatch 时,只有域名阶段没有匹配成功,才可能解析 IP 后再次匹配;如果最后一条通配规则已经命中,就不满足“未匹配”的条件。
| 策略 | 路由行为 | 使用提醒 |
|---|---|---|
AsIs | 路由阶段不主动为域名解析 IP | 域名请求主要依赖 domain 规则,IP 字段仍可匹配直接访问的 IP |
IPIfNonMatch | 域名未匹配时尝试解析并重新匹配 | 末尾通配规则会提前命中,不能指望此时再进入 IP 回退 |
IPOnDemand | 匹配过程遇到需要 IP 的规则时尝试解析 | 规则顺序会影响何时触发解析,需同时检查 DNS 可用性 |
上节配置中的 geoip:cn 能处理直接以 IP 为目标的连接,但在末尾通配规则存在时,不能保证对所有未分类域名做 IP 回退。如果希望未命中的域名也按解析后的 IP 分类,可考虑使用 IPOnDemand,并将需要优先决定的域名规则放在 IP 规则前;另一种做法是移除通配兜底,并确认第一个出站确实是代理。
- 使用
IPOnDemand后,DNS 解析异常可能拖慢路由判断,不应只检查节点延迟。 - 域名可能同时返回 IPv4 与 IPv6;只查看一条 IPv4 结果,不能解释所有连接的分流结果。
- 嗅探可以在部分连接中补充域名信息,但受协议与加密方式影响,不能当成必然成功的域名恢复机制。
三种方案:绕过大陆、全局代理、自定义直连
“绕过大陆”通常指局域网及国内目标直连,其余目标通过代理;“全局代理”指进入内核的流量统一走代理出口。它们都不能保证应用流量已经被接管。公司内网、打印机和家庭存储等需求,应单独检查,避免切换方案后失去访问。
| 方案 | 规则安排 | 验证重点 |
|---|---|---|
| 绕过大陆 | 自定义例外 → 局域网直连 → 国内域名/IP 直连 → 代理兜底 | 国内业务走 direct,其他测试目标走 proxy |
| 全局代理 | 按需保留局域网例外,其余 TCP/UDP 指向 proxy | 是否仍有先命中的直连规则,以及应用是否进入内核 |
| 自定义直连 | 把指定 full/domain 规则置顶,再保留原有分流 | 主域名、登录域名和资源域名是否需要分别处理 |
要让一个业务站点直连,不一定只加一个主域名就够。登录、接口和静态文件可能属于不同域名。先从日志确认实际请求,再逐个添加必要域名,不要为省事把共享 CDN 的整个地址范围设为直连,那样可能影响其他无关网站。
-
保存当前方案
先记录当前路由名称并备份规则。确认节点可用,保留一份未修改的配置,方便失败后恢复。
-
打开路由设置
在提供此入口的 v2rayN 桌面界面中,进入「设置」→「路由设置」。不同界面可能把入口放在主界面的「路由」菜单,需以当前安装包显示名称为准。
-
编辑目标规则
选中要使用的路由方案,打开规则编辑窗口。新增 domain 条目,例如
domain:example.com,出口选择直连;若界面将前缀和内容分成两栏,应分别选择类型与填写域名。 -
调整规则位置
将例外规则移动到国内分类及兜底规则之前。域名规则和 IP 规则分开添加,保存后在主界面的「路由」选择器中启用该方案。
-
重建连接验证
等待配置重新加载,必要时重启内核。关闭原有网页连接后重新访问,查看新连接日志中的目标和出口;不要用已经建立的长连接判断新规则是否生效。
验证分流:端口、日志和出口交叉检查
网页能打开只能说明某条路径可用,不能证明走了预期出口。建议选一个应直连的目标、一个应代理的目标,再加一个局域网地址分别测试。查看日志时关注目标域名或 IP、所选出站标签和错误信息;日志级别过低时,可以临时提高,测试结束后再恢复。
下面的命令强制请求进入本地 HTTP 代理,示例假设该 HTTP 或混合入站监听 127.0.0.1:10808。先在客户端确认实际协议和端口;若该端口只有 SOCKS 服务,不能照搬 HTTP 代理参数。命令仅演示请求方式,不代表目标网站必须采用某种分流策略。
curl --proxy http://127.0.0.1:10808 --connect-timeout 10 --max-time 20 -I https://example.com/
- 连接被拒绝:先查本地端口是否监听、内核是否运行。此时通常还没有进入路由匹配阶段。
- 进入了错误出口:检查选中的路由方案、上方提前命中的规则,以及当前内核是否加载了最新配置。
- 出口正确但访问超时:继续查节点可达性、目标服务状态及 DNS,不要反复堆叠同类路由规则。
- 浏览器与命令结果不同:核对浏览器独立代理、已有连接、DNS 缓存和 TUN 接管范围。
路由规则常见问题
加了 domain 规则,为什么还是走代理?
先确认规则填的是域名,不含协议和路径;再把规则移动到通用规则之前,确认当前方案已启用。若日志只显示目标 IP,检查应用是否在进入内核前完成解析,以及当前入站能否提供目标域名。
geosite:cn 和 geoip:cn 必须同时添加吗?
不属于语法上的强制要求,但两者覆盖的输入不同:前者适合已知域名,后者适合目标 IP 或解析后的地址。需要联合覆盖时分成两条规则,并核对 domainStrategy,不能认为加上分类名就一定触发解析。
更新订阅后,自定义直连规则会消失吗?
节点订阅与客户端路由配置通常分开管理,但完整配置导入、恢复设置或覆盖路由方案可能改动规则。先备份自定义方案,并避免直接编辑运行时生成的临时配置文件。
Android 能直接复制桌面规则吗?
可以复用域名、CIDR 和规则优先级的思路,但不能直接复制整份桌面配置。v2rayNG 与 v2flyNG 的资源文件、出站标签和自定义规则入口需要分别核对;保存后重新建立连接,再按日志验证实际出口。