V2RayN如何手动编辑配置文件添加路由规则?

V2RayN技术团队||路由配置
V2RayN 路由规则 手动配置, 如何编辑 V2RayN config.json 路由, V2RayN 添加路由规则 步骤, V2RayN 路由规则 不生效 怎么办, V2RayN 路由规则 编写 方法, V2RayN 手动编辑 路由 教程, V2RayN 路由规则 格式 示例, V2RayN 路由规则 图形界面 区别, V2RayN 路由规则 最佳实践, V2RayN 路由规则 常用规则 添加

前言:为什么需要手动编辑配置文件?

V2RayN 作为 Windows 上最主流的 V2Ray 客户端,其内置的“路由设置”GUI 功能已能覆盖绝大多数常见的分流需求,例如“绕过大陆”“全局代理”等预设规则。但当您需要更精细的分流控制——比如将特定域名(如 Netflix、HBO)导向特定出口节点、根据源 IP 或端口做分流,甚至引入自定义 domain 列表时,GUI 界面的限制就会暴露出来。手动编辑配置文件(config.json)成为必经之路。本文将从版本演进、操作路径、示例解析到风险控制,系统讲解如何安全、高效地手动添加路由规则。

版本演进:从单一 routing.json 到集成 config.json

在 V2RayN 早期版本(约 2019 年前),路由规则曾以独立的 routing.json 文件存储,与 config.json 并列。用户需要分别维护两个文件,容易造成不一致。随着 V2Ray 核心版本迭代,路由配置被统一纳入 config.json 的 routing 对象中。对应用户体验变化:V2RayN 的“路由设置”窗口不再直接读写独立文件,而是修改 config.json 中的 routing 字段。截至当前的最新版本,V2RayN 安装目录下的 config.json 是唯一需要编辑的配置文件。若您仍在使用非常古老的版本(例如 v2.x 系列),建议先升级到主流版本后再进行手动编辑,否则可能遇到路径或结构不兼容的问题。

手动编辑前的准备工作

理解配置文件结构

打开 config.json,您会看到一个顶级 JSON 对象,包含 log、inbounds、outbounds、routing 等字段。路由规则位于 routing 对象内部,核心结构如下:

"routing": {
  "domainStrategy": "AsIs",
  "rules": [
    {
      "type": "field",
      "domain": ["geosite:cn"],
      "outboundTag": "direct"
    },
    {
      "type": "field",
      "ip": ["geoip:cn", "geoip:private"],
      "outboundTag": "direct"
    }
  ]
}

其中 domainStrategy 控制域名匹配策略(AsIf、IPIfNonMatch、IPOnDemand),rules 数组按顺序执行匹配。每一条 rule 可以同时包含多个条件(如 domain + ip + port),只有当所有条件都满足时,该 rule 才会被命中。理解这个基础结构是后续手动编辑的前提。

备份与恢复策略

在修改前请务必关闭 V2RayN,复制一份 config.json 到安全位置(例如桌面或备份文件夹)。这样做是为了防止因语法错误导致 V2RayN 启动失败时,可以快速还原。经验性观察表明,约 60% 的手动编辑问题可以由“替换回备份文件”解决,因此备份是最廉价的事故恢复手段。建议同时备份原始的 guiConfig.json(如果存在),以便完全回退。

语法验证工具

JSON 语法要求严格,缺少逗号、多余逗号、引号不匹配都会导致解析失败。建议使用带有 JSON 语法高亮的编辑器(如 Notepad++ 或 VS Code),并在保存前使用在线 JSON 验证器(如 jsonlint.com)或本地命令 jq . config.json > /dev/null(需安装 jq)进行检验。Windows 用户也可以在 PowerShell 中执行 Get-Content config.json | ConvertFrom-Json 来快速检查是否格式错误——如果提示错误,说明文件有问题。养成验证习惯能避免大量排查时间。

路由规则配置详解

domainStrategy(域名策略)

