· 进阶配置 · 约 12 分钟

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

从 log、dns 到 inbounds、outbounds、routing,逐段解释 V2Ray 配置 JSON 的字段作用与流量走向,附常见写法示例。

本文速览

读配置先确认内核与配置格式,再沿“入口接收、规则判断、出口连接”的顺序检查。本文适合需要阅读 v2rayN 生成配置、定位分流错误或学习手写配置的用户,使用一个仅含本地 SOCKS 入口、直连与阻断出口的完整示例,解释字段关联;示例不包含远程代理节点,不能用来验证代理服务是否可用。

先分清:客户端设置、订阅与内核配置

v2rayN 是桌面客户端,负责管理节点、订阅、路由与内核运行;真正接收流量并建立连接的是内核。客户端保存的界面偏好、订阅地址和分组记录,不等于内核启动时读取的 JSON。直接修改客户端生成的临时配置,可能在切换节点、更新订阅或重启内核后被覆盖。

本文采用 V2Ray 常见的传统 JSON 配置结构。V2Ray 的不同配置格式以及 Xray 的扩展字段不能仅凭文件扩展名混用。尤其是 VLESS、传输层与安全层相关参数,应以正在运行的内核及其版本文档为准;“都是 JSON”不代表字段完全兼容。

资料类型主要内容适合检查的问题
客户端设置订阅分组、活动节点、系统代理开关是否选对节点,应用是否经过客户端
订阅或分享链接节点地址、端口、协议与传输参数节点信息是否完整,订阅是否更新成功
内核配置 JSONlog、dns、inbounds、outbounds、routing入口监听、出口引用与规则顺序是否正确

在 v2rayN 中,可先从「设置」→「参数设置」核对本地监听相关设置,再从「设置」→「路由设置」查看分流规则;不同版本的入口名称可能调整,应以实际菜单为准。内核名称、启动参数和配置文件位置优先从启动日志确认,不要把订阅文件当成完整运行配置。

流量走向:inbounds 接收,routing 选择,outbounds 执行

应用请求 入口接收 规则匹配 出口连接 响应返回

inbounds 是入口数组,用来描述内核在哪里、用什么协议接收请求。例如,应用连接本机 127.0.0.1:10808 的 SOCKS 服务后,才进入这个入口。仅仅启动内核,不会让所有程序自动使用它;系统代理、应用独立代理和 TUN 是不同的接入方式。

outbounds 是出口数组,可以包含远程代理、直连和阻断等出口。routing 则根据域名、IP、端口或入口标签等条件选择出口。标签 tag 是配置内部的标识,不是协议名,也不会自动创建同名出口。

结论:先核对标签引用,再排查网络

出口名称拼写不一致或兜底出口放错位置,会让规则行为偏离预期。先把每个 outboundTag 对应到实际出口,再测试节点连通性。

完整示例:本地 SOCKS、直连与域名阻断

下面是一份用于理解结构的完整传统 JSON 示例:只在本机监听 SOCKS,阻断 example.com 这个精确域名,其他经该入口进入的请求直连。它不含 VMess 或 VLESS 服务端参数,因此即使成功访问网页,也只说明本地入口与直连路径可用。

10808
示例 SOCKS 监听端口
2 个
出口:直连与阻断
1 条
精确域名阻断规则
{
  "log": {
    "loglevel": "warning"
  },
  "dns": {
    "servers": [
      "1.1.1.1"
    ]
  },
  "inbounds": [
    {
      "tag": "socks-local",
      "listen": "127.0.0.1",
      "port": 10808,
      "protocol": "socks",
      "settings": {
        "auth": "noauth",
        "udp": true
      }
    }
  ],
  "outbounds": [
    {
      "tag": "direct",
      "protocol": "freedom",
      "settings": {}
    },
    {
      "tag": "block",
      "protocol": "blackhole",
      "settings": {}
    }
  ],
  "routing": {
    "domainStrategy": "AsIs",
    "rules": [
      {
        "type": "field",
        "domain": [
          "full:example.com"
        ],
        "outboundTag": "block"
      }
    ]
  }
}

