V2Ray 配置文件 JSON 结构详解:inbounds、outbounds 与 routing 逐段拆解

用一份最小可运行配置,逐段解释 log、inbounds、outbounds、routing、dns 各字段的作用,并说明 tag 如何把入站、出站与分流规则串成完整链路。

本文速览

本文适合已经接触 v2rayN、需要读懂内核运行配置的用户。先运行仅含本机入站、直连与阻断出站的 JSON,再沿着「应用 → 入站 → 路由 → 出站」检查每个字段。示例不需要远程节点,能验证监听端口、标签引用和规则顺序;接入 VMess 或 VLESS 时,再按服务端参数替换出站。

1. 配置链路:先分清客户端、内核与 JSON

inbounds 负责接收应用交来的流量,outbounds 负责把流量发往目标或远程服务器,routing 在两者之间选择出站。JSON 是配置格式,不是节点协议;文件扩展名相同,也不代表不同内核可以互换整份配置。

v2rayN 是桌面客户端,提供订阅管理、服务器编辑和路由设置界面;真正监听端口与处理连接的是所选内核。安卓端的 v2rayNG 使用 Xray 内核,v2flyNG 使用 V2Fly 内核。排查字段兼容性时,应先确定实际启动的内核,而不是只看客户端名称。

两种配置入口:界面生成与手动维护

客户端生成配置
  • 通过订阅或服务器编辑窗口填写节点参数。
  • 客户端组合本地端口、DNS 与路由规则后交给内核。
  • 生成文件可能在切换服务器或重启内核时被覆盖。
独立 JSON 配置
  • 手动维护完整的入站、出站和标签引用。
  • 先在独立目录中用内核命令验证配置。
  • 导入客户端前,确认它对自定义配置的处理方式。

学习结构先使用独立文件;日常订阅节点优先在客户端对应设置入口修改,避免编辑临时生成文件。

下文采用 V2Ray 传统 JSON 配置结构中的基础字段,并以 Xray 命令演示验证。V2Fly 的不同主版本还可能涉及配置格式和命令差异;尤其是 TLS、REALITY、传输层设置,不应跨内核直接照搬。

2. 最小可运行配置:两个入站、两个出站

将以下内容保存为 UTF-8 编码的 config.json。它在本机开启 SOCKS 和 HTTP 代理端口,正常流量直接联网;只有从 HTTP 入站进入、且目标域名为 example.com 的请求被阻断。这里的「代理端口」是本地接入方式,不表示连接经过远程代理服务器。

{
  "log": {
    "loglevel": "warning"
  },
  "inbounds": [
    {
      "tag": "socks-in",
      "listen": "127.0.0.1",
      "port": 10808,
      "protocol": "socks",
      "settings": {
        "auth": "noauth",
        "udp": true
      }
    },
    {
      "tag": "http-in",
      "listen": "127.0.0.1",
      "port": 10809,
      "protocol": "http",
      "settings": {}
    }
  ],
  "outbounds": [
    {
      "tag": "direct",
      "protocol": "freedom",
      "settings": {}
    },
    {
      "tag": "block",
      "protocol": "blackhole",
      "settings": {}
    }
  ],
  "routing": {
    "domainStrategy": "AsIs",
    "rules": [
      {
        "type": "field",
        "inboundTag": ["http-in"],
        "domain": ["full:example.com"],
        "outboundTag": "block"
      },
      {
        "type": "field",
        "ip": [
          "10.0.0.0/8",
          "172.16.0.0/12",
          "192.168.0.0/16"
        ],
        "outboundTag": "direct"
      }
    ]
  },
  "dns": {
    "servers": ["localhost"]
  }
}
10808
示例 SOCKS 入站端口
10809
示例 HTTP 入站端口
2 条
按数组顺序匹配的路由规则

这些端口是本文的明确配置值,不是所有客户端版本的默认值。运行前先退出占用相同端口的代理进程,或同时修改 JSON 和测试命令中的端口。示例不启用系统代理,也不启用 TUN,只有明确指定这些端口的应用请求才会进入内核。

