本文速览

适合已经能导入订阅、但看到生成配置仍难以下手的用户。文章从请求经过入站、路由和出站的顺序展开,给出可由核心读取的本地直连样例,并说明 VLESS、VMess 参数应该放在哪一层,以及修改后如何定位 JSON 语法、端口占用和规则顺序问题。

先看懂配置的外层结构

V2Ray 与 Xray 的运行配置通常使用 JSON。最常见的顶层对象包括 loginboundsoutboundsroutingdns。其中真正决定请求如何进入、如何选择路径以及从哪里离开的,是 inbounds、routing、outbounds 三块。

可以把一次连接理解为固定的数据链:浏览器或其他应用先连接本机监听端口,核心识别目标地址,再按路由规则选择一个出站。订阅节点主要填充 outbounds,客户端里的路由模式主要生成 routing,而系统代理设置负责让应用把流量交给 inbounds。

应用发起请求进入本机端口识别目标地址规则匹配分流选择对应出站
10808
SOCKS 入站示例端口
10809
HTTP 入站常用端口
127.0.0.1
仅本机监听地址
3 层
入站、路由、出站

下面这份样例不包含远程节点,而是把 SOCKS 请求从本机直接发出。它适合验证 JSON 结构、端口监听和路由加载是否正常。核心可以读取并运行这份配置,但它不会提供远程代理能力。

{
  "log": {
    "loglevel": "warning"
  },
  "inbounds": [
    {
      "tag": "socks-in",
      "listen": "127.0.0.1",
      "port": 10808,
      "protocol": "socks",
      "settings": {
        "auth": "noauth",
        "udp": true
      },
      "sniffing": {
        "enabled": true,
        "destOverride": ["http", "tls"]
      }
    }
  ],
  "outbounds": [
    {
      "tag": "direct",
      "protocol": "freedom"
    },
    {
      "tag": "blocked",
      "protocol": "blackhole"
    }
  ],
  "routing": {
    "domainStrategy": "AsIs",
    "rules": [
      {
        "type": "field",
        "ip": ["geoip:private"],
        "outboundTag": "direct"
      }
    ]
  }
}

inbounds:本机应用从哪里进入核心

inbounds 是数组,因此一份配置可以同时监听多个入口。例如 SOCKS 监听 10808,HTTP 监听 10809。系统代理通常指向 HTTP 入口,支持 SOCKS 的应用也可以单独连接 127.0.0.1:10808。具体端口由客户端生成配置决定,不应假设所有安装都相同。

listen 决定监听范围。写成 127.0.0.1 时,仅本机程序可以连接;写成局域网地址或全地址监听会改变可访问范围。普通桌面使用保持本机监听即可。若出现“连接被拒绝”,应先确认核心正在运行,再确认应用填写的端口与实际入站端口一致。

SOCKS 本机入口

监听地址
127.0.0.1
监听端口
10808
协议
socks
UDP
true

适合支持 SOCKS5 设置的浏览器、下载工具和命令行程序。

HTTP 本机入口

监听地址
127.0.0.1
监听端口
10809
协议
http
用途
系统代理

端口应以客户端运行日志和生成配置为准。

验证 SOCKS 入口时,可以先观察核心日志是否出现“监听 127.0.0.1:10808”一类记录,再让支持 SOCKS5 的工具连接该地址。若使用域名规则,测试工具应把域名交给代理端解析,避免本地提前解析成 IP 后丢失域名匹配条件。

outbounds:远程协议参数与出口标签

outbounds 同样是数组。第一个出站通常承担默认出口,后续出站可以作为直连、阻断或其他节点。每个出站由 tagprotocolsettings 和可选的 streamSettings 组成。routing 不直接填写服务器地址,而是通过 outboundTag 选择这里定义的出站。

VLESS 与 VMess 的账号信息通常放在 settings.vnext 中,包括服务器地址、端口和用户标识。TCP、WebSocket、TLS 等传输与安全参数位于 streamSettings。两层参数不可混放:远程账号正确但传输路径错误,连接仍会在握手阶段失败。