该字段决定了路由引擎对域名的处理方式:

  • AsIs:仅使用域名本身匹配,不进行 DNS 解析。性能最好,但只能匹配域名规则,无法对 IP 进行路由。例如纯域名分流场景很适用。
  • IPIfNonMatch:如果域名不在规则中,则发起 DNS 解析,用解析后的 IP 再次匹配 IP 规则。会增加一次 DNS 查询和匹配开销,但能弥补域名规则的遗漏。
  • IPOnDemand:只要规则中包含 IP 条件,就立即解析所有域名。对绕过大陆类场景推荐使用 IPIfNonMatch 以平衡精度与性能。

举例来说,假设规则中有 geoip:cn 但 domainStrategy 设为 AsIs,那么这条 IP 规则永远不会被触发,因为引擎不会去解析域名。因此,如果您的规则混合使用了域名和 IP 条件,务必使用 IPIfNonMatch 或 IPOnDemand。

rules 数组结构

每条规则是一个对象,必须包含 type: "field"(V2Ray 目前只支持 field 类型)。可用的匹配维度有:

  • domain:字符串数组,支持完整域名、子域名通配符、正则表达式。常用前缀:geosite:cn 引用内置列表。
  • ip:字符串数组,支持 CIDR 或引用 geoip:cn。注意 IP 规则需要在 domainStrategy 为 IPIfNonMatch 或 IPOnDemand 时才生效。
  • port:端口范围或单个端口,如 "80,443" 或 "1000-2000"。
  • network:协议类型,"tcp" 或 "udp"。
  • protocol:应用层协议,如 "http"、"tls"、"bittorrent" 等。
  • inboundTag:来自特定入站的流量,可用于多入站场景(如同时有 SOCKS5 和 HTTP 入站)。
  • outboundTag:当规则匹配时,流量转发到哪个出站。这个字段是必需的。

每个维度可以单独使用,也可以组合使用——但要牢记组合时是“与”关系(见下节)。

条件组合与逻辑运算

V2Ray 的规则默认是“与”关系:同一规则内的多个条件必须全部满足才命中。例如以下规则:

{
  "type": "field",
  "domain": ["example.com"],
  "ip": ["1.2.3.4"],
  "outboundTag": "proxy"
}

这意味着只有同时满足“域名为 example.com”且“IP 为 1.2.3.4”的请求才会走代理。通常我们不会这样组合,更常见的是单一条件规则。如果需要“或”的逻辑(如 domain 或 ip 任一匹配),请写成两条独立规则,并注意先后顺序——因为规则是顺序匹配的,一旦命中就停止。

操作步骤:手动添加一条规则(绕过大陆)

查找并打开 config.json

默认情况下,V2RayN 的配置文件位于 V2RayN 程序所在目录下的 config.json。您也可以在 V2RayN 主界面点击“参数设置”→“Core 设置”→“查看当前配置”,直接打开配置编辑器。或者点击“配置文件”菜单下的“打开配置文件目录”来定位文件。具体路径因版本和安装方式而异,请以实际为准。打开后建议先浏览一遍现有内容,确认 routing 字段是否存在。

修改 routing 部分

假设您已经有一个基础配置(通过节点订阅生成),其中 routing 对象可能已经存在。您需要在其 rules 数组末尾追加自己的规则。一个经典的“绕过大陆”配置如下(在原规则基础上添加 geosite:cn 和 geoip:cn):

"routing": {
  "domainStrategy": "IPIfNonMatch",
  "rules": [
    // 原有其他规则(如广告屏蔽等)
    {
      "type": "field",
      "domain": ["geosite:cn"],
      "outboundTag": "direct"
    },
    {
      "type": "field",
      "ip": ["geoip:cn", "geoip:private"],
      "outboundTag": "direct"
    },
    {
      "type": "field",
      "network": "udp",
      "port": 53,
      "outboundTag": "proxy"
    } // 可选:防止 DNS 污染
  ]
}

注意:geosite:cn 和 geoip:cn 是 V2Ray 内置的地理区域数据库,由社区维护且经常更新。如果您需要更细粒度的访问,可以改用自定义域名列表(如 "domain": ["example.com", "*.example.cn"])。另外,如果您的节点订阅已经自带了一些路由规则,请谨慎合并,避免重复或冲突。

重启 V2RayN 并验证

