本文适合已能通过节点访问网络、准备在 v2rayN 中调整分流的用户。先区分域名集合与 IP 集合,再确定路由解析策略、出口标签和规则顺序,最后通过日志验证国内直连、私网访问与广告拦截。文中的 JSON 是内核配置片段,不是可以直接导入的完整节点配置。
一、分流前先确认流量与出口
路由分流发生在流量进入内核之后。应用没有使用系统代理,或者只接入了未被当前代理模式覆盖的连接时,修改规则不会影响它。先选择一个可用节点,确认浏览器使用 v2rayN 提供的本地代理,再开始调整路由。系统代理主要服务于遵循系统代理设置的应用,不等于接管整台设备的所有连接。
规则中的 outboundTag 是出口标识,不是协议名称。本文约定 proxy 指向已配置好的节点,direct 指向 freedom 直连出口,block 指向 blackhole 拦截出口。标签区分大小写,必须与实际配置保持一致。
二、geosite 与 geoip 的匹配对象
geosite:cn 表示域名集合,适合识别已归类的国内站点;geoip:cn 表示 IP 地址段集合,适合处理直接访问 IP 或需要按解析结果补充分流的连接。二者都是规则数据,不代表对网站业务、实际机房位置或访问质量的实时判断。国内域名可能使用海外基础设施,海外服务也可能解析到国内地址。
域名集合规则
- 字段
domain- 国内集合
geosite:cn- 广告集合
geosite:category-ads-all- 数据文件
geosite.dat
需要目标域名可供路由判断,并且数据文件包含指定分类。
IP 集合规则
- 字段
ip- 国内集合
geoip:cn- 私网集合
geoip:private- 数据文件
geoip.dat
目标为 IP 时可直接匹配;目标为域名时,是否解析取决于路由策略。
同一条规则同时写入 domain 和 ip,不是表达“域名或 IP 命中即可”。不同条件字段通常需要同时满足;同一个数组中的多个条目才是候选匹配项。为了避免误解,应把国内域名和国内 IP 拆成两条规则。
domain:example.com可用于匹配该域名及其子域名;它与整串精确匹配的full:example.com用途不同。192.168.1.1这样的私网目标应优先考虑直连,但应用仍需确实把连接交给内核。- 使用前确认当前地理数据包含
cn、private与广告分类。分类缺失可能导致配置加载失败,不能仅靠调整规则顺序修复。
三、domainStrategy 如何影响国内 IP 补充规则
domainStrategy 写在 routing 对象内,与 rules 并列。它控制路由判断时是否把域名解析为 IP,不负责决定应用是否走代理,也不等同于完整的 DNS 配置。名称相似的出站解析设置属于不同作用域,不能相互替代。
AsIs
按收到的目标形式进行路由,不为了 IP 规则主动解析域名。目标原本就是 IP 时,仍可参与 IP 规则匹配。
适合:主要依赖域名列表,希望减少路由阶段解析的方案。
IPIfNonMatch
推荐域名在首轮规则判断中未匹配时,再尝试解析并参与 IP 规则判断。本文用它保留域名规则优先、国内 IP 补充的逻辑。
适合:国内域名直连,同时补充国内 IP 识别的日常分流。
IPOnDemand
路由判断遇到需要 IP 的规则时就尝试解析域名。IP 规则放置位置会更直接地影响解析时机与最终去向。
适合:明确需要较早参与 IP 判断,并已设计好 DNS 与规则顺序的配置。
四、按广告、国内域名、私网、国内 IP 排序
规则自上而下判断,首先命中的规则决定出口。将广告分类放在国内域名前面,是为了避免某些已归入国内集合的广告域名先被放行;随后处理国内域名、私网 IP 和国内 IP,其余连接回落到代理出口。下面只展示 routing 片段,必须合并到已有的完整配置中。
{
"routing": {
"domainStrategy": "IPIfNonMatch",
"rules": [
{
"type": "field",
"domain": ["geosite:category-ads-all"],
"outboundTag": "block"
},
{
"type": "field",
"domain": ["geosite:cn"],
"outboundTag": "direct"
},
{
"type": "field",
"ip": ["geoip:private"],
"outboundTag": "direct"
},
{
"type": "field",
"ip": ["geoip:cn"],
"outboundTag": "direct"
}
]
}
}
上述规则要求已经存在对应出口。保留原有节点的认证、传输和安全设置,并将其出口标签设为 proxy;不要为了套用示例重新编写节点参数。下列两个对象仅用于展示直连与拦截出口的定义,应放进现有的 outbounds 数组,并位于代理出口之后。
[
{
"tag": "direct",
"protocol": "freedom",
"settings": {}
},
{
"tag": "block",
"protocol": "blackhole",
"settings": {}
}
]
- 需要放行被误拦截的域名时,将精确的直连例外放在广告规则之前,不要直接删除全部广告分类。
- 广告域名拦截不能消除所有页面广告。同域名内容、应用内置资源和未被数据收录的地址可能无法区分。
- 若某个海外服务解析到国内 IP,最后一条国内 IP 规则可能让它直连。需要强制代理时,应把该服务的域名代理规则放在国内规则之前。
五、在 v2rayN 中落地并检查生成配置
v2rayN 的路由编辑界面负责生成内核配置,订阅则主要提供节点信息,两者不要混为一谈。桌面不同发行版本的标签可能略有变化,下面按具有「设置」→「路由设置」入口的界面说明;若界面不同,应以最终生成的 routing 和 outbounds 为核对依据。
-
备份现有规则
进入「设置」→「路由设置」,先保存现有规则内容或导出当前配置,记录正在使用的路由方案,避免直接覆盖已有的工作例外。
-
建立独立方案
在「路由设置」中新建或复制一个路由方案。将域名策略设置为
IPIfNonMatch,逐条添加广告、国内域名、私网和国内 IP 规则,不要把完整内核 JSON 粘到单条规则的域名输入框。 -
检查出口对应
逐条确认规则使用的代理、直连和阻断出口。界面可能显示中文选项,但生成配置的
outboundTag必须能找到实际出口定义;同时检查默认出口是否为所选节点。 -
启用并重载
保存后将新方案设为活动路由,再重启服务或重新启动内核。仅保存方案而未启用时,原来的分流仍可能继续生效。
-
核对代理入口
在「设置」→「参数设置」中核对本地监听端口。本文使用
127.0.0.1:10808作为测试入口示例,实际端口与入站协议必须以当前配置为准,再通过托盘菜单确认系统代理状态。
六、用日志区分规则问题与 DNS 问题
测试时一次只改变一个条件。先访问一个已确认归入国内集合的域名,再访问一个不在国内集合中的域名,最后测试需要访问的私网地址。临时启用访问日志;必要时提高错误日志的详细程度,观察目标地址与最终出口标签,验证结束后恢复常用日志级别。
验证方案:先判断命中,再排查解析
域名规则验证
- 国内集合域名应显示
direct出口。 - 广告集合中的测试域名应显示
block。 - 若日志只有 IP,检查应用是否已自行解析域名。
- 关闭旧连接并重新发起请求,避免复用连接干扰判断。
IP 与默认出口验证
- 确认私网目标由
direct处理。 - 查看未命中域名集合时的解析结果。
- 国内 IP 补充命中应进入
direct。 - 其余连接应使用首个代理出口,而非意外直连。
日志显示的出口比网页能否打开更能说明规则是否生效;连通性还取决于 DNS、节点和目标服务。
当应用提前把域名解析为 IP,再把 IP 交给本地代理时,geosite 无法直接获得原始域名。入站嗅探可在部分 HTTP 或 TLS 流量中恢复可识别的域名信息,但不能保证覆盖所有协议和加密形式。开启前应了解当前内核的嗅探配置,不要把它当作 DNS 设置的替代品。
- 内核启动即报错:先检查 JSON 语法、出口标签与地理数据分类是否存在;此时不是网络速度问题。
- 国内站点仍走代理:检查域名是否在集合中、入站是否保留域名,以及是否有更靠前的代理规则。
- 海外站点意外直连:查看是否命中
geoip:cn,必要时添加优先级更高的域名代理例外。 - 修改后毫无变化:确认活动路由方案、内核重载状态与应用代理入口,再检查旧连接和应用缓存。
DNS 配置也需要单独设计:用于路由判断的解析请求不一定自动通过代理发送。若解析结果异常,先核对内核使用的 DNS 服务器及其连接路径,再判断是否保留国内 IP 补充规则。分享排错日志时,应先移除订阅地址、认证信息和个人访问记录。