适合已经导入订阅、但看不懂配置文件的读者。先用一份只含本地入口、直连与阻断的完整样本,串起请求路径,再解释端口、出站标签、规则顺序和 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"
]
}
}
这里的端口是样本明确设定的值,不是所有客户端版本的默认值。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,因此不要只为了排错就扩大监听范围。
- 应用连不上入口:先比较应用中的代理类型和端口,HTTP 代理不要填到 SOCKS 端口。
- 内核提示端口被占用:检查是否同时运行了两个客户端实例,或旧内核进程尚未退出。
- 浏览器未进入代理:确认系统代理或浏览器自己的代理设置是否启用。内核启动不会自动改变所有应用的网络路径。
在 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 规则按数组顺序检查,命中后选择对应出口,不会继续寻找“更精确”的后续规则。样本先阻断指定域名,再让两个入口的其他连接直连。如果把这两条规则交换,入口规则会先匹配,域名阻断便无法生效。
- 收到目标地址:应用通过入口提交域名或 IP 地址,内核据此进行路由判断。
- 检查第一条规则:
domain:example.org匹配该域名及其子域名,匹配后选择block。 - 检查第二条规则:第一条未命中时,来自
local-socks或local-http的连接选择direct。 - 处理未命中连接:若还有其他入口且没有匹配规则,按默认出站行为处理。
同一条规则里的不同条件通常需要同时满足;同一条件数组里的多个值通常表示任选其一。例如在一条规则中同时写 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,要看路由策略、出站设置及实际请求类型。
AsIs:路由阶段使用已有的目标信息,不为了 IP 规则主动解析域名。样本采用此值,方便观察域名规则。IPIfNonMatch:域名规则未匹配时,可以解析目标域名,再尝试 IP 规则。IPOnDemand:匹配过程遇到需要 IP 的规则时,可以触发域名解析。
这些值属于 routing.domainStrategy,不要和某个出站自己的 domainStrategy 混为一谈。路由决定“走哪个出口”,出站的解析策略则影响“如何连接目标”;名字相似,作用阶段不同。
若配置中出现 geoip: 或 geosite: 条件,还要检查运行环境是否具备对应的数据资源。本文样本没有使用这些条件,避免把数据文件缺失与 JSON 结构问题混在一起。
7. log 与安全微调:一次只改一个变量
样本的 loglevel 为 warning,适合关注警告和错误,但未必能看到每次连接的路由细节。需要定位问题时,可临时使用 info;更详细的 debug 适合短时间诊断。日志可能包含目标域名和地址,转发给他人前应先移除敏感内容。
- 确认配置来源:先分清这是客户端生成的运行文件,还是单独管理的自定义配置。不要随意编辑安装目录里名称相似的文件。
- 保存原状态:记录当前选中节点、系统代理状态和监听端口,保留原配置副本,方便回退。
- 优先改图形设置:本地端口从 v2rayN 的「设置」→「参数设置」调整;分流规则从「设置」→「路由设置」检查。具体名称以所用版本为准。
- 每次只改一项:先改端口并检查入口,再改规则顺序。不要同时修改 DNS、传输参数和出站标签。
- 重载后看首条错误:先解决 JSON 解析、端口监听或标签引用错误,再判断网络是否可达。
- 恢复日常日志级别:完成排查后调回合适级别,避免长期保留大量详细连接记录。
结论:客户端生成的文件应从配置来源修改
如果手动编辑的 config.json 在切换节点后被恢复,先回到对应的客户端设置修改来源。只有确认使用自定义配置且了解加载方式时,才直接维护整份 JSON。
v2rayN 是桌面客户端;安卓端的 v2rayNG 使用 Xray 内核,v2flyNG 使用 V2Fly 内核。它们的导入入口和支持字段存在差异。订阅能导入,只说明客户端完成了解析,不代表其中每种协议组合都适用于当前运行内核。
8. 配置报错与网页打不开的定位顺序
把问题分成“配置是否加载”“应用是否进入代理”“路由是否选对”“出口是否连通”四层,通常比反复重导订阅更有效。下面的现象用于缩小范围,不应仅凭某一行日志就断定服务器故障。
| 现象 | 先检查 | 下一步动作 |
|---|---|---|
| 内核启动即退出 | 括号、逗号、字段类型与首条启动错误 | 恢复最后一次修改,比较改动前后的配置 |
| 提示地址已被使用 | 10808、10809 是否被其他进程监听 | 关闭重复实例,或在客户端中调整端口并同步应用设置 |
| 找不到目标出站 | outboundTag 与出站 tag 是否完全一致 | 修正引用,避免大小写或拼写差异 |
| 域名阻断不生效 | 规则先后顺序、入口标签及目标是否仍为域名 | 先确认匹配条件,不要直接改成全局阻断 |
| 配置加载但网页超时 | 应用代理类型、当前出口、目标解析与连接错误 | 分开测试入口和出口,区分直连失败与远程代理失败 |
最后记住三个边界:入口端口不等于远程服务器端口;出站标签不等于协议名称;DNS 配置不等于系统流量接管。先把这三组概念分开,再读真实节点配置,复杂的传输参数就更容易放回正确的位置。