配置文件先读流量方向,再读具体字段。本文用一份本地直连示例串起入站、出站、路由和日志,适合已经导入节点、需要定位端口冲突或分流异常的用户。示例不含远端代理节点;读完可以分清客户端保存的节点资料与内核运行配置,并按顺序验证修改结果。
一、V2Ray 配置结构:先区分客户端与内核
先给结论:inbounds 决定从哪里接收请求,outbounds 决定怎样建立后续连接,routing 决定把请求交给哪个出站。它们不是三个独立开关,而是一条处理链上的三个环节。
v2rayN 是桌面客户端,负责保存节点、管理订阅、生成运行配置并启动所选内核。安卓端的 v2rayNG 使用 Xray 内核,v2flyNG 使用 V2Fly 内核。客户端名称相近,不代表它们接受完全相同的配置字段。排查前应先从日志或关于页面确认实际运行的内核及版本。
本文采用常见的传统 JSON 配置结构。V2Ray 与 Xray 在这套结构上有共同部分,但功能支持仍要以各自版本为准。例如 REALITY、xtls-rprx-vision 等配置不能因为出现在某份 Xray 示例里,就直接套进 V2Fly 的配置。分享链接、订阅内容也不一定是完整的运行配置,不能把地址粘进 JSON 文件就交给内核执行。
二、inbounds 入站:地址、端口与协议分别管什么
入站是内核接收流量的入口,不是远端服务器。浏览器连接本机 SOCKS 端口时,请求先到入站,再由内核选择出站。下面把 SOCKS 监听口设为 10808,HTTP 监听口设为 10809;这是本文示例值,不是所有客户端的默认值。
SOCKS 入站
- listen
127.0.0.1- port
10808- protocol
socks- tag
socks-in
应用应选择 SOCKS5,并填写同一地址和端口。
HTTP 入站
- listen
127.0.0.1- port
10809- protocol
http- tag
http-in
HTTP 代理也可通过 CONNECT 转发 HTTPS 连接,并非只能访问 HTTP 网站。
listen 是监听地址。127.0.0.1 只接收本机连接;改成 0.0.0.0 会监听所有 IPv4 网卡,可能让同一网络中的其他设备访问代理入口。仅供本机使用时,不要为了排错直接扩大监听范围。
- 端口占用:出现
address already in use或绑定失败时,先检查是否有另一个内核进程占用同一地址与端口。 - 协议错配:把 HTTP 代理请求发给 SOCKS 入口,即使端口可连接,也可能在握手阶段失败。
- 标签用途:
tag是配置内的引用名称。它不是密码,但后续路由引用时必须逐字一致。 - UDP 范围:SOCKS 配置允许 UDP,不等于系统中所有应用的 UDP 流量都会自动进入该入站。
三、outbounds 出站:节点参数与默认出口
出站描述内核如何向外连接。远端代理通常需要服务器地址、端口、用户凭据和传输安全参数;直连出站则直接连接目标服务。在本文使用的传统配置结构中,没有规则命中时,默认使用 outbounds 数组的第一项。因此,数组顺序也会影响实际流向。
| 字段或协议 | 具体作用 | 检查重点 |
|---|---|---|
tag | 供路由规则引用该出站 | 与 outboundTag 完全一致 |
freedom | 直接连接目标地址 | 代表直连,不是远端代理 |
blackhole | 丢弃交给它的流量 | 检查是否被规则意外命中 |
settings | 保存对应协议的参数 | 结构随出站协议变化 |
streamSettings | 配置传输方式及传输安全 | 须与服务端配置相符 |
VMess、VLESS、Trojan 和 Shadowsocks 不能共用一套 settings。同样叫“端口”的字段,也要分清本地监听端口与远端服务端口。前者解决应用如何接入本机,后者解决内核如何连接服务器,修改其中一个不会自动修复另一个。
以 VMess 为例,用户信息位于协议规定的用户数组中;TLS 则属于传输安全设置。WebSocket 的路径、TLS 的服务器名称与远端地址也不一定相同。订阅导入后连不上时,应逐项对照服务提供方给出的参数,而不是把所有名称都改成服务器地址。
结论:先核对默认出站,再查分流规则
如果未命中的请求都在直连,先看数组第一项是否为 freedom。不要只修改规则中的代理标签,却忽略默认出口仍然是直连。
四、routing 路由:规则顺序与域名解析时机
路由不是按“看起来更精确”自动挑选规则,而是按配置顺序检查,第一条匹配的规则决定出口。宽泛规则放在前面,可能让后面的细分规则永远没有机会生效。同一条规则里同时写入站、域名和端口等不同条件时,通常需要这些条件一起满足。
{
"domainStrategy": "AsIs",
"rules": [
{
"type": "field",
"domain": ["full:example.invalid"],
"outboundTag": "block"
},
{
"type": "field",
"inboundTag": ["socks-in", "http-in"],
"outboundTag": "direct"
}
]
}
这段规则先把 example.invalid 的精确域名匹配交给 block,再把来自两个本地入口的其他请求交给 direct。该域名用于说明匹配语法,不是可用的远端服务地址。full: 表示完整域名匹配;domain: 则可匹配所写域名及其子域名,两者不能混为一谈。
- AsIs:路由阶段保留原有目标形式,不专门为了 IP 规则解析域名。直连出站后续仍可能为建立连接解析域名。
- IPIfNonMatch:域名未匹配规则时,尝试解析并继续进行 IP 规则匹配。
- IPOnDemand:匹配过程需要检查 IP 条件时,可触发域名解析。
域名规则还取决于入站拿到什么信息。如果应用已经把目标解析成 IP,再把 IP 交给代理,内核不一定知道原始域名。嗅探能在部分协议流量中提取域名线索,但它不是对所有请求都有效的补救措施,也不等于配置了 DNS 分流。
五、完整 JSON 示例:两个入站、直连与阻断
下面是一份完整的传统格式示例,只演示结构,不提供远端代理能力。它监听本机两个端口,默认直连,并阻断一个示例域名。已有客户端正在使用这些端口时,应先停止对应进程或换成未占用的端口,避免把端口冲突误认为配置语法错误。
{
"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",
"domain": ["full:example.invalid"],
"outboundTag": "block"
},
{
"type": "field",
"inboundTag": ["socks-in", "http-in"],
"outboundTag": "direct"
}
]
}
}
阅读时可以从任意一个引用反向查找:看到 outboundTag: "block",就去出站数组找 tag: "block";看到 inboundTag,就回到入站数组确认名称。把标签理解成配置内的连接线,比逐字背字段更容易定位问题。
- 用支持纯文本的编辑器保存为
config.json,确保文件没有被另存为富文本。 - 对象键名和字符串使用英文双引号;数字端口不要写成带单位的文本。
- 数组和对象最后一项后不加逗号。示例按标准 JSON 编写,不添加注释。
- 先做内核配置测试,再启动监听。语法通过只说明配置能被接受,不代表远端服务一定可达。
六、日志与客户端界面:从现象定位配置层
log 控制日志输出。常见的 loglevel 包括 debug、info、warning、error 和 none。日常可保留 warning,排错时短暂提高到 info 或 debug;完成后恢复,避免持续积累访问细节。
| 配置部分 | 界面检查位置 | 需要核对的内容 |
|---|---|---|
inbounds | v2rayN「设置」→「参数设置」中的本地监听相关项 | 端口、监听范围、入站协议 |
outbounds | 节点列表中编辑当前节点 | 远端地址、端口、用户信息、传输与安全参数 |
routing | 当前路由方案及规则编辑界面 | 规则顺序、目标出口、是否启用该方案 |
log | 日志等级设置与运行日志区域 | 启动失败信息及发生时间 |
不同客户端版本的菜单名称可能调整,表格用于对应概念,不代表所有版本都具有相同层级。安卓端还要分清 VPN 接管与本地代理监听:v2rayNG、v2flyNG 可以通过系统 VPN 机制接收流量,不能直接把桌面端系统代理的判断套过去。
桌面端开启系统代理,只是通知遵循系统代理设置的应用使用指定入口,不保证所有应用都经过内核。若日志完全没有该应用的连接记录,应先查流量是否进入入站;不要直接改远端节点。有关接管方式可继续查阅使用文档,连接异常可对照连接问题说明。
- 启动即退出
- 优先查 JSON 解析错误、不支持的字段、端口绑定失败和数据资源缺失。
- 本地端口能连,访问失败
- 继续查路由选择、远端连接、认证、TLS 握手与 DNS 解析,不把“端口开放”等同于“代理可用”。
- 只有部分网站异常
- 记录具体域名与时间,检查是否命中阻断或直连规则,再比较同一节点下的结果。
七、配置验证顺序:一次只改一个变量
命令行测试适合确认内核是否接受配置。以下两条分别对应 V2Ray 5.x 与 Xray 的常见命令形式,只运行与实际内核相符的一条;可执行文件路径和当前工作目录需要自行确认。若版本不同,先查看该程序的帮助输出。
v2ray test -c config.json
xray run -test -config config.json
这类测试不会替代真实请求,也不能证明账号、服务器和网络路径正常。通过测试后,才进入“启动内核、确认监听、发送请求、检查出口”的流程。测试时固定同一个目标、同一种接入方式,才容易判断是哪一次修改产生了效果。
- 确认实际文件:核对启动参数指向哪个配置文件,防止修改了备份却运行另一份文件。
- 确认语法和字段:使用当前内核测试配置。失败时先处理第一条明确错误,后续信息可能只是连带结果。
- 确认入口:核对应用的代理类型与端口,确保请求确实进入预期入站。
- 确认规则:检查标签引用和规则先后顺序,必要时临时简化为单一出口进行对照。
- 确认远端:恢复真实代理配置后,再检查服务器地址、认证和传输安全参数。
- 恢复日常设置:撤销临时放宽的监听范围,恢复日志等级,并保存能复现结果的修改记录。
结论:先证明请求进了入站,再排查远端
没有入站记录时,先修应用接入与监听设置;已经进入入站却走错出口时,先修路由。按处理链分层排查,比同时更换端口、协议和节点更容易得到明确结果。