VLESS + TCP + TLS

出站协议
vless
传输方式
tcp
安全层
tls
用户加密
none
常见端口
443

地址、用户标识、服务器名称和安全参数必须与服务端配置一致。

VMess + WebSocket + TLS

出站协议
vmess
传输方式
ws
路径
/ws
安全层
tls
常见端口
443

WebSocket 路径、Host 与 TLS 服务器名称需要逐项核对。

{
  "tag": "proxy-main",
  "protocol": "vless",
  "settings": {
    "vnext": [
      {
        "address": "edge.example.com",
        "port": 443,
        "users": [
          {
            "id": "00000000-0000-4000-8000-000000000001",
            "encryption": "none"
          }
        ]
      }
    ]
  },
  "streamSettings": {
    "network": "tcp",
    "security": "tls",
    "tlsSettings": {
      "serverName": "edge.example.com"
    }
  }
}

上面的地址和用户标识仅用于展示字段位置,不能作为真实节点连接。真实配置应由订阅或服务端参数生成。手动核对时,先看 protocol,再看 addressport,随后核对用户标识,最后检查 network、TLS 服务器名称和 WebSocket 路径。

freedom 表示直接连接目标,常用标签是 direct;blackhole 用于终止匹配到的连接,常用标签是 blocked。它们不需要远程服务器参数。配置里同时保留 proxy、direct、blocked 三类出站后,routing 才能分别完成代理、直连和阻断。

结论:先核对协议层,再核对传输层

日志出现认证或用户标识错误时检查 settings;出现 TLS、WebSocket 路径或连接关闭错误时检查 streamSettings。按层定位比反复更换端口更有效。

routing:规则按顺序匹配,不按名称推断

routing.rules 是有顺序的规则数组。核心从第一条向后检查,命中后使用该规则的 outboundTag,通常不会继续用后面的规则覆盖结果。因此,更具体的规则应放在前面,更宽泛的兜底规则放在后面。

type: "field" 表示按字段条件匹配。常见条件包括 domainipportnetworkinboundTagprotocol。同一条规则里放入多个不同类型条件时,通常需要同时满足;同一字段内的多个值则用于匹配其中任意一个。

规则位置 匹配条件 出站标签 作用
第 1 条 domain: domain:example.net blocked 阻断指定域名
第 2 条 ip: geoip:private direct 局域网与私有地址直连
第 3 条 domain: geosite:cn direct 匹配对应域名集合
未命中 无显式条件 默认出站 通常使用第一个 outbound
{
  "routing": {
    "domainStrategy": "IPIfNonMatch",
    "rules": [
      {
        "type": "field",
        "domain": ["domain:example.net"],
        "outboundTag": "blocked"
      },
      {
        "type": "field",
        "ip": ["geoip:private"],
        "outboundTag": "direct"
      },
      {
        "type": "field",
        "domain": ["geosite:cn"],
        "outboundTag": "direct"
      },
      {
        "type": "field",
        "network": "tcp,udp",
        "outboundTag": "proxy-main"
      }
    ]
  }
}

domainStrategy: "AsIs" 主要按请求中已有的域名或 IP 处理;IPIfNonMatch 会在域名规则未命中时尝试解析 IP,再让 IP 规则参与判断。选择策略时要考虑 DNS 配置和 sniffing 结果,而不是简单把解析次数更多的选项视为更快。

最后一条 network: "tcp,udp" 是宽泛兜底。若把它移到第一条,绝大多数 TCP 与 UDP 请求都会直接命中 proxy-main,后面的私有地址直连规则将失去作用。这也是“规则看起来都在,但分流不生效”的常见原因。

结论:路由异常先查第一条命中规则

把目标域名、解析结果和规则顺序放在一起检查。只确认某条规则存在还不够,它必须排在更宽泛的规则之前,并引用一个真实存在的 outbound 标签。

客户端生成配置该改哪里

