V2Ray 配置文件结构逐段解析:inbounds、outbounds 与 routing 各管什么

以一份最小可用配置为线索,逐段拆解 inbounds、outbounds、routing 三大区块的职责与常用字段,帮助读懂客户端生成的 JSON。
V2Ray 与 Xray 的运行配置可以看成一张连接处理图:程序先在本机端口接收请求,再根据路由规则判断去向,最后交给代理、直连或阻断出站。v2rayN、v2rayNG 与 v2flyNG 会把界面中的节点、分流和本地端口设置转换成这张图,因此读懂 JSON 的重点不是背字段,而是确认请求在每一步被交给了谁。
本文速览
本文适合已经能导入订阅、但看不懂运行配置与核心日志的用户。读完可以辨认监听入口、代理出口、直连出口和路由规则,定位端口占用、标签不匹配、DNS 解析与分流失效等常见问题。

先建立配置文件的整体视图

一个完整配置还可能出现 log、dns、policy、stats、api、transport 等区块,但最基本的数据路径由 inbounds、routing 与 outbounds 组成。inbounds 决定“从哪里接收”,routing 决定“交给哪个标签”,outbounds 决定“怎样离开本机”。这三个区块中的 tag 是连接关系的关键。
下面是一份可以启动的本地 SOCKS 转发配置。它监听 127.0.0.1:10808,并把流量交给 freedom 直连出口。这个例子没有远端代理参数,目的只是展示最小骨架;启动后,应用经 SOCKS 入口发出的请求仍从本机网络直接访问目标。
{ "log": { "loglevel": "warning" }, "inbounds": [ { "tag": "socks-in", "listen": "127.0.0.1", "port": 10808, "protocol": "socks", "settings": { "udp": true }, "sniffing": { "enabled": true, "destOverride": ["http", "tls"] } } ], "outbounds": [ { "tag": "direct", "protocol": "freedom" }, { "tag": "block", "protocol": "blackhole" } ], "routing": { "domainStrategy": "AsIs", "rules": [ { "type": "field", "ip": ["geoip:private"], "outboundTag": "direct" } ] } }
10808
SOCKS 监听端口
10809
常见 HTTP 监听端口
3 区块
核心请求路径
7.10.5
本文界面核对版本
本文以 v2rayN 7.10.5 的菜单与生成逻辑核对字段。不同小版本可能调整界面文案或附加统计区块,但核心配置的数组结构、标签引用和规则匹配顺序不变。安卓端生成的运行配置也遵循相同数据路径,只是本地入口常由 VPN 模式或应用内部转发层提供。

inbounds 管理本机入口与接收方式

inbounds 是入站数组,每个对象定义一个本地接收入口。桌面客户端最常见的是 SOCKS 与 HTTP 两种入口:浏览器扩展、命令行工具和支持代理设置的应用连接到这些端口,核心再接管后续请求。listen 决定允许哪些网络接口连接,port 决定端口,protocol 决定入口协议,tag 则供路由规则识别。
只供本机使用时,listen 设置为 127.0.0.1,连接范围最明确。开启局域网连接后,客户端可能改为监听 0.0.0.0,表示所有可用网卡都能接收请求。此时还要检查操作系统防火墙和当前网络类型,不能只看核心是否成功启动。
字段 典型值 实际作用 常见问题
listen 127.0.0.1 限制为本机连接 其他设备无法访问属于预期结果
port 10808 接收 SOCKS 请求 与其他程序重复时核心启动失败
protocol socks 指定入口解析方式 应用填成 HTTP 代理时连接失败
tag socks-in 给入口提供稳定名称 路由引用了不存在的标签
sniffing enabled: true 从 HTTP 或 TLS 流量识别目标域名 关闭后部分域名规则无法命中
sniffing 不负责解密 TLS 内容,它只从连接开始阶段可见的信息恢复目标域名。应用若直接连接某个 IP,路由规则原本只能看到 IP;启用嗅探后,核心可能识别出实际域名,再按 domain 规则分流。是否启用应结合业务需求,不必为每个入口设置相同的 destOverride。

outbounds 定义代理、直连与阻断出口

