本文速览

配置文件先读流量方向,再读具体字段。本文用一份本地直连示例串起入站、出站、路由和日志,适合已经导入节点、需要定位端口冲突或分流异常的用户。示例不含远端代理节点;读完可以分清客户端保存的节点资料与内核运行配置,并按顺序验证修改结果。

一、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;这是本文示例值,不是所有客户端的默认值。

127.0.0.1
示例回环监听地址
10808
示例 SOCKS 端口
10809
示例 HTTP 端口

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 网卡,可能让同一网络中的其他设备访问代理入口。仅供本机使用时,不要为了排错直接扩大监听范围。

三、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: 则可匹配所写域名及其子域名,两者不能混为一谈。

域名规则还取决于入站拿到什么信息。如果应用已经把目标解析成 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,就回到入站数组确认名称。把标签理解成配置内的连接线,比逐字背字段更容易定位问题。

  1. 用支持纯文本的编辑器保存为 config.json,确保文件没有被另存为富文本。
  2. 对象键名和字符串使用英文双引号;数字端口不要写成带单位的文本。
  3. 数组和对象最后一项后不加逗号。示例按标准 JSON 编写,不添加注释。
  4. 先做内核配置测试,再启动监听。语法通过只说明配置能被接受,不代表远端服务一定可达。

六、日志与客户端界面:从现象定位配置层

log 控制日志输出。常见的 loglevel 包括 debug、info、warning、error 和 none。日常可保留 warning,排错时短暂提高到 info 或 debug;完成后恢复,避免持续积累访问细节。

配置部分界面检查位置需要核对的内容
inboundsv2rayN「设置」→「参数设置」中的本地监听相关项端口、监听范围、入站协议
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

这类测试不会替代真实请求,也不能证明账号、服务器和网络路径正常。通过测试后,才进入“启动内核、确认监听、发送请求、检查出口”的流程。测试时固定同一个目标、同一种接入方式,才容易判断是哪一次修改产生了效果。

  1. 确认实际文件:核对启动参数指向哪个配置文件,防止修改了备份却运行另一份文件。
  2. 确认语法和字段:使用当前内核测试配置。失败时先处理第一条明确错误,后续信息可能只是连带结果。
  3. 确认入口:核对应用的代理类型与端口,确保请求确实进入预期入站。
  4. 确认规则:检查标签引用和规则先后顺序,必要时临时简化为单一出口进行对照。
  5. 确认远端:恢复真实代理配置后,再检查服务器地址、认证和传输安全参数。
  6. 恢复日常设置:撤销临时放宽的监听范围,恢复日志等级,并保存能复现结果的修改记录。

结论:先证明请求进了入站,再排查远端

没有入站记录时,先修应用接入与监听设置;已经进入入站却走错出口时,先修路由。按处理链分层排查,比同时更换端口、协议和节点更容易得到明确结果。