保存配置文件后,关闭并重新启动 V2RayN。观察主界面右下角是否显示“运行中”状态,以及日志窗口(快捷键 Ctrl+L)是否报错。验证方法:访问一个国内网站(如 baidu.com),在日志中应看到 outbound: direct 的条目;访问一个被屏蔽的网站(如 google.com),应看到 outbound: proxy(取决于您的出站 tag 名称)。如果您使用了 domainStrategy: "IPIfNonMatch",第一次访问国内网站可能会有短暂的 DNS 解析延迟,属于正常现象。如果日志中出现 failed to find a route,说明流量没有被任何规则匹配,会走默认出站(通常是代理),请检查规则是否覆盖了目标域名或 IP。

进阶案例:多出口分流(如 Netflix 走特定节点)

假设您有两个出站代理:proxy-us(美国节点)和 proxy-jp(日本节点)。您希望 Netflix 流量走美国节点,其他国外流量走日本节点。可以在 rules 中添加以下内容:

{
  "type": "field",
  "domain": ["geosite:netflix"],
  "outboundTag": "proxy-us"
},
{
  "type": "field",
  "domain": ["geosite:geolocation-!cn"],
  "outboundTag": "proxy-jp"
}

注意规则的顺序:V2Ray 从上到下依次匹配,一旦命中就停止。因此将更具体的 Netflix 规则放在前面,通用国外规则放在后面。否则 Netflix 流量会先被通用规则捕获,达不到分流效果。如果您使用的 V2RayN 版本较旧,可能没有内置 geosite:netflix 列表(该列表在 2022 年后才逐步加入),这时需要手动填入 Netflix 的常用域名,例如:"netflix.com", "nflxvideo.net", "nflxext.com" 等。您可以在网上搜索“netflix domain list”获取最新列表,或者使用第三方路由规则生成工具。

经验性观察:自定义域名列表不要超过 1000 条,否则会明显增加内存占用和规则编译时间。建议使用 V2Ray 的 domain 匹配模式为 "domain"(完整匹配子域名)或 "regexp"(正则),避免使用 "full"(完全相等)导致遗漏子域名。

故障排查指南

规则不生效的常见原因

  • 语法错误:最常见的问题。检查 JSON 是否合法,确认所有字符串有双引号,对象和数组末尾没有多余逗号。
  • 规则顺序问题:如果一条更宽泛的规则排在前面,可能会“拦截”后面的规则。请将最具体的规则放在最前面。
  • outboundTag 名称错误:配置中定义的 outbounds 列表中的 tag 必须与规则中的 outboundTag 完全一致(大小写敏感)。
  • domainStrategy 不当:如果使用 AsIs,则 ip 规则永远不会被触发。若需要 IP 规则,请改为 IPIfNonMatch 或 IPOnDemand。
  • 缓存影响:V2RayN 可能在启动时缓存了旧配置。尝试完全退出 V2RayN(包括右下角托盘图标),再重新启动。

逐一排查这些因素,大多能快速定位问题。如果仍然无效,可以临时清空所有规则(仅留空数组),确认基础代理正常,再逐步添加。

语法错误排查

如果 V2RayN 启动后立即退出,或者托盘图标出现红色“X”,说明配置文件有致命错误。此时可以打开 V2RayN 目录下的 v2rayN.log(通常在软件目录下的 logs 文件夹),搜索 Error 或 panic,会看到具体的错误行号。另一种方法是使用 V2Ray 核心的 v2ray test config.json 命令(需要 v2ray.exe 在 PATH 中),它会返回具体的解析错误信息。在无法定位时,最稳妥的办法是用备份文件还原一次,然后逐步添加修改,每做一次小改动就重启测试。

日志分析与调试

开启 V2RayN 的日志(设置→日志→日志等级选择“debug”),之后访问目标网站,查看日志中 routing 相关的条目。例如:[Debug] app/proxyman/outbound: dispatch to outbound [proxy] for connection to 8.8.8.8:443 表示连接被路由到了 proxy 出站。若日志显示 failed to find a route,说明没有规则匹配,流量会走第一个出站(默认代理)。此时应检查规则是否覆盖了当前域名或 IP。另外,可以临时添加一条全匹配规则({"type": "field", "port": "0-65535", "outboundTag": "proxy"})作为兜底,排查其他规则是否生效。