3. inbounds:监听地址、端口与入站标签

inbounds 是数组,每个对象是一组入口。listen 决定接受哪个本地地址上的连接,port 决定监听端口,protocol 决定应用与内核之间使用什么协议。应用填错协议时,即使端口能连接,也无法正常转发请求。

SOCKS 入口

tag
socks-in
listen
127.0.0.1
port
10808
protocol
socks
udp
true

应用选择 SOCKS5;是否使用 UDP,还取决于应用本身及后续出站能力。

HTTP 入口

tag
http-in
listen
127.0.0.1
port
10809
protocol
http
settings
{}

应用选择 HTTP 代理;HTTPS 目标通常通过 HTTP CONNECT 建立隧道。

127.0.0.1 只允许本机访问。将它改为 0.0.0.0 会扩大 IPv4 监听范围,不能当作普通的兼容性修复。尤其是示例 SOCKS 入口使用 noauth,不应直接暴露给不可信网络。

4. outbounds:默认出站与远程节点的区别

outbounds 定义可用的出口。示例中的 direct 使用 freedom,直接连接目标;block 使用 blackhole,丢弃匹配的连接。当没有规则匹配时,普通路由行为会使用出站数组中的第一个出站,因此这里默认直连。

字段或协议具体作用填写要点
tag供路由引用的出站名称使用唯一、含义明确的名称
freedom直接连接目标地址不需要远程服务器账户
blackhole阻断连接测试时预期请求失败
vmess连接 VMess 服务端核对地址、端口、用户参数和传输设置
vless连接 VLESS 服务端核对用户参数、加密字段及安全层设置

接入远程节点不能只把 protocol 改成 vless。协议对应的 settings、传输层 streamSettings 和服务端配置必须配套。地址、端口、UUID、传输类型、TLS 的服务器名称以及需要时的 flow,分别承担不同职责。

VMess 与 VLESS 也不是「加密强度」选项。特别是 VLESS,本身不负责给业务流量提供传输加密,需要结合服务端要求的 TLS 或其他安全层。REALITY 属于 Xray 的相关能力,不能把对应字段直接放进 V2Fly 配置并期待正常运行。

先保留直连示例

推荐

先验证本地端口、JSON 格式和路由标签,再一次替换一组出站参数。这样能区分本机配置错误与远程连接错误。

适合:首次读配置、定位启动失败、验证规则顺序。

使用有效节点出站

从已确认可用的节点配置取得完整出站对象,保留服务端要求的传输与安全参数,再调整本地标签引用。

适合:已有可用节点、需要在现有配置上增加分流。

5. routing:tag 如何串起整条连接

routing.rules 从上到下检查,先匹配的规则决定当前连接的路由结果。示例第一条规则同时包含 inboundTag 和 domain,两类条件需要同时成立;同一 domain 数组中的多个域名条件则是任选其一匹配。

  1. 应用连接 127.0.0.1:10809,内核给该连接标记入站标签 http-in。
  2. 请求目标为 example.com,满足 full:example.com 的精确域名条件。
  3. 第一条规则命中,通过 outboundTag: "block" 找到对应出站。
  4. blackhole 处理该连接;后面的私网规则不再参与这次选择。

full:example.com 只表示精确域名,不包含它的子域名。若需要同时匹配主域名及子域名,可使用 domain:example.com。把普通字符串直接写入域名数组时,其匹配语义也不能简单理解为精确匹配。

第二条规则列出三个 IPv4 私网网段,目标以这些 IP 进入路由时会直连。因为示例使用 AsIs,路由不会仅为匹配 IP 条件而主动解析域名。因此,域名最终解析到私网地址,不等于它在这条规则里一定命中。示例默认也是直连,所以实际结果可能相同,但匹配过程不同。

需要默认走远程节点时,可以把有效的远程出站放在数组首位,或在规则末尾添加明确的兜底规则。不要把兜底规则放在精确阻断和私网直连之前,否则前面的宽泛条件会遮住后面的细分规则。

