本文速览

适合已经导入节点、能够通过代理访问网页,但需要调整大陆直连与境外代理规则的用户。本文以 V2Ray/Xray 的路由字段为例,说明域名库、IP 库、匹配顺序和默认出站的关系,再把配置映射到 v2rayN 的路由设置。完成后可以用日志区分规则未命中、DNS 解析错误与请求根本没有进入内核三类问题。

一、路由分流先看请求是否进入内核

路由规则只处理进入代理内核的连接。浏览器没有使用系统代理,或者某个应用自行直连时,修改 geosite:cn 不会改变这些请求的路径。先在 v2rayN 主窗口选择「系统代理」→「自动配置系统代理」,再确认浏览器没有用独立的代理扩展覆盖系统设置。

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

端口以当前客户端显示值为准。例如,本地混合监听端口为 10808 时,手工配置的应用应连接 127.0.0.1:10808;不能把节点服务器的远程端口填成本地代理端口。在「设置」→「参数设置」核对监听端口后,先用一个已知可用节点完成访问测试,再改分流。

二、geosite 匹配域名,geoip 匹配目标 IP

geosite:cn 引用域名分类库中的 cn 集合;geoip:cn 引用 IP 数据库中的中国大陆地址集合。二者不是相同规则的两种写法,也不能只凭域名后缀判断分类结果。域名集合依赖所用数据文件,更新数据可能改变个别站点的命中情况。

规则内容放置字段实际用途
geosite:cndomain按域名库匹配大陆相关域名,不要求先解析 IP。
geoip:cnip按目标 IP 归属匹配,处理 IP 连接或解析后的地址。
geoip:privateip匹配库内的私有及特殊用途地址,常用于本地网络直连。
geosite:category-ads-alldomain匹配广告域名集合,需确认当前域名库包含该集合。
domain:example.comdomain匹配该域名及其子域名,用于手工例外规则。
full:example.comdomain只匹配完整域名,不扩展到其他子域名。

同一条规则中的 domain 数组内,多个条目通常是“任意一个匹配即可”;但把 domain 与 ip 同时放入一条规则,会要求不同字段的条件共同成立。要表达“大陆域名或大陆 IP 都直连”,应拆成两条规则,而不是塞进同一个规则对象。

三、domainStrategy 决定何时为路由解析域名

routing.domainStrategy 控制路由阶段是否把域名解析为 IP。它不是“所有 DNS 请求走代理”的开关,也不同于出站自身的域名解析策略。本文选择 IPIfNonMatch:先尝试域名等条件,未找到匹配规则时,再解析目标域名并尝试 IP 规则。

AsIs:按已有目标匹配

字段
domainStrategy
取值
AsIs
路由解析
不为匹配 IP 规则主动解析域名
适用情况
主要依赖域名规则,或入站已有目标 IP

域名请求未命中时,不会仅因存在 geoip 规则就自动查询地址。

IPIfNonMatch:未命中再解析

字段
domainStrategy
取值
IPIfNonMatch
路由解析
首轮没有规则匹配时触发
适用情况
域名优先、IP 分类补充

首轮若已命中全流量兜底规则,就没有机会触发这次补充解析。

另一个常见值 IPOnDemand 会在匹配遇到需要 IP 的条件时触发解析,因此前置 IP 规则可能增加 DNS 查询。它适合明确需要尽早比较地址的配置,但不能直接理解为“更严格的国内分流”。应结合 DNS 可达性与规则排列选择,而不是只看名字。

配置判断:IPIfNonMatch 不要叠加无条件兜底规则

使用本文方案时,删除末尾覆盖全部 TCP/UDP 的代理规则,转而确认默认出站是代理。否则首轮就会命中兜底,未收录的大陆域名可能无法进入 geoip 补充分流。

四、大陆直连、境外代理与广告拦截组合

下面是路由片段,不是可直接运行的完整客户端配置。它假定现有配置已经定义 proxy、direct、block 三个出站标签,并且 outbounds 数组的第一个出站是代理。V2Ray/Xray 在没有路由规则匹配时使用第一个出站,因此“境外代理”在这里由默认出站承担,不靠末尾的全匹配规则实现。

{
  "routing": {
    "domainStrategy": "IPIfNonMatch",
    "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"
      }
    ]
  }
}
  1. 广告域名先匹配:命中 category-ads-all 后交给拒绝出站,不再继续查看后续直连规则。
  2. 本地 IP 直连:访问 192.168.1.1 等私有地址时,目标本来就是 IP,可以直接命中私有地址规则。
  3. 大陆域名直连:已收录在 geosite:cn 的域名直接选中直连出站,不必等 IP 分类。
  4. 大陆 IP 补充:域名首轮未命中时,使用内核 DNS 得到地址后再尝试 geoip:cn。
  5. 其余走默认代理:域名和 IP 都未命中时,落到已确认的第一个代理出站。

“从上到下首次命中”还需要结合解析阶段理解:对于仅有域名的请求,IPIfNonMatch 不会为了排在前面的私有 IP 规则立即解析。如果域名首轮已经命中其他规则,后续不会再靠解析结果改判。因此,内网域名也应添加明确的域名直连规则,而不是只依赖 geoip:private。

五、在 v2rayN 中建立并启用路由配置

