本文适合已经接触 v2rayN、需要读懂内核运行配置的用户。先运行仅含本机入站、直连与阻断出站的 JSON,再沿着「应用 → 入站 → 路由 → 出站」检查每个字段。示例不需要远程节点,能验证监听端口、标签引用和规则顺序;接入 VMess 或 VLESS 时,再按服务端参数替换出站。
1. 配置链路:先分清客户端、内核与 JSON
inbounds 负责接收应用交来的流量,outbounds 负责把流量发往目标或远程服务器,routing 在两者之间选择出站。JSON 是配置格式,不是节点协议;文件扩展名相同,也不代表不同内核可以互换整份配置。
v2rayN 是桌面客户端,提供订阅管理、服务器编辑和路由设置界面;真正监听端口与处理连接的是所选内核。安卓端的 v2rayNG 使用 Xray 内核,v2flyNG 使用 V2Fly 内核。排查字段兼容性时,应先确定实际启动的内核,而不是只看客户端名称。
两种配置入口:界面生成与手动维护
客户端生成配置
- 通过订阅或服务器编辑窗口填写节点参数。
- 客户端组合本地端口、DNS 与路由规则后交给内核。
- 生成文件可能在切换服务器或重启内核时被覆盖。
独立 JSON 配置
- 手动维护完整的入站、出站和标签引用。
- 先在独立目录中用内核命令验证配置。
- 导入客户端前,确认它对自定义配置的处理方式。
学习结构先使用独立文件;日常订阅节点优先在客户端对应设置入口修改,避免编辑临时生成文件。
下文采用 V2Ray 传统 JSON 配置结构中的基础字段,并以 Xray 命令演示验证。V2Fly 的不同主版本还可能涉及配置格式和命令差异;尤其是 TLS、REALITY、传输层设置,不应跨内核直接照搬。
2. 最小可运行配置:两个入站、两个出站
将以下内容保存为 UTF-8 编码的 config.json。它在本机开启 SOCKS 和 HTTP 代理端口,正常流量直接联网;只有从 HTTP 入站进入、且目标域名为 example.com 的请求被阻断。这里的「代理端口」是本地接入方式,不表示连接经过远程代理服务器。
{
"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",
"inboundTag": ["http-in"],
"domain": ["full:example.com"],
"outboundTag": "block"
},
{
"type": "field",
"ip": [
"10.0.0.0/8",
"172.16.0.0/12",
"192.168.0.0/16"
],
"outboundTag": "direct"
}
]
},
"dns": {
"servers": ["localhost"]
}
}
这些端口是本文的明确配置值,不是所有客户端版本的默认值。运行前先退出占用相同端口的代理进程,或同时修改 JSON 和测试命令中的端口。示例不启用系统代理,也不启用 TUN,只有明确指定这些端口的应用请求才会进入内核。
3. inbounds:监听地址、端口与入站标签
inbounds 是数组,每个对象是一组入口。listen 决定接受哪个本地地址上的连接,port 决定监听端口,protocol 决定应用与内核之间使用什么协议。应用填错协议时,即使端口能连接,也无法正常转发请求。
SOCKS 入口
- tag
socks-in- listen
127.0.0.1- port
10808- protocol
socks- udp
true
应用选择 SOCKS5;是否使用 UDP,还取决于应用本身及后续出站能力。
HTTP 入口
- tag
http-in- listen
127.0.0.1- port
10809- protocol
http- settings
{}
应用选择 HTTP 代理;HTTPS 目标通常通过 HTTP CONNECT 建立隧道。
127.0.0.1 只允许本机访问。将它改为 0.0.0.0 会扩大 IPv4 监听范围,不能当作普通的兼容性修复。尤其是示例 SOCKS 入口使用 noauth,不应直接暴露给不可信网络。
- 标签不是固定关键字:
socks-in可以改名,但所有引用它的inboundTag也要同步修改。 - 协议不是节点协议:本地 SOCKS 入站可以连接 VMess 出站,也可以连接直连出站,两端协议不必相同。
- UDP 不是总开关:
udp: true只开放 SOCKS 入站的相关能力,不会把普通 HTTP 入站变成 UDP 入口。
4. outbounds:默认出站与远程节点的区别
outbounds 定义可用的出口。示例中的 direct 使用 freedom,直接连接目标;block 使用 blackhole,丢弃匹配的连接。当没有规则匹配时,普通路由行为会使用出站数组中的第一个出站,因此这里默认直连。
| 字段或协议 | 具体作用 | 填写要点 |
|---|---|---|
tag | 供路由引用的出站名称 | 使用唯一、含义明确的名称 |
freedom | 直接连接目标地址 | 不需要远程服务器账户 |
blackhole | 阻断连接 | 测试时预期请求失败 |
vmess | 连接 VMess 服务端 | 核对地址、端口、用户参数和传输设置 |
vless | 连接 VLESS 服务端 | 核对用户参数、加密字段及安全层设置 |
接入远程节点不能只把 protocol 改成 vless。协议对应的 settings、传输层 streamSettings 和服务端配置必须配套。地址、端口、UUID、传输类型、TLS 的服务器名称以及需要时的 flow,分别承担不同职责。
VMess 与 VLESS 也不是「加密强度」选项。特别是 VLESS,本身不负责给业务流量提供传输加密,需要结合服务端要求的 TLS 或其他安全层。REALITY 属于 Xray 的相关能力,不能把对应字段直接放进 V2Fly 配置并期待正常运行。
先保留直连示例
推荐先验证本地端口、JSON 格式和路由标签,再一次替换一组出站参数。这样能区分本机配置错误与远程连接错误。
适合:首次读配置、定位启动失败、验证规则顺序。
使用有效节点出站
从已确认可用的节点配置取得完整出站对象,保留服务端要求的传输与安全参数,再调整本地标签引用。
适合:已有可用节点、需要在现有配置上增加分流。
5. routing:tag 如何串起整条连接
routing.rules 从上到下检查,先匹配的规则决定当前连接的路由结果。示例第一条规则同时包含 inboundTag 和 domain,两类条件需要同时成立;同一 domain 数组中的多个域名条件则是任选其一匹配。
- 应用连接
127.0.0.1:10809,内核给该连接标记入站标签http-in。 - 请求目标为
example.com,满足full:example.com的精确域名条件。 - 第一条规则命中,通过
outboundTag: "block"找到对应出站。 blackhole处理该连接;后面的私网规则不再参与这次选择。
full:example.com 只表示精确域名,不包含它的子域名。若需要同时匹配主域名及子域名,可使用 domain:example.com。把普通字符串直接写入域名数组时,其匹配语义也不能简单理解为精确匹配。
第二条规则列出三个 IPv4 私网网段,目标以这些 IP 进入路由时会直连。因为示例使用 AsIs,路由不会仅为匹配 IP 条件而主动解析域名。因此,域名最终解析到私网地址,不等于它在这条规则里一定命中。示例默认也是直连,所以实际结果可能相同,但匹配过程不同。
需要默认走远程节点时,可以把有效的远程出站放在数组首位,或在规则末尾添加明确的兜底规则。不要把兜底规则放在精确阻断和私网直连之前,否则前面的宽泛条件会遮住后面的细分规则。
6. dns 与 log:解析策略和日志分别检查
dns.servers 定义内置 DNS 使用的上游,示例的 localhost 表示使用系统本地解析机制。这个配置不会自动修改操作系统 DNS,也不会自动接管其他应用的 DNS 请求。只有在内核相应模块需要解析时,这些设置才进入实际处理链路。
AsIs:路由保留原始目标形式,不为 IP 规则主动把域名转为 IP。IPIfNonMatch:域名未匹配现有规则时,可尝试解析并进行 IP 规则匹配。IPOnDemand:匹配过程中遇到需要 IP 判断的规则时,可触发域名解析。
这些是路由层的策略,不等于出站连接时的解析策略。即使路由使用 AsIs,直连出站连接域名目标时仍可能需要解析。若域名一开始已被应用解析成 IP,内核也不一定还能拿到原域名;本文测试用 socks5h,就是为了让 SOCKS 请求携带域名。
log.loglevel 的 warning 适合先观察警告和错误。排查时可临时改为 info,必要时再用 debug。访问日志与错误日志有各自输出设置,调高日志等级不等于自动开启完整访问记录。
"log": {
"access": "access.log",
"error": "error.log",
"loglevel": "info"
}
上面片段用于替换完整配置里的 log 对象,不是单独运行的配置文件。相对日志路径通常按进程工作目录解释;从客户端启动时,工作目录未必等于 JSON 所在目录。排查结束后恢复适当等级,并在分享日志前移除服务器地址、订阅地址和账户信息。
7. 保存、测试与验证:一次只改一个变量
先验证 JSON 能被当前内核接受,再验证端口,最后检查规则结果。配置测试通过只说明配置通过相应检查,不代表运行时端口一定可绑定,也不代表远程服务器可连接。
-
保存配置
在 Windows 11 文件资源管理器中选择「查看」→「显示」→「文件扩展名」,确认文件叫
config.json,而不是config.json.txt。正文使用英文双引号,不写注释和末尾多余逗号。 -
验证字段
将配置放在 Xray 可执行文件所在的独立测试目录,在该目录打开 PowerShell,执行下方测试命令。若使用 V2Fly,先查看对应内核的命令帮助,不直接套用 Xray 参数。
-
启动内核
停止占用
10808、10809的其他代理进程,再执行运行命令。保留终端窗口,观察是否出现端口绑定失败或字段解析错误。 -
验证规则
分别运行 SOCKS 和 HTTP 测试。先确认普通站点可达,再观察
example.com在两个入站上的差异。完成后在内核终端按 Ctrl+C 停止测试进程。
.\xray.exe run -test -config .\config.json
.\xray.exe run -config .\config.json
保持内核运行,在另一个 PowerShell 窗口执行以下命令。显式使用 curl.exe,避免部分环境把 curl 解释成其他命令。每条命令设置 15 秒超时,仅为限制等待时间,不是性能测试。
curl.exe --max-time 15 --proxy socks5h://127.0.0.1:10808 https://example.org/
curl.exe --max-time 15 --proxy http://127.0.0.1:10809 https://example.com/
curl.exe --max-time 15 --proxy socks5h://127.0.0.1:10808 https://example.com/
| 测试请求 | 预期路由 | 判断依据 |
|---|---|---|
| SOCKS → example.org | direct | 规则未命中,使用首个出站 |
| HTTP → example.com | block | 入站标签和精确域名同时匹配 |
| SOCKS → example.com | direct | 入站标签不符,不命中阻断规则 |
直连测试能否收到网页仍取决于当前网络、系统解析和目标可达性。HTTP 阻断请求应失败,但失败的文字与耗时可能随连接阶段变化。不能仅凭一次超时断言规则命中;需要结合入站、目标域名、规则顺序和日志一起判断。
8. 常见配置错误:从报错位置回到字段
配置问题分成语法、结构、运行环境和连接参数四层。看到报错先定位层级,避免把本地端口冲突当成节点故障,或把未知字段当成网络不通。
- JSON 无法解析:检查报错行附近的逗号、括号和引号。最后一个数组元素后不能多一个逗号,字段名必须使用双引号,不能把说明文字直接粘进文件。
- 未知协议或字段:确认实际运行的是哪个内核及版本,并对照该内核的配置结构。不要只因另一份配置出现相同字段,就认定当前内核支持。
- 端口绑定失败:检查
10808和10809是否已被占用。若修改端口,要同步修改应用代理设置和测试命令。 - 启动成功但规则无效:确认应用确实进入了指定入站,再核对域名是否仍以域名形式传入、标签是否一致、宽泛规则是否排在前面。
- 导入后设置变化:区分手动维护的完整配置与客户端生成的配置。不要一边修改生成文件,一边用界面重新保存同一组运行参数。
整份 JSON、单个出站对象、节点分享链接和订阅地址是四种不同输入。完整配置包含本地入站与路由,订阅通常供客户端解析节点信息。把整份 JSON 粘进订阅地址字段,或把订阅地址当作出站服务器地址,都不会自动完成结构转换。