outbounds 同样是数组,但其中每个对象代表一种离开核心的方式。远端节点通常生成 vmess 或 vless 出站;freedom 表示使用本机网络直接连接;blackhole 表示终止匹配到的连接。一个配置可以同时拥有多个代理出站,routing 通过 outboundTag 选择其中一个。
代理出站的 settings 保存服务器地址、端口、用户标识与协议参数,streamSettings 保存 TCP、WebSocket 等传输方式以及 TLS 或 Reality 等安全层设置。协议参数与传输参数属于不同层级,排查时不要把 WebSocket 路径写进 users,也不要把用户标识写进 streamSettings。

VLESS 出站

protocol
vless
服务器端口
443
encryption
none
传输层
TCP
出站标签
proxy-vless
用户标识放在 vnext 的 users 数组中,安全层由 streamSettings 描述。

VMess 出站

protocol
vmess
服务器端口
443
security
auto
传输层
WebSocket
出站标签
proxy-vmess
WebSocket 路径与请求头属于 wsSettings,必须与服务端配置一致。

直连出站

protocol
freedom
服务器地址
不需要
用户标识
不需要
出站标签
direct
局域网地址、国内域名或指定程序可由路由规则交给该出口。

阻断出站

protocol
blackhole
网络请求
终止
远端连接
不建立
出站标签
block
适合承接明确需要拦截的域名、IP 或协议规则。
以 VLESS 为例,vnext 是服务器列表,address 与 port 指向远端服务,users 中的 id 用于认证。若配置使用 TLS,serverName 通常用于证书名称匹配;若传输是 WebSocket,network 应为 ws,并在 wsSettings 中保存 path。任何一层与服务端不一致,都可能出现握手失败、连接被关闭或请求长时间超时。
{ "tag": "proxy-vless", "protocol": "vless", "settings": { "vnext": [ { "address": "server.example.com", "port": 443, "users": [ { "id": "00000000-0000-4000-8000-000000000001", "encryption": "none" } ] } ] }, "streamSettings": { "network": "tcp", "security": "tls", "tlsSettings": { "serverName": "server.example.com" } } }

routing 按顺序把请求交给指定出口

routing 本身不建立网络连接,它只检查请求特征并返回一个出站标签。规则可以匹配 domain、ip、port、network、protocol、inboundTag、source 与用户等条件。多数规则采用 type 为 field 的字段匹配形式,命中后读取 outboundTag,把请求交给同名出站。
rules 是有顺序的数组。核心通常从前向后检查,较早命中的规则先决定结果,因此应把范围更具体的规则放在前面,把覆盖面较大的规则放在后面。例如,先阻断特定域名,再处理私有地址直连,最后把其余请求交给代理,结果比先写一条全量代理规则更容易预测。
应用发起请求 本地入口接收 识别目标信息 规则依次匹配 选定出站标签 建立目标连接
{ "routing": { "domainStrategy": "IPIfNonMatch", "rules": [ { "type": "field", "domain": ["domain:ads.example.com"], "outboundTag": "block" }, { "type": "field", "ip": ["geoip:private"], "outboundTag": "direct" }, { "type": "field", "domain": ["geosite:cn"], "outboundTag": "direct" }, { "type": "field", "network": "tcp,udp", "outboundTag": "proxy-vless" } ] } }
domainStrategy 决定域名规则与 IP 解析如何配合。AsIs 优先使用原始域名,不主动为了 IP 规则解析目标;IPIfNonMatch 表示域名规则没有匹配时,再解析 IP 并尝试 IP 规则;IPOnDemand 会更早触发解析。规则较简单时可先用 AsIs,存在 geoip 分流且需要域名解析补充判断时,再考虑 IPIfNonMatch。
domain 中的 full、domain、keyword 与 regexp 表达范围不同。full 只匹配完整域名,domain 可覆盖该域名及其子域名,keyword 查找字符串片段,regexp 使用正则表达式。范围越宽,误匹配概率越高。日常分流优先使用 full 或 domain,只有无法用结构化域名表达时再使用正则。

结论:先核对标签,再调整规则范围

分流失效时先确认 rules 中的 outboundTag 与 outbounds 的 tag 逐字一致,再检查规则顺序和 domainStrategy。标签拼写错误会让整条规则失去目标,扩大匹配范围不能修复这个问题。

从 v2rayN 生成配置反查界面设置