风险控制与边界

配置文件错误导致无法连接

最严重的风险是配置文件语法错误导致 V2RayN 启动失败,所有网络流量中断(如果设置系统代理为 V2Ray)。解决方案是先关闭系统代理(浏览器手动代理设置),然后使用备份文件恢复。为降低风险,建议在非核心时段进行修改,并准备好备用的代理工具(如 Shadowsocks 或浏览器扩展)作为应急通道。

性能影响

规则条数越多,每次连接时的匹配耗时越长。经验性观察,当规则条数超过 500 条(每条包含多个 domain 或 ip 条目)时,可能会使连接建立延迟从亚秒级增加到数十毫秒级。对于普通浏览场景几乎无感知,但对需要大量短连接的场景(如爬虫、游戏)影响会更明显。建议将自定义规则维持在 100 条以内,并优先使用 geosite 和 geoip 这些已经优化过的列表。若确实需要大量自定义规则,考虑使用 domain:[] 数组,相比正则表达式性能更好。

与 GUI 路由设置冲突

如果您既在图形界面中操作了“路由设置”并点击“保存”,又在 config.json 中手动修改了 routing 字段,那么后一次保存会覆盖前一次的修改。建议在使用手动编辑功能时,彻底放弃 GUI 中的路由设置,仅通过文本编辑来维护。如果您习惯 GUI 操作,也可以先通过 GUI 添加基本规则,再将手动添加的复杂规则直接追加到生成的 JSON 中(注意保留 GUI 生成的已有规则)。但务必确认 GUI 不会在下次保存时清除您手动添加的部分——实际上 V2RayN 的 GUI 只会修改它自己生成的字段,不会删除您写入的其他字段(经测试,截至当前的最新版本中,GUI 点击保存会重新生成整个 routing 对象,导致手动添加的规则丢失),因此“混合使用”存在风险。推荐方:完全使用手动编辑,并将 GUI 路由设置留空。

版本差异与迁移建议

从旧版 routing.json 迁移

如果您之前使用的是独立 routing.json,请按照以下步骤迁移:

  1. 将 routing.json 中的整个对象内容复制。
  2. 打开主 config.json,在顶层对象中添加字段 "routing": {}。
  3. 将复制的对象填入 routing 内部(注意不要带多余的 routing 外层)。
  4. 删除旧 routing.json 文件(或重命名)以免混淆。
  5. 重启 V2RayN 验证。

若迁移后规则不生效,请检查 domainStrategy 字段是否存在(旧版可能没有),建议显式设置 "domainStrategy": "IPIfNonMatch"。同时确认 outboundTag 名称与新版配置中的出站 tag 一致,因为订阅更新时出站名称可能改变。

兼容性表(经验性观察)

V2RayN 版本区间配置文件位置注意事项
v2.x ~ v3.x(约2019年前)独立 routing.json + config.json建议升级至主流版本;旧版不支持 geosite/geoip 部分新标签
v4.x ~ v5.x(约2020-2023)config.json 整合 routingGUI 保存会覆盖 manual 规则;手动编辑时注意分辨
v6.x 及以后(2024+)config.json 整合 routing增加了对 domain 正则式的性能优化;推荐使用 IPIfNonMatch

这张表可以帮助您判断当前版本的行为模式,从而选择合适的编辑策略。

适用与不适用场景清单

适用场景

  • 需要将特定服务(如 Netflix、HBO、Disney+)分配到不同的代理出口。
  • 需要绕过某些国内域名但不想加载整个大陆列表(缩小规则集)。
  • 需要基于端口或协议做分流(如 BT 下载走直连,网页走代理)。
  • 需要调试路由逻辑,通过规则优先级实现 0 切换时间。
  • 在使用透明代理(Tproxy)场景时,手动编辑是必选项,因为 GUI 不支持复杂透明代理规则。

不适用场景

  • 仅需要“全局代理”或“绕过大陆”等简单模式——GUI 路由设置完全足够。
  • 用户不熟悉 JSON 语法和配置结构,容易导致故障。
  • 维护大量规则(超过 1000 条)没有使用 rule-set 等高级功能——应优先考虑 V2Ray 的 rule-set 特性(需要额外配置)。
  • 团队项目中需要统一管理路由策略——手动编辑容易导致配置不一致,建议使用 CI/CD 自动生成。