先备份现有路由,再进入「设置」→「路由设置」。不同版本的编辑窗口布局可能不同,应以当前窗口中的「域名策略」「规则列表」和出站选择为准。不要把上面的完整 routing 对象粘贴进只接收规则数组的输入框,也不要直接修改运行时生成、重启后会被覆盖的配置文件。

  1. 建立单独的测试配置:在「设置」→「路由设置」中新增或复制一份路由配置,使用能区分用途的备注,例如“大陆直连测试”。保留原配置,便于恢复。
  2. 设置域名策略:把「域名策略」设为 IPIfNonMatch。如果编辑器展示英文值,按原样选择,不要把该值写入某一条域名规则。
  3. 逐条录入规则:按照广告域名、私有 IP、大陆域名、大陆 IP 的顺序添加。域名集合填入域名条件,IP 集合填入 IP 条件;出站分别选拒绝或直连。
  4. 核对默认代理:检查是否有覆盖全部流量的末尾规则。对本文方案,应确认生成配置的首个出站为代理,而不是通过新增全匹配规则来兜底。
  5. 保存并切换生效:回到主窗口,在「路由」选择刚才的配置。确认内核已重新加载;若日志出现配置错误,应恢复原配置并逐条检查。

v2rayN 的普通节点配置会生成内核所需的出站。界面里的“代理、直连、阻止”与 JSON 标签之间存在映射,不能只看中文显示名就假定最终标签一定是 proxy、direct、block。使用自定义完整配置时,需要自行保证标签和默认出站顺序;使用图形规则编辑器时,优先选择其已有出站选项。

界面操作目标配置核对点错误表现
选择域名策略routing.domainStrategy 为 IPIfNonMatch仍为 AsIs 时,域名不会因 IP 补充规则主动解析。
添加域名分类domain 中包含 geosite:cn误填到 IP 条件可能导致配置无法加载。
添加地址分类ip 中包含 geoip:private误填到域名条件不能按目标地址分流。
选择代理兜底首个出站为代理,且首轮没有全匹配规则截走请求境外目标直连,或大陆 IP 补充分流不触发。

六、用固定请求和日志验证命中结果

验证分流不能只比较网页打开速度。缓存、连接复用和节点负载都会改变耗时,但不能证明选中了哪个出站。应固定本地入口与测试目标,在 v2rayN 日志窗口观察目标地址及出站标签。若当前日志级别看不到连接记录,可在「设置」→「参数设置」中查找日志级别选项,临时使用 info,验证后恢复原值。

下面使用 Windows 的 curl.exe 显式连接本地 HTTP 代理,排除浏览器扩展和系统代理状态的影响。10808 只是端口示例,必须改成当前实际支持 HTTP 的监听端口;--max-time 15 表示最多等待 15 秒,不代表实际测速结果。

curl.exe --proxy http://127.0.0.1:10808 --max-time 15 -I https://www.baidu.com/
curl.exe --proxy http://127.0.0.1:10808 --max-time 15 -I https://example.com/

排查顺序:先确认出站,再处理访问失败

日志已经显示正确出站时,继续检查该路径的 DNS、连接与服务响应;日志显示错误出站时,再回到规则顺序和分类数据。每次只改一条规则并重新建立连接,避免缓存与旧连接混淆结果。

七、常见问题:规则生效但结果不符合预期

加了 geosite:cn,国内网站怎么还走代理?

先在主窗口「路由」确认选中的是刚保存的配置,再检查前面是否有代理规则提前命中。若日志中的目标是 IP 而不是域名,域名集合无法直接判断该连接,应检查 IP 规则;若目标仍是域名,则核对当前数据文件是否收录该站点。

末尾已经写了全部走代理,为什么 geoip:cn 没起作用?

使用 IPIfNonMatch 时,全匹配代理规则会在首轮接住请求,内核不再触发“未命中后解析”。删除该兜底规则,并确认第一个出站确实是代理,再用新连接复测。若必须保留兜底规则,应重新设计解析策略,而不是只移动 geoip 规则。

只开 geoip:private,为什么内网域名还是打不开?

内网名称必须先能被合适的 DNS 解析,而且不能被其他域名规则提前代理。为实际使用的内网后缀添加明确的域名直连条件,并检查对应 DNS 是否可达。直连规则不会自动让公共 DNS 认识单位内部的主机名。

开了流量探测,就一定能按域名分流吗?

不能。流量探测只能从部分协议握手中提取域名信息,是否用于路由还取决于入站的探测设置;不是所有连接都能还原域名。先确认入站原本收到的是域名还是 IP,再决定是否需要调整探测,不要把探测当作 DNS 修复选项。

广告拦截后登录或支付页面异常怎么办?

先临时停用广告规则复测,确认是否误拦。若确实是分类问题,为必要域名添加范围尽量小的例外规则,并放到广告规则之前。该例外应按业务需要选择代理或直连,不要为了恢复一个资源就把整个站点的全部子域名都放行。

最终保留一套可以解释的规则:必要例外在前,广告拦截随后,私有地址与大陆域名直连,IP 分类补充,默认出站代理。DNS 解析得到的地址仍会影响 IP 匹配结果;解析被干扰时,正确的规则也可能做出错误分类。完成路由验证后,再单独检查 DNS,避免同时修改入口、解析和出站而失去对照。