国内外分流配置

以「大陆网站直连、境外网站走代理、广告域名阻断」为目标,一步步在 v2rayN 里配置路由规则集,并讲解规则顺序与域名策略的取舍。

本文速览

适合已经导入节点、代理连接可用,但还没有整理分流规则的用户。下面以桌面 v2rayN 的 Xray 内核为范围,建立三类出站、六条基础规则,分别检查系统代理入口、规则顺序和域名解析条件。最终配置采用国内分类直连、其他请求代理的保守策略;广告分类独立置顶,误拦截时可以单独停用。

一、先确认请求进入哪个入口

分流不是按照浏览器界面里的网址自动判断“国内外”,而是内核根据收到的目标域名、目标 IP、端口等信息匹配规则。请求没有进入 v2rayN 的本地入站,就不会执行本文的路由。系统代理通常只影响遵循系统代理设置的应用;自行直连的程序,需要单独配置代理,或另行使用 Tun 接管。

应用请求本地入站规则匹配出站选择目标服务

本文以 v2rayN 7.x 桌面界面的设置分组为参考,先使用系统代理验证,不同时开启 Tun。不同小版本的按钮位置可能调整,进入「设置」→「参数设置」确认本地监听端口,进入「设置」→「路由设置」管理规则集。若当前客户端启用了其他内核,应先切换到 Xray 并确认节点仍可连接,再应用下面的 Xray 规则示例。

  1. 选择一个已验证可用的服务器,设为活动服务器;先排除节点连接本身失败的问题。
  2. 记录本地 HTTP 或混合入站的实际端口,不把 SOCKS 专用端口当作 HTTP 代理端口。
  3. 在托盘菜单「系统代理」中选择「自动配置系统代理」,并确认浏览器没有扩展覆盖系统代理。
  4. 备份当前路由规则集,复制出一份测试规则。暂时关闭其他代理软件,避免入口被改写。
3 类
直连、代理、阻断出站
6 条
本文基础规则数量
10808
验证命令使用的示例端口

这里的 10808 是后文命令的演示值,不是要求修改成这个数字,也不代表每份安装的默认端口。只有当「参数设置」显示该端口接受 HTTP 或混合代理请求时,才可原样执行命令。

二、建立直连、代理、阻断三类出口

v2rayN 负责把活动服务器和界面设置组合成内核配置。通常可以在规则的出站选项中选择 direct、proxy、block。它们是生成配置中的标签,不是节点协议名;VMess 或 VLESS 节点都可以成为代理出站,路由不需要因此改写成另一套语法。

连接出口

直连标签
direct
代理标签
proxy
代理目标
当前活动服务器
使用范围
国内分类直连,其他请求代理

直连仍需经过本机网络访问目标;路由命中不等于目标一定可达。

阻断与兜底

阻断标签
block
阻断分类
geosite:category-ads-all
兜底出口
proxy
兜底网络
tcp,udp

阻断只处理命中的请求,不能按网页画面识别所有广告内容。

在「设置」→「路由设置」中新建测试规则集,添加规则时分别填写域名、IP、网络和出站标签。保存后还要把该规则集设为当前使用项;只完成编辑、不切换活动规则集,访问结果不会随之改变。若界面显示的标签与本文不同,以当前生成配置中的 outbounds[].tag 为准,不能引用不存在的标签。

三、按六条顺序组合分流规则

Xray 路由采用从上到下、首个匹配生效的逻辑。同一条规则里同时填写域名和端口,表示这些字段需要同时满足;同一个域名列表中的多个条目则是任选一个命中。不要把所有域名、IP 和端口塞进同一条规则,否则很容易把原本的“或者”误写成“并且”。

顺序匹配条件出站用途
1geosite:category-ads-allblock先拦截广告分类域名
2geoip:privatedirect内网、回环等私有地址直连
3geosite:cndirect国内域名分类直连
4geoip:cndirect已知目标 IP 属于国内地址时直连
5full:example.comproxy演示精确域名代理规则
6network: tcp,udpproxy剩余请求统一代理

第 5 条使用文档示例域名,目的是便于验证精确匹配,日常运行可以删除。若要让某个已经被前面分类收录的网站强制走代理,必须把它的专用规则移到对应分类规则之前。规则越“具体”不会自动获得更高优先级,位置才决定先后。

下面是对应的 Xray routing 配置片段。它用于核对字段含义,不是可以直接启动的完整配置,也不是 v2rayN 图形界面规则导入格式。使用界面导入功能时,应先查看当前版本导出的规则结构,不能把这个片段当作完整规则文件导入。

{
  "routing": {
    "domainStrategy": "AsIs",
    "rules": [
      {
        "type": "field",
        "domain": ["geosite:category-ads-all"],
        "outboundTag": "block"
      },
      {
        "type": "field",
        "ip": ["geoip:private"],
        "outboundTag": "direct"
      },
      {
        "type": "field",
        "domain": ["geosite:cn"],
        "outboundTag": "direct"
      },
      {
        "type": "field",
        "ip": ["geoip:cn"],
        "outboundTag": "direct"
      },
      {
        "type": "field",
        "domain": ["full:example.com"],
        "outboundTag": "proxy"
      },
      {
        "type": "field",
        "network": "tcp,udp",
        "outboundTag": "proxy"
      }
    ]
  }
}