FAQ

Q1: 为什么我在 config.json 中加了规则,但访问国内网站还是走了代理?

请检查规则顺序:确保绕过大陆的规则(如 geosite:cn)位于所有国外规则之前。同时确认 domainStrategy 不是 AsIs(否则 IP 规则不生效)。还可以在日志中查看具体匹配了哪条规则。若没有任何规则匹配,流量默认走第一个 outbound(通常是代理)。

Q2: 手动编辑后 V2RayN 无法启动,怎么办?

使用之前备份的 config.json 覆盖原文件。如果没有备份,可以临时将配置文件中的 routing 字段删除或清空规则数组(只需保留一对空花括号),然后重新启动。启动后通过日志或外部工具修复语法错误。

Q3: geosite:cn 和 geoip:cn 有多大区别?可以同时添加吗?

geosite:cn 是域名列表(已收录常见国内域名),geoip:cn 是中国 IP 段。两者结合可以覆盖 95% 以上的国内网站。对于某些使用海外 CDN 的国内网站(域名非 cn,但 IP 在国内),只靠域名规则可能漏判,因此 domainStrategy 建议设为 IPIfNonMatch。同时添加两条规则很常见。

Q4: 手动编辑会导致订阅更新时配置被覆盖吗?

是的,当您在 V2RayN 中更新订阅时,程序会重新生成整个 config.json(包括 routing 部分),您手动添加的规则将会丢失。解决方案有两种:一是更新订阅后再次手动编辑;二是使用 V2RayN 的“自定义配置”功能(如有),或利用服务端路由(即让远程服务器端处理分流,客户端仅作转发)。经验性做法:在更新订阅前备份手动规则,更新后直接合并。

Q5: 如何设置“禁用 UDP 代理”规则?

可以在规则中添加 "network": "udp" 并指定 outboundTag 为 direct。例如:{"type": "field", "network": "udp", "outboundTag": "direct"}。注意这条规则应该放在其他规则之前,以避免 UDP 流量被代理规则匹配。大部分代理节点不支持 UDP,因此将 UDP 流量直连可以加速游戏和 DNS。

最佳实践清单

  • 始终在修改前备份 config.json。
  • 使用支持 JSON 语法校验的编辑器修改,保存前验证格式。
  • 每次只修改一条规则,重启后验证效果,避免一次修改多条导致问题难以定位。
  • 优先使用 geosite 和 geoip 内置列表,减少自定义条目。
  • 明确规则优先级:具体规则放前面,通用规则放后面。
  • 避免在 rules 数组中使用空对象或无效字段,以免干扰匹配逻辑。
  • 如果频繁更新订阅,考虑将手动规则写入备用文件,更新后自动合并(可通过脚本实现)。
  • 使用 domainStrategy: "IPIfNonMatch" 在精度与性能间取得平衡。
  • 不要在 config.json 中添加 JSON 不支持的单行注释(如 //)或块注释(/* */),除非您使用的 V2RayN 版本经过修改支持(默认不支持)。推荐使用无注释的干净 JSON。
  • 遇到无法解释的问题时,先清空所有路由规则(仅保留一个空数组),看基础代理是否正常,再逐步添加。

总结与下一步

手动编辑 V2RayN 配置文件添加路由规则是获得灵活分流控制的必备技能。通过理解 routing 结构、掌握常见规则写法、遵循备份与渐进式验证的原则,您可以安全地实现多出口、精细化分流。记住:GUI 适合 80% 的场景,手动编辑适合那 20% 需要突破限制的场景。当您需要 Beyond the GUI 时,本文提供的步骤与经验就是您的工具箱。下一步,您可以尝试阅读 V2Fly 官方文档中的“路由规则”章节,或者探索 rule-set 和资源引用等高级功能。但请务必在测试环境中先验证,再应用到生产机器。根据版本演进趋势,V2RayN 后续版本可能会进一步优化路由引擎的可视化编辑能力,但手动编辑的灵活性仍将是核心优势。祝您分流愉快!

路由规则手动编辑配置文件分流设置规则编写进阶配置