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

以一份最小可用配置为样本,按 log、inbounds、outbounds、routing、dns 顺序拆解每个字段的含义和相互引用关系。

本文速览

适合已经接触订阅、准备阅读内核配置的用户。先运行一个仅监听本机的 SOCKS 入站,用直连和拒绝两种出站验证配置结构,再理解标签引用、规则顺序与 DNS 的边界。样本不包含远端代理节点;完成测试后,再把服务端提供的协议参数接入出站,避免把 JSON 语法、节点连接和分流问题混在一起。

一、先保存一份能独立测试的 config.json

下面使用 V2Ray 传统 JSON 配置结构,适用于支持该格式的 V2Fly 内核。先执行 v2ray version 确认实际运行的程序,再查看 v2ray help。V2Fly 与 Xray 的字段有交集,但扩展功能和命令行参数并不完全相同;不要把其他内核的配置直接当作通用格式。

将以下内容保存为 UTF-8 编码的 config.json。它在 127.0.0.1:10808 提供 SOCKS 入口,对 example.org 及其子域名拒绝连接,其他请求默认直连。这里的“可用”指入口、路由和出站链路能够运行,不表示已经具备远端代理能力。

{
  "log": {
    "loglevel": "warning"
  },
  "inbounds": [
    {
      "tag": "socks-local",
      "listen": "127.0.0.1",
      "port": 10808,
      "protocol": "socks",
      "settings": {
        "auth": "noauth",
        "udp": false
      }
    }
  ],
  "outbounds": [
    {
      "tag": "direct",
      "protocol": "freedom",
      "settings": {}
    },
    {
      "tag": "blocked",
      "protocol": "blackhole",
      "settings": {}
    }
  ],
  "routing": {
    "domainStrategy": "AsIs",
    "rules": [
      {
        "type": "field",
        "inboundTag": ["socks-local"],
        "domain": ["domain:example.org"],
        "outboundTag": "blocked"
      }
    ]
  },
  "dns": {
    "servers": [
      "1.1.1.1",
      "8.8.8.8"
    ]
  }
}

二、log:先确定错误从哪里看

log 负责日志输出,不承担代理和分流。样本只设置 loglevel,没有指定日志文件路径;手动从终端启动时,应直接观察进程输出。如果通过服务启动,则查看对应服务的日志,而不是在任意目录寻找一个默认日志文件。

字段或值用途使用建议
loglevel: warning保留警告与错误等较高等级信息用于日常运行,普通连接不一定出现日志
loglevel: info提供更多运行信息适合短时检查连接及配置行为
loglevel: debug提供更细的诊断信息复现一次问题后恢复原级别
access / error分别指定访问日志和错误日志位置设为文件路径时,先确认目录存在且进程可写

遇到启动失败,先读第一条明确的错误:解析错误通常指向字段或位置;address already in use 指向监听端口占用;权限错误则应检查配置文件和日志目录。反复修改节点地址不能解决本地端口冲突。

三、inbounds:应用连接的是本机入口

inbounds 描述内核怎样接收请求。样本中的 protocol: socks 是应用与本机内核之间的 SOCKS 协议,不是远端服务器协议。浏览器或终端需要明确使用这个入口,单纯启动进程不会自动修改系统代理,也不会接管全部应用流量。

本机 SOCKS 入站

标签
socks-local
监听地址
127.0.0.1
监听端口
10808
协议
socks

仅接受本机连接;测试应用必须选择 SOCKS 代理,而不是 HTTP 代理。

默认直连出站

标签
direct
协议
freedom
协议设置
{}
数组位置
第 1 项

未命中规则时使用这个出站;它直接连接目标,不经过远端代理服务器。

listen 决定谁能访问入口,port 决定入口编号。这里使用回环地址,其他局域网设备不能通过电脑的内网地址连接它。不要为了排查问题,随手改成 0.0.0.0 并继续保留无认证设置;那会扩大监听范围。

settings.auth 为 noauth 表示本地 SOCKS 不要求用户名和密码;udp: false 表示此样本不开放 SOCKS UDP 转发。本篇只用 TCP 请求验证流程,不能据此判断游戏、语音或其他 UDP 应用是否已经可用。

四、outbounds:协议参数与出站标签分开理解

outbounds 描述请求离开内核的方式。样本里的 freedom 是直连,blackhole 用于拒绝或丢弃请求。它们都不是远端节点,因此无需填写服务器地址、用户标识或传输安全参数。

  1. 先看 protocol。它决定 settings 中允许出现哪些协议字段。不要把 SOCKS 入站的认证字段复制进 VMess 出站。
  2. 再看 settings。它承载对应协议的连接参数。新增真实代理节点时,应以服务端信息和当前内核文档为准,而不是猜测默认值。
  3. 最后看 tag。它是配置内部引用的名称。示例中 direct 和 blocked 都是自定义标签,不是系统保留协议名。
  4. 核对 streamSettings。需要时在出站对象中配置传输方式与传输安全参数;它与协议的 settings 是同级字段,不应随意嵌套。

VMess 与 VLESS 是不同的代理协议,不能只改一个 protocol 就完成转换。使用 VLESS 时,还要核对实际内核版本及其支持范围。尤其是 Xray 的特定传输扩展,不能因为字段看起来相似,就原样移到 V2Fly 配置中。

结论:保留直连基线,再加入真实节点

先让 10808 入口通过直连测试,再新增代理出站并用规则指向它。这样新增失败时,可以优先检查协议与服务端参数,不必同时怀疑入口配置。

五、routing:按规则顺序把请求交给出站

请求进入内核后,路由模块依据目标域名、目标 IP、端口、入站标签等条件选择出站。样本的处理链如下;这里没有虚拟网卡,也没有自动设置系统代理。