6. dns 与 log:解析策略和日志分别检查

dns.servers 定义内置 DNS 使用的上游,示例的 localhost 表示使用系统本地解析机制。这个配置不会自动修改操作系统 DNS,也不会自动接管其他应用的 DNS 请求。只有在内核相应模块需要解析时,这些设置才进入实际处理链路。

这些是路由层的策略,不等于出站连接时的解析策略。即使路由使用 AsIs,直连出站连接域名目标时仍可能需要解析。若域名一开始已被应用解析成 IP,内核也不一定还能拿到原域名;本文测试用 socks5h,就是为了让 SOCKS 请求携带域名。

log.loglevel 的 warning 适合先观察警告和错误。排查时可临时改为 info,必要时再用 debug。访问日志与错误日志有各自输出设置,调高日志等级不等于自动开启完整访问记录。

"log": {
  "access": "access.log",
  "error": "error.log",
  "loglevel": "info"
}

上面片段用于替换完整配置里的 log 对象,不是单独运行的配置文件。相对日志路径通常按进程工作目录解释;从客户端启动时,工作目录未必等于 JSON 所在目录。排查结束后恢复适当等级,并在分享日志前移除服务器地址、订阅地址和账户信息。

7. 保存、测试与验证:一次只改一个变量

先验证 JSON 能被当前内核接受,再验证端口,最后检查规则结果。配置测试通过只说明配置通过相应检查,不代表运行时端口一定可绑定,也不代表远程服务器可连接。

  1. 保存配置

    在 Windows 11 文件资源管理器中选择「查看」→「显示」→「文件扩展名」,确认文件叫 config.json,而不是 config.json.txt。正文使用英文双引号,不写注释和末尾多余逗号。

  2. 验证字段

    将配置放在 Xray 可执行文件所在的独立测试目录,在该目录打开 PowerShell,执行下方测试命令。若使用 V2Fly,先查看对应内核的命令帮助,不直接套用 Xray 参数。

  3. 启动内核

    停止占用 10808、10809 的其他代理进程,再执行运行命令。保留终端窗口,观察是否出现端口绑定失败或字段解析错误。

  4. 验证规则

    分别运行 SOCKS 和 HTTP 测试。先确认普通站点可达,再观察 example.com 在两个入站上的差异。完成后在内核终端按 Ctrl+C 停止测试进程。

.\xray.exe run -test -config .\config.json

.\xray.exe run -config .\config.json

保持内核运行,在另一个 PowerShell 窗口执行以下命令。显式使用 curl.exe,避免部分环境把 curl 解释成其他命令。每条命令设置 15 秒超时,仅为限制等待时间,不是性能测试。

curl.exe --max-time 15 --proxy socks5h://127.0.0.1:10808 https://example.org/

curl.exe --max-time 15 --proxy http://127.0.0.1:10809 https://example.com/

curl.exe --max-time 15 --proxy socks5h://127.0.0.1:10808 https://example.com/
测试请求预期路由判断依据
SOCKS → example.orgdirect规则未命中,使用首个出站
HTTP → example.comblock入站标签和精确域名同时匹配
SOCKS → example.comdirect入站标签不符,不命中阻断规则

直连测试能否收到网页仍取决于当前网络、系统解析和目标可达性。HTTP 阻断请求应失败,但失败的文字与耗时可能随连接阶段变化。不能仅凭一次超时断言规则命中;需要结合入站、目标域名、规则顺序和日志一起判断。

8. 常见配置错误:从报错位置回到字段

配置问题分成语法、结构、运行环境和连接参数四层。看到报错先定位层级,避免把本地端口冲突当成节点故障,或把未知字段当成网络不通。

整份 JSON、单个出站对象、节点分享链接和订阅地址是四种不同输入。完整配置包含本地入站与路由,订阅通常供客户端解析节点信息。把整份 JSON 粘进订阅地址字段,或把订阅地址当作出站服务器地址,都不会自动完成结构转换。

v2rayN 下载入口