本文速览

适合已经导入订阅、但看不懂配置文件的读者。先用一份只含本地入口、直连与阻断的完整样本,串起请求路径,再解释端口、出站标签、规则顺序和 DNS 的边界。样本不包含远程代理服务器,不能代替订阅;读完可以判断应当修改客户端设置,还是检查内核配置。

1. config.json 的五个主要区段

config.json 是内核读取的配置文件,不是订阅链接,也不是客户端的全部设置。v2rayN 管理节点、订阅分组和界面选项,再把当前选择转换成内核运行所需的配置。文件名相同,不代表 V2Ray 与 Xray 的所有字段都可以互换。

应用请求 本地入站 路由匹配 选定出站 目标服务

阅读顺序不必照着文件从上到下。先找 inbounds 确认请求从哪里进来,再看 routing 如何选择路径,最后用 outbounds 找到实际出口。log 帮助排错,dns 提供内核需要时使用的域名解析设置。

顶层字段主要职责优先核对
log配置日志级别及输出位置错误信息是否被当前级别记录
inbounds接收浏览器等应用的连接监听地址、端口和入口协议
outbounds定义直连、阻断或远程代理出口协议、标签和服务器参数
routing按规则把连接交给某个出站规则顺序与目标标签
dns配置内置 DNS 解析器解析器地址及实际调用条件

2. 完整样本:本地入口、直连与域名阻断

下面使用 V2Ray 与 Xray 常见的传统 JSON 字段,便于对照理解。它提供两个仅限本机访问的入口:SOCKS 端口 10808 和 HTTP 端口 10809。访问 example.org 及其子域名的连接被阻断,其余进入这两个入口的连接走直连。

{
  "log": {
    "loglevel": "warning"
  },
  "inbounds": [
    {
      "tag": "local-socks",
      "listen": "127.0.0.1",
      "port": 10808,
      "protocol": "socks",
      "settings": {
        "auth": "noauth",
        "udp": false
      }
    },
    {
      "tag": "local-http",
      "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": [
          "domain:example.org"
        ],
        "outboundTag": "block"
      },
      {
        "type": "field",
        "inboundTag": [
          "local-socks",
          "local-http"
        ],
        "outboundTag": "direct"
      }
    ]
  },
  "dns": {
    "servers": [
      "1.1.1.1"
    ]
  }
}
10808
样本 SOCKS 入口端口
10809
样本 HTTP 入口端口
2 条
按先后顺序匹配的路由规则

这里的端口是样本明确设定的值,不是所有客户端版本的默认值。JSON 中对象使用花括号,数组使用方括号;键名和字符串必须使用英文双引号,最后一个成员后面不加逗号。为了便于在不同内核间阅读,本样本不使用注释语法。

3. inbounds:监听地址、端口与入口协议

inbounds 是数组,所以同一个内核可以提供多个本地入口。listen 决定监听哪张网络接口,port 决定应用要连接的端口,protocol 决定应用应当使用哪种代理协议。这三项必须一起看,不能只记端口号。

SOCKS 本地入口

tag
local-socks
listen
127.0.0.1
port
10808
protocol
socks
udp
false

应用需选择 SOCKS 代理;本样本不接收 SOCKS UDP 转发。

HTTP 本地入口

tag
local-http
listen
127.0.0.1
port
10809
protocol
http
settings
{},使用默认设置

应用需选择 HTTP 代理;HTTPS 目标通常通过 CONNECT 建立隧道。

127.0.0.1 只允许本机连接。改成 0.0.0.0 会监听所有 IPv4 接口,可能让局域网中的其他设备访问入口。样本 SOCKS 入口采用 noauth,因此不要只为了排错就扩大监听范围。

在 v2rayN 中,可从「设置」→「参数设置」查找本地监听端口相关选项,再从主窗口的「系统代理」菜单选择「自动配置系统代理」。不同界面版本的选项位置可能调整,以当前界面显示的名称和实际端口为准。

4. outbounds:出站协议与 tag 的对应关系

outbounds 也是数组,但它描述的是请求离开内核的方式。样本中的 freedom 表示直接连接目标,blackhole 表示阻断。direct 和 block 只是自定义标签,并不是协议名称。

字段或协议样本中的作用修改时的边界
tag让路由规则引用某个出站改名后同步修改所有引用,注意大小写
freedom直接连接目标地址它不是远程代理,也不提供代理服务器
blackhole终止匹配的连接它不是备用出口,也不会自动切换节点
settings承载当前协议的参数不同协议的内容不能照搬

实际代理出站还需要服务器地址、端口、用户标识及与服务端一致的传输、安全设置。VMess 与 VLESS 的用户参数不同,TLS、REALITY、WebSocket 等设置也有各自的位置和适用条件。不能把 "protocol": "freedom" 改成 "vless" 就当作完成配置。

结论:先核对标签,再检查服务器参数

当路由指向 proxy 时,先确认出站数组中确实存在 "tag": "proxy"。标签引用正确后,再查节点参数;否则即使服务器信息完整,请求也没有被正确送往预期出站。

没有规则命中的连接,通常使用出站数组的第一个出站。这个默认行为不等于自动故障切换。样本把 direct 放在第一位,同时用第二条规则明确接住两个本地入口,便于看清匹配结果。