应用请求 本机入站 规则匹配 选定出站 连接目标

样本中的规则要求请求来自 socks-local,并且目标域名匹配 domain:example.org,然后交给 blocked。同一条规则中的这两个条件要同时成立;domain 数组内若列出多个域名,则匹配其中一个即可满足域名条件。

配置项引用或含义常见错误
inboundTag匹配入站对象的 tag把协议名 socks 当作入站标签
outboundTag指向出站对象的 tag写成不存在的标签,或大小写不一致
domain:example.org匹配该域名及其子域名误以为只匹配完全相同的主机名
full:example.org只匹配完整域名期待它同时覆盖所有子域名
rules 数组从上到下检查,命中后选择对应出站把覆盖面大的规则放在特殊规则前面

没有命中任何规则时,默认使用 outbounds 的第一项。本文第一项是 direct,所以普通请求直连;如果把代理出站移到第一项,未匹配请求的行为也会跟着改变。排查“怎么所有网站都走同一个出口”时,除了检查规则,还要检查数组首项。

domainStrategy: AsIs 表示路由阶段按现有目标信息匹配,不为匹配 IP 规则而主动解析域名。如果应用交给 SOCKS 的已经是 IP,单靠这条域名规则就无法还原原始域名。本例未配置嗅探,因此测试时必须让应用把域名交给 SOCKS 入口。

六、dns:配置解析服务器不等于接管系统 DNS

顶层 dns 配置的是内核内置 DNS 模块。样本列出 1.1.1.1 与 8.8.8.8 两个服务器,但写入这段配置不会修改操作系统的 DNS,也不表示所有应用查询都会自动进入内核。

因此,本例中的 DNS 段主要展示结构,并不保证在每次测试中都会被调用。路由的 domainStrategy 与直连出站的 settings.domainStrategy 属于不同层次:前者影响规则如何匹配,后者影响直连如何处理目标地址。不要只看到同名字段,就认为修改任意一个都能改变全部解析路径。

结论:先确认谁在解析域名

域名规则不命中时,先用 socks5h://127.0.0.1:10808 重试,让 curl 将目标域名交给 SOCKS。确认请求形态后,再决定是否调整 DNS 或路由策略。

七、配置测试与两组请求验证

对于提供 test 和 run 子命令的 V2Fly 版本,可在配置文件所在目录执行下列命令。Windows 下从当前目录调用时,将程序名写成 .\v2ray.exe;其他版本先根据本机帮助确认参数。启动前应避免桌面客户端同时占用 10808。

v2ray version
v2ray help
v2ray test -c config.json
v2ray run -c config.json

test 成功只说明配置被当前内核接受,不代表网络可达。保持内核运行,在另一个终端执行下列命令。Windows 可使用 curl.exe,避免命令名称被终端别名覆盖。

curl --connect-timeout 10 --max-time 20 --proxy socks5h://127.0.0.1:10808 -I https://example.com/
curl --connect-timeout 10 --max-time 20 --proxy socks5h://127.0.0.1:10808 -I https://example.org/
  1. 第一组验证直连。在当前网络能够访问目标的前提下,第一条命令应收到 HTTP 响应头。具体状态码由目标站点决定,不要求固定为 200。
  2. 第二组验证拒绝。第二条请求应无法完成正常的 HTTPS 响应。具体报错随 curl 与内核版本变化,不能只凭某一句错误文本判断成败。
  3. 检查时间边界。命令设置连接超时 10 秒、总超时 20 秒,用来避免长时间等待;这不是延迟测量,也不是性能结论。
  4. 逐项改变配置。先把拒绝规则的 outboundTag 改为 direct,重新测试并重启。若第二条恢复响应,就能验证标签引用和规则确实参与了处理。

修改磁盘上的 JSON 后,不要假定正在运行的进程已经自动重读。本文手动运行方式应停止旧进程,再执行配置测试并重新启动。若在 v2rayN 中使用订阅节点,客户端可能重新生成运行配置;应区分客户端生成文件与自行维护的自定义配置,修改前保留副本。

八、常见配置问题与具体处理

配置测试通过,浏览器为什么还是没走入口?

配置测试不会设置系统代理。先运行本文的 curl 命令确认入口工作,再检查浏览器使用的代理类型和端口。10808 在此配置中是 SOCKS 端口,不能直接填进只接受 HTTP 代理的设置栏。

为什么写了 blocked,网站仍然能打开?

先确认请求真的经过 127.0.0.1:10808,再使用 socks5h 传递域名。随后检查 inboundTag 是否为 socks-local,以及前面是否存在更早命中的规则。修改后重启进程再测。

启动提示 10808 已被占用,应该改哪里?

关闭旧的内核进程,或将入站 port 改为未占用的 10818,并把测试命令的端口同步改成 10818。不要只修改应用端口而保留内核监听原值;端口两端必须一致。

订阅链接能直接放进 outbounds 吗?

不能。订阅是客户端获取节点信息的入口,outbounds 需要内核能够识别的结构化对象。先让 v2rayN 导入订阅,再阅读它为当前节点生成的配置;分享排错片段前,删除订阅地址、服务器认证信息与其他敏感参数。

最终检查顺序固定为:JSON 能解析、内核能启动、入站能连接、规则能命中、出站能到达目标。每次只调整一个层次,保留能工作的基线文件。这样即使后续加入 VMess、VLESS 或更复杂的 DNS 分流,也能把失败范围收敛到具体字段,而不是整体替换配置反复试错。

客户端与平台选择

根据设备系统选择安装包。桌面端使用 v2rayN;安卓端可根据内核需求选择 v2rayNG 或 v2flyNG。先按教程完成基础连接,再返回本篇核对配置结构与规则引用。

下载v2rayN按系统选择客户端