geosite:cn 是域名分类,不是实时检测网站服务器地理位置;geoip:cn 是 IP 地址集合,也不能代表网站运营主体所在地。跨境 CDN、境外托管的国内网站都可能与直觉不同。发现个别网站路线不合适时,添加域名例外比反复修改整套分类更可控。

四、选择 AsIs,避免兜底规则掩盖解析条件

本例明确使用 AsIs:不为了路由匹配主动解析域名。请求携带域名时主要按域名规则判断;请求本来就携带 IP 时,IP 规则可以直接参与匹配。因此,上面第 4 条并不意味着所有未分类域名都会先解析,再按国内 IP 直连。

结论:保留全匹配兜底时,先用 AsIs

最后的 tcp,udp 规则在域名阶段也能命中,可能使 IPIfNonMatch 的“无匹配后解析”没有触发机会。需要依赖 IP 补充分流时,应重新设计兜底方式或评估 IPOnDemand,不能只更改一个策略名称就认定已经生效。

路由的域名策略与 DNS 查询走哪条出口是两个问题。选择 AsIs 不代表系统没有 DNS 查询,也不代表所有解析都通过代理完成。应用提前把域名解析成 IP、代理协议把域名交给远端、内核为直连目标解析,都会形成不同的解析路径。先确认请求进入内核时携带的是域名还是 IP,再讨论某条域名规则为什么没有命中。

五、逐类验证,不只看出口地址

保存规则集并启用后,先观察内核能否正常启动。出现找不到域名分类、读取 geo 数据失败等报错,应通过客户端提供的数据更新功能更新匹配当前内核的数据文件,随后重启内核。没有启动成功时,浏览器缓存或残留系统代理状态可能制造“部分可用”的假象。

  1. 验证代理:使用下面的命令请求示例域名,查看访问日志中是否出现代理出站标签。若端口不是 10808,先替换为界面里的实际 HTTP 或混合端口。
  2. 验证直连:选择一个确认包含在当前 geosite:cn 数据中的域名,记录域名、时间和出站标签。网站能打开,只能说明请求成功,不能单独证明走了直连。
  3. 验证阻断:从当前广告分类中选一个已知条目,检查日志是否走 block。测试时可临时把 full:example.com 的独立规则移至顶部并改为阻断,以验证阻断机制,完成后恢复。
  4. 验证兜底:使用未被前面规则覆盖的目标,确认仍走代理。若 UDP 业务失败,还需确认节点和传输方式支持相关 UDP 转发。
curl --proxy http://127.0.0.1:10808 --connect-timeout 10 --max-time 20 -I https://example.com/

命令中的 10 秒是连接超时上限,20 秒是整次请求的总时限,并非实测延迟。返回 HTTP 状态表示请求有响应;连接被关闭也不一定就是阻断命中,需要结合日志判断。部分网站不支持 HEAD 请求,此时可以改用普通 GET,再比较路由结果。

六、常见分流问题与修正步骤

国内网站还是走代理,哪里没有设对?

先看当前启用的是否为刚编辑的规则集,再检查代理兜底有没有排到国内规则上方。若顺序正确,确认内核收到的是域名还是 IP,并检查当前 geosite 数据是否包含该域名。确有直连需求时,把 domain: 域名例外放在兜底之前,不要直接把所有未知请求改为直连。

开了广告阻断后,登录页面加载不完整怎么办?

先临时停用广告分类规则并重试,确认故障是否随之消失。若确属误拦截,从日志找出登录、验证码或静态资源域名,为它添加直连或代理例外,并移到广告阻断之前。不要仅凭页面空白就大范围放行整个域名后缀。

浏览器能分流,另一个程序却不生效?

检查该程序是否遵循系统代理。支持手动设置时,填入 127.0.0.1 和实际监听端口,并选择匹配的 HTTP 或 SOCKS 类型。只有需要接管不遵循代理设置的流量时,再单独验证 Tun;启用前先确认系统权限与内网访问需求。

订阅更新后,自己写的分流会被覆盖吗?

节点订阅与本地路由规则集是不同配置对象,普通节点更新通常不改写独立保存的路由。但导入整份客户端配置、更新远程路由规则集可能改变规则内容。把个人例外保存在可维护的本地规则集中,更新后重新检查活动规则集、顺序和出口标签。

一套可维护的分流配置应能解释每条规则的用途:需要阻断的先处理,内网和国内分类按条件直连,特殊域名单独覆盖,其余请求明确代理。先把这条基线验证完整,再增加游戏、下载或工作服务的专用规则,出现问题时才能定位到具体变更。

客户端下载