JSON 的对象用花括号,数组用方括号,字符串使用英文双引号。为了减少解析差异,示例不使用注释或尾随逗号。语法合法只是第一步:字段名、字段类型与协议参数仍需要内核验证。

入口与出口:监听地址不等于服务器地址

入口的 listen 是本机绑定地址;远程代理服务器的地址则属于对应出口的协议设置。把服务器域名填到本地监听地址里,不能建立代理连接,反而可能使入口无法绑定。127.0.0.1 只允许本机访问;改成 0.0.0.0 会扩大到所有 IPv4 网卡,需要同时评估认证、防火墙与局域网访问范围。

本地 SOCKS 入口

tag
socks-local
listen
127.0.0.1
port
10808
protocol
socks
auth
noauth

只供本机测试;应用端也要选择 SOCKS 协议和相同端口。

直连出口

tag
direct
protocol
freedom
settings
空对象
数组位置
第一个出口
作用
由本机直接连接目标

本例未命中阻断规则的连接会回落到此出口。

udp: true 表示 SOCKS 入口允许 UDP 转发,并不表示所有应用 UDP 都会被接管。应用需要支持 SOCKS5 UDP 关联,后续出口与网络路径也要支持 UDP。仅在系统中配置 HTTP 代理,不会自动把 UDP 请求送入这个 SOCKS 入口。

实际添加 VMess 或 VLESS 出口时,还需要服务端地址、端口、用户标识和匹配的传输设置。VMess 常见配置使用 settings.vnext,VLESS 也有相应的用户与服务器结构,但两者认证语义不同,不能只改 protocol 字符串。启用 TLS 时还要核对服务器名称;服务端口为 443 也不代表配置必然启用了 TLS。

路由规则:顺序、域名匹配与兜底出口

示例中的 full:example.com 仅精确匹配这个域名,不会自动覆盖 www.example.com。如果需要域名及其子域,传统路由规则可以使用 domain:example.com。不要把这种域名匹配误认为 URL 匹配:路由通常不能依靠网页路径 /account 区分同一网站的页面。

字段或写法含义检查重点
full:example.com完整域名匹配不包含子域,也不包含 URL 路径
domain:example.com域名及子域匹配比精确域名覆盖范围更大
ip: ["192.168.0.0/16"]目标 IP 网段匹配域名目标是否触发解析取决于路由策略
port: "443"目标端口匹配端口不能证明应用层协议或加密状态
inboundTag: ["socks-local"]按入口限制规则范围入口标签必须存在且拼写一致

domainStrategy: "AsIs" 表示路由阶段不为了 IP 规则主动解析域名。这不等于整个连接过程中不做 DNS 查询:出口真正连接目标时,仍可能需要解析。使用 IPIfNonMatch 时,域名规则未匹配后可解析 IP 再尝试匹配;使用 IPOnDemand 时,遇到需要 IP 的规则就可能触发解析。

规则排序应从具体到宽泛。若第一条规则已经把某个入口的全部流量指向直连,后面的同入口域名阻断就不会被执行。使用 geoip:、geosite: 规则时,还要确认对应数据文件可用;数据缺失与网络不可达是两类不同错误。

结论:给每条规则设计一个可复现请求

用精确域名测试阻断,再用另一域名验证兜底出口。一次只调整一条规则,并确认应用把域名而非本地解析后的 IP 交给入口。

DNS 与日志:定义了解析器,不代表接管所有查询

dns.servers 为内核内置 DNS 定义上游解析器,示例使用 1.1.1.1。普通 IP 地址写法通常对应传统 DNS 查询,而不是加密 DNS。它能否访问、查询如何出站,还受网络与相关配置影响;不能仅凭这个字段判断解析路径。