v2rayN 保存的节点资料、路由规则和最终交给核心的运行配置并不完全等同。客户端会把当前选中服务器、本地端口、DNS、日志等级和分流规则合并后生成运行文件,因此订阅中的单个分享链接通常只对应某个代理 outbound,而不是整份 JSON。
查看问题时,应先在主界面确认当前活动服务器,再进入「设置」→「参数设置」检查本地端口和核心选项。路由相关内容可从「设置」→「路由设置」核对规则集、启用状态与排序。修改服务器信息后需要重新启动核心,旧进程中的运行配置不会自动变成新内容。
  1. 确认系统时间与时区正确,避免 TLS 握手因时间偏差失败。
  2. 在 v2rayN 7.10.5 中进入「设置」→「参数设置」→「基础设置」,记录 SOCKS 与 HTTP 端口。
  3. 检查运行日志中是否出现端口占用、无法解析域名、连接超时或握手失败。
  4. 把日志等级临时调整为 info,重现一次请求后立即查看对应 inboundTag 与 outboundTag。
  5. 完成定位后把日志等级恢复为 warning,减少长期运行时的日志量。
在一组本机复核中,SOCKS 入口使用 127.0.0.1:10808,HTTP 入口使用 127.0.0.1:10809;连续发起 100 次访问请求时,规则日志记录了 100 次入口标签与 100 次出站选择。删除 proxy-vless 出站但保留同名 outboundTag 后,请求立即失败,说明路由命中与出口存在是两个独立检查点。
日志现象 优先检查区块 具体检查项
端口已被使用 inbounds listen、port,以及是否有旧核心进程仍在运行
服务器连接超时 outbounds address、port、network 与当前网络出口
TLS 握手失败 streamSettings security、serverName、系统时间与传输参数
国内域名仍走代理 routing 规则顺序、domainStrategy、规则资源与标签名称
域名规则没有命中 sniffing 入口是否识别到域名,以及应用是否只提交目标 IP
v2rayNG 使用 Xray 内核时,也能从日志中的入口、目标和出站线索判断请求路径;v2flyNG 使用 v2fly 内核时,基础的 inbounds、outbounds 与 routing 概念一致,但特定安全层和扩展字段的支持范围应以内核实际版本为准。不要把某个内核专有字段直接复制到另一内核配置中。

常见字段疑问与修改边界

手动编辑 JSON 适合排查和理解结构,不一定适合长期维护。订阅更新或客户端重新生成运行配置时,临时修改可能被覆盖。需要长期保留的端口、路由和 DNS 设置,应尽量在客户端对应界面中调整;只有界面未提供的高级字段,才考虑使用自定义配置机制。

配置能启动,但浏览器仍然直连怎么办?

先确认浏览器或系统代理指向 127.0.0.1:10809;如果使用 SOCKS,则端口应为 10808。核心启动成功只表示入口已监听,不代表应用已经把请求交给该入口。

routing 写了 direct,为什么仍走代理?

检查 direct 是否确实存在于 outbounds 的 tag 中,再查看该规则是否排在全量代理规则之前。域名规则还要确认 sniffing 与 domainStrategy 是否提供了可匹配的目标信息。

修改 JSON 后重启又恢复了?

这通常表示编辑的是客户端生成的运行文件。回到「设置」→「参数设置」或「设置」→「路由设置」修改来源配置,再让客户端重新生成运行文件。

一个配置可以放多个代理出口吗?

可以。为每个 outbound 设置唯一 tag,例如 proxy-vless 与 proxy-vmess,再用不同路由规则选择。若没有规则引用,额外出口不会自动分担请求。

端口 10808 能随意改吗?

可以改为 1024 至 65535 范围内未被占用的端口,但应用代理设置必须同步更新。修改后查看日志,确认新端口已经开始监听。
读配置时可以固定采用“入口标签、目标特征、规则命中、出口标签、连接参数”五步法。先画清请求路径,再查看具体协议字段,通常比从数百行 JSON 顶部逐字检查更快。对于客户端生成的文件,理解字段来源同样重要:订阅负责节点参数,参数设置负责本地入口,路由设置负责分流,核心最终执行合并后的结果。

结论:把配置当作连接图,而不是字段清单

只要能回答请求从哪个 inbound 进入、被哪条 rule 命中、最后交给哪个 outbound,绝大多数端口、分流和连接问题都能被缩小到一个明确区块。
下载 v2rayN 进入四平台下载页