适合已经能导入订阅、但看到生成配置仍难以下手的用户。文章从请求经过入站、路由和出站的顺序展开,给出可由核心读取的本地直连样例,并说明 VLESS、VMess 参数应该放在哪一层,以及修改后如何定位 JSON 语法、端口占用和规则顺序问题。
先看懂配置的外层结构
V2Ray 与 Xray 的运行配置通常使用 JSON。最常见的顶层对象包括 log、inbounds、outbounds、routing 和 dns。其中真正决定请求如何进入、如何选择路径以及从哪里离开的,是 inbounds、routing、outbounds 三块。
可以把一次连接理解为固定的数据链:浏览器或其他应用先连接本机监听端口,核心识别目标地址,再按路由规则选择一个出站。订阅节点主要填充 outbounds,客户端里的路由模式主要生成 routing,而系统代理设置负责让应用把流量交给 inbounds。
下面这份样例不包含远程节点,而是把 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 时,仅本机程序可以连接;写成局域网地址或全地址监听会改变可访问范围。普通桌面使用保持本机监听即可。若出现“连接被拒绝”,应先确认核心正在运行,再确认应用填写的端口与实际入站端口一致。
- tag:入站的内部名称,可供 routing 里的
inboundTag引用。名称可以自定,但引用必须完全一致。 - protocol:指定入口协议。桌面客户端常生成 SOCKS 或 HTTP 入站,TUN 模式则由客户端建立对应虚拟网络入口。
- settings:保存该入站协议自己的参数。SOCKS 示例中的
udp: true表示允许处理 UDP 请求。 - sniffing:从连接内容恢复目标域名,帮助域名规则参与匹配。它不是测速开关,也不会直接改变远程节点协议。
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 同样是数组。第一个出站通常承担默认出口,后续出站可以作为直连、阻断或其他节点。每个出站由 tag、protocol、settings 和可选的 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,再看 address 与 port,随后核对用户标识,最后检查 network、TLS 服务器名称和 WebSocket 路径。
freedom 表示直接连接目标,常用标签是 direct;blackhole 用于终止匹配到的连接,常用标签是 blocked。它们不需要远程服务器参数。配置里同时保留 proxy、direct、blocked 三类出站后,routing 才能分别完成代理、直连和阻断。
结论:先核对协议层,再核对传输层
日志出现认证或用户标识错误时检查 settings;出现 TLS、WebSocket 路径或连接关闭错误时检查 streamSettings。按层定位比反复更换端口更有效。
routing:规则按顺序匹配,不按名称推断
routing.rules 是有顺序的规则数组。核心从第一条向后检查,命中后使用该规则的 outboundTag,通常不会继续用后面的规则覆盖结果。因此,更具体的规则应放在前面,更宽泛的兜底规则放在后面。
type: "field" 表示按字段条件匹配。常见条件包括 domain、ip、port、network、inboundTag 和 protocol。同一条规则里放入多个不同类型条件时,通常需要同时满足;同一字段内的多个值则用于匹配其中任意一个。
| 规则位置 | 匹配条件 | 出站标签 | 作用 |
|---|---|---|---|
| 第 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 会根据节点、路由和核心选项生成运行配置。直接改运行时文件可能只在当前进程有效,下次切换节点、更新订阅或重启核心时就会重新生成。需要长期保留的修改,应尽量从客户端对应界面完成。
查看基础选项可进入「设置」→「参数设置」;调整节点参数可从「服务器」列表选择目标后进入编辑界面;路由相关内容应在「设置」→「路由设置」中维护。不同小版本的菜单名称可能有细微调整,但修改目标仍然对应入站、节点出站和路由规则三层。
- 先复制当前可用配置或导出客户端设置,保留回退基线。
- 一次只改一个字段,例如只调整监听端口,保存后立即重启核心。
- 先确认 JSON 能加载,再测试本机端口,最后测试具体域名的路由结果。
- 若修改路由,记录目标域名、命中的规则和最终 outboundTag。
- 订阅更新后重新核对自定义设置,确认客户端没有用订阅字段覆盖本地调整。
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 解决“这一条请求选择哪个出口”。遇到错误时沿着实际请求方向逐层检查,通常能把问题缩小到一个端口、一条规则或一组协议参数。