应用也可能先通过操作系统 DNS 得到 IP,再把 IP 交给 SOCKS。此时内核收到的目标不是原始域名,前面的域名规则就可能无法命中。嗅探可以在适用协议中辅助识别域名,但不能保证还原所有请求的原始域名,更不是配置内置 DNS 后自动获得的能力。

  1. 先辨别输入。请求日志显示的是域名还是 IP?使用 SOCKS 的应用是否启用了代理侧域名解析?
  2. 再辨别失败阶段。域名解析失败、连接超时、TLS 握手失败分别发生在不同环节,不能统一归结为 DNS。
  3. 短时提高日志级别。将 loglevel 从 warning 改为 info 或 debug,重现一次问题后恢复,避免持续记录大量连接细节。
  4. 按需配置日志文件。access 与 error 可指定访问日志和错误日志路径;目标目录需要存在,运行账户需要写入权限。

验证步骤:先查语法,再查真实流量

建议将示例另存为 config.json,先在独立测试环境验证,不覆盖客户端正在使用的配置。支持相应命令的 V2Ray 可用下面的方式测试配置;不同发行版本的命令行入口有差异,若提示未知命令,先运行 v2ray help 查看本机支持的参数。

v2ray test -c config.json

配置测试通过并不意味着端口可成功绑定、远端可连接或路由符合预期。启动内核后,再用明确指定代理协议的请求进行验证。以下命令适用于已安装 curl 的环境;Windows 终端可使用 curl.exe,避免命令别名差异。

curl --socks5-hostname 127.0.0.1:10808 --connect-timeout 10 https://example.com/

--socks5-hostname 会把目标域名交给 SOCKS 代理,适合验证本例的域名规则。预期结果是这个请求无法正常取得网页,同时日志应能反映请求进入内核。具体错误文字取决于内核与 curl 版本,不能只看一条报错就判断是哪条规则生效。

  1. 验证阻断。保留完整配置中的 full:example.com 规则,执行上述命令并观察日志。
  2. 验证直连。将测试副本的 rules 改为空数组 [],重启内核再执行相同请求;网络本身可访问目标时,应由第一个直连出口连接。
  3. 确认入口。若日志完全没有请求,检查监听地址、端口和应用设置,不要继续修改路由。
  4. 恢复环境。关闭独立测试内核,恢复原配置,再启动客户端,避免多个进程争用同一个端口。

常见问题:启动成功但分流没有变化

修改 JSON 后,为什么重启客户端又变回去了?

很多配置由 v2rayN 根据节点和路由设置动态生成。应在客户端对应设置中修改,或按当前版本支持的自定义配置方式管理独立文件。先确认启动日志实际加载的是哪一个文件,再判断修改是否生效。

JSON 格式正确,为什么内核仍然报错?

通用 JSON 解析器只检查括号、逗号、字符串等语法,不认识协议字段。字段类型错误、引用不存在的出口、缺少规则数据文件,以及当前内核不支持某个参数,都可能使配置无法通过内核检查。

系统代理已经打开,为什么部分应用没有日志?

部分应用不遵循系统代理,或者使用了自己的代理设置。先用显式指定 SOCKS 的请求验证入口,再检查具体应用。需要测试 TUN 时,先记录系统代理模式的结果,避免同时改变接入方式和路由规则。

如何把示例改成“默认走代理”?

先加入参数完整、与当前内核兼容的远程代理出口,再通过明确的兜底规则或出口顺序指定默认路径。仅把 direct 标签改名为 proxy 不会改变协议行为;使用 freedom 的出口仍然是直连。

阅读配置时,可以固定沿三个问题检查:应用是否进入预期入口、请求是否命中预期规则、选中的出口是否具备正确参数。将解析、路由和连接分开验证,通常比同时改动多个开关更容易定位原因。

v2rayN 客户端下载

按系统与处理器架构选择客户端。初次配置建议先按教程完成节点导入与本地代理验证,再调整路由和自定义 JSON。

查看下载选项 看教程
下载v2rayN按平台选择客户端