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,请按照以下步骤迁移:
- 将
routing.json中的整个对象内容复制。 - 打开主
config.json,在顶层对象中添加字段"routing": {}。 - 将复制的对象填入
routing内部(注意不要带多余的routing外层)。 - 删除旧
routing.json文件(或重命名)以免混淆。 - 重启 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 整合 routing | GUI 保存会覆盖 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 后续版本可能会进一步优化路由引擎的可视化编辑能力,但手动编辑的灵活性仍将是核心优势。祝您分流愉快!