v2rayN 7.x 会根据节点、路由和核心选项生成运行配置。直接改运行时文件可能只在当前进程有效,下次切换节点、更新订阅或重启核心时就会重新生成。需要长期保留的修改,应尽量从客户端对应界面完成。

查看基础选项可进入「设置」→「参数设置」;调整节点参数可从「服务器」列表选择目标后进入编辑界面;路由相关内容应在「设置」→「路由设置」中维护。不同小版本的菜单名称可能有细微调整,但修改目标仍然对应入站、节点出站和路由规则三层。

  1. 先复制当前可用配置或导出客户端设置,保留回退基线。
  2. 一次只改一个字段,例如只调整监听端口,保存后立即重启核心。
  3. 先确认 JSON 能加载,再测试本机端口,最后测试具体域名的路由结果。
  4. 若修改路由,记录目标域名、命中的规则和最终 outboundTag。
  5. 订阅更新后重新核对自定义设置,确认客户端没有用订阅字段覆盖本地调整。

v2rayNG 使用 Xray 内核时也会生成对应运行配置,字段思路与桌面端相近;v2flyNG 使用 v2fly 内核时,应以该内核实际支持的协议和字段为准。某些 Xray 扩展参数不能直接复制到 v2fly 内核配置中,看到未知字段错误时应先确认核心家族。

加载失败与分流异常的排查顺序

配置问题可以分成三类:JSON 无法解析、核心能够启动但入站不可用、核心与入站正常但路由结果不符合预期。按这个顺序检查,可以避免把语法错误误判为节点故障。

保存后核心立即退出,先看哪里?

先查看核心日志最前面的错误行。若提示 invalid character、unexpected token 或缺少分隔符,检查双引号、逗号和方括号。JSON 最后一项后不能保留逗号。

10808 端口无法连接怎么办?

确认 inbounds 中的 listen 为 127.0.0.1、port 为 10808,并查看日志是否提示 address already in use。若端口被占用,改为 10810 后还要同步修改应用里的 SOCKS 地址。

节点可用,但指定域名没有直连?

检查域名是否被 sniffing 识别,再看宽泛代理规则是否排在直连规则之前。将具体 domain 规则移到 network 兜底规则上方,重启核心后重新建立连接。

日志提示找不到 outboundTag?

逐字核对 routing 里的 outboundTag 与 outbounds 中的 tag。proxy-main、proxy_main 和 Proxy-Main 会被视为不同名称,删除出站时也要同步清理引用它的规则。

域名规则存在,IP 规则却没有参与匹配?

检查 domainStrategy。需要在域名未命中后继续解析 IP 时可使用 IPIfNonMatch,并确认 DNS 能返回结果。修改后应断开旧连接再测,避免沿用已有会话。

端口测试通过后,再观察远程握手日志。VLESS 与 VMess 的地址、端口、用户标识、传输方式和安全层必须形成完整组合。只改其中一个字段可能让 TCP 建连成功,但随后在 TLS、WebSocket 或协议认证阶段中断。

验证 routing 时不要只看网页是否打开。更可靠的方法是打开核心访问日志,确认目标域名或 IP 对应的 outboundTag。修改规则后关闭旧连接并重新请求,因为已经建立的长连接不会自动切换到新出站。

  • 第一步:确认 JSON 解析成功,核心没有在启动阶段退出。
  • 第二步:确认 127.0.0.1 与入站端口正在监听,应用代理地址完全一致。
  • 第三步:确认远程出站协议、端口、用户参数和传输参数一致。
  • 第四步:确认目标请求命中了预期规则,并选中了存在的 outboundTag。
  • 第五步:重新建立连接,排除旧会话和缓存结果对测试的干扰。

读懂配置的关键不是记住所有字段,而是保持层次清楚:inbounds 解决“流量怎样进入”,outbounds 解决“流量从哪里离开”,routing 解决“这一条请求选择哪个出口”。遇到错误时沿着实际请求方向逐层检查,通常能把问题缩小到一个端口、一条规则或一组协议参数。