5. routing:规则顺序与域名匹配

常见 field 规则按数组顺序检查,命中后选择对应出口,不会继续寻找“更精确”的后续规则。样本先阻断指定域名,再让两个入口的其他连接直连。如果把这两条规则交换,入口规则会先匹配,域名阻断便无法生效。

  1. 收到目标地址:应用通过入口提交域名或 IP 地址,内核据此进行路由判断。
  2. 检查第一条规则:domain:example.org 匹配该域名及其子域名,匹配后选择 block。
  3. 检查第二条规则:第一条未命中时,来自 local-socks 或 local-http 的连接选择 direct。
  4. 处理未命中连接:若还有其他入口且没有匹配规则,按默认出站行为处理。

同一条规则里的不同条件通常需要同时满足;同一条件数组里的多个值通常表示任选其一。例如在一条规则中同时写 inboundTag 和 domain,含义是“来自这些入口,并且目标域名匹配”,不是两个条件任意满足就通过。

写法匹配含义阅读提示
domain:example.org域名本身及其子域名适合按整个域名范围分类
full:example.org精确匹配这个完整域名不会同时涵盖所有子域名
inboundTag匹配连接进入时的入站标签不是服务器名称或订阅分组名
outboundTag指定命中后采用的出站标签必须对应已有出站

样本没有配置流量嗅探。如果应用已经把域名解析成 IP,并且只把 IP 交给内核,域名规则就未必能匹配。此时应先确认应用是否把域名交给代理,而不是立即扩大阻断规则。域名分流也不能用来匹配网址中的路径,例如 /account 不属于这里的域名条件。

6. dns:解析器配置不等于全系统 DNS 接管

dns.servers 定义内置 DNS 使用的服务器,样本的 1.1.1.1 是一个明确的解析器地址。写入这个地址,不代表系统 DNS 已被修改,也不代表浏览器自己的加密 DNS 会经过它;是否调用内置 DNS,要看路由策略、出站设置及实际请求类型。

这些值属于 routing.domainStrategy,不要和某个出站自己的 domainStrategy 混为一谈。路由决定“走哪个出口”,出站的解析策略则影响“如何连接目标”;名字相似,作用阶段不同。

若配置中出现 geoip: 或 geosite: 条件,还要检查运行环境是否具备对应的数据资源。本文样本没有使用这些条件,避免把数据文件缺失与 JSON 结构问题混在一起。

7. log 与安全微调:一次只改一个变量

样本的 loglevel 为 warning,适合关注警告和错误,但未必能看到每次连接的路由细节。需要定位问题时,可临时使用 info;更详细的 debug 适合短时间诊断。日志可能包含目标域名和地址,转发给他人前应先移除敏感内容。

  1. 确认配置来源:先分清这是客户端生成的运行文件,还是单独管理的自定义配置。不要随意编辑安装目录里名称相似的文件。
  2. 保存原状态:记录当前选中节点、系统代理状态和监听端口,保留原配置副本,方便回退。
  3. 优先改图形设置:本地端口从 v2rayN 的「设置」→「参数设置」调整;分流规则从「设置」→「路由设置」检查。具体名称以所用版本为准。
  4. 每次只改一项:先改端口并检查入口,再改规则顺序。不要同时修改 DNS、传输参数和出站标签。
  5. 重载后看首条错误:先解决 JSON 解析、端口监听或标签引用错误,再判断网络是否可达。
  6. 恢复日常日志级别:完成排查后调回合适级别,避免长期保留大量详细连接记录。

结论:客户端生成的文件应从配置来源修改

如果手动编辑的 config.json 在切换节点后被恢复,先回到对应的客户端设置修改来源。只有确认使用自定义配置且了解加载方式时,才直接维护整份 JSON。

v2rayN 是桌面客户端;安卓端的 v2rayNG 使用 Xray 内核,v2flyNG 使用 V2Fly 内核。它们的导入入口和支持字段存在差异。订阅能导入,只说明客户端完成了解析,不代表其中每种协议组合都适用于当前运行内核。

8. 配置报错与网页打不开的定位顺序

把问题分成“配置是否加载”“应用是否进入代理”“路由是否选对”“出口是否连通”四层,通常比反复重导订阅更有效。下面的现象用于缩小范围,不应仅凭某一行日志就断定服务器故障。

现象先检查下一步动作
内核启动即退出括号、逗号、字段类型与首条启动错误恢复最后一次修改,比较改动前后的配置
提示地址已被使用10808、10809 是否被其他进程监听关闭重复实例,或在客户端中调整端口并同步应用设置
找不到目标出站outboundTag 与出站 tag 是否完全一致修正引用,避免大小写或拼写差异
域名阻断不生效规则先后顺序、入口标签及目标是否仍为域名先确认匹配条件,不要直接改成全局阻断
配置加载但网页超时应用代理类型、当前出口、目标解析与连接错误分开测试入口和出口,区分直连失败与远程代理失败

最后记住三个边界:入口端口不等于远程服务器端口;出站标签不等于协议名称;DNS 配置不等于系统流量接管。先把这三组概念分开,再读真实节点配置,复杂的传输参数就更容易放回正确的位置。