本文适合已经会导入节点、但看见 config.json 仍不清楚请求如何流动的用户。内容从本地 10808 端口开始,依次拆解入站、出站、路由、DNS 与日志,并给出一份可通过语法检查的 V2Ray 5 系列配置骨架;读完后可以定位端口冲突、出站标签写错、规则顺序不当等常见问题。
先看数据流:配置文件各部分如何协作
把配置看成一条数据流
V2Ray 配置不是一组彼此独立的开关。应用先把请求交给某个入站,路由模块读取目标域名、目标 IP、端口和入站标签,再把请求送往指定出站。没有命中任何路由规则时,V2Ray 通常使用出站数组中的第一项,因此 outbounds 的排列顺序本身也会影响结果。
inbounds 解决“流量从哪里进入”,outbounds 解决“流量从哪里离开”,routing 则负责把两者连接起来。配置能启动,只能证明 JSON 结构和字段基本可解析;是否按预期分流,还要检查标签引用、规则顺序以及 DNS 返回结果。
最小配置骨架:从完整 JSON 开始拆读
下面示例采用一个本地 SOCKS 入站、一个 VMess 代理出站、一个直连出站和一个阻断出站。服务器域名、端口、用户 ID 与传输方式只是结构示例,实际使用时必须与服务端参数逐项一致。JSON 不允许注释,因此说明文字不能直接写进正式配置文件。
{
"log": {
"loglevel": "warning"
},
"dns": {
"servers": [
"1.1.1.1",
"localhost"
]
},
"inbounds": [
{
"tag": "local-socks",
"listen": "127.0.0.1",
"port": 10808,
"protocol": "socks",
"settings": {
"auth": "noauth",
"udp": true
}
}
],
"outbounds": [
{
"tag": "proxy",
"protocol": "vmess",
"settings": {
"vnext": [
{
"address": "server.example.com",
"port": 443,
"users": [
{
"id": "11111111-2222-3333-4444-555555555555",
"security": "auto"
}
]
}
]
},
"streamSettings": {
"network": "tcp",
"security": "none"
}
},
{
"tag": "direct",
"protocol": "freedom"
},
{
"tag": "block",
"protocol": "blackhole"
}
],
"routing": {
"domainStrategy": "IPIfNonMatch",
"rules": [
{
"type": "field",
"protocol": [
"bittorrent"
],
"outboundTag": "block"
},
{
"type": "field",
"ip": [
"geoip:private"
],
"outboundTag": "direct"
},
{
"type": "field",
"domain": [
"geosite:cn"
],
"outboundTag": "direct"
},
{
"type": "field",
"ip": [
"geoip:cn"
],
"outboundTag": "direct"
}
]
}
}
这份配置把未命中规则的请求交给第一个出站 proxy。私有地址、境内域名和境内 IP 则指向 direct,特定协议指向 block。如果把 direct 放在出站数组第一项,却没有补充一条明确的代理规则,未匹配流量就会改为直连。
tag是配置内部使用的名称,可以自定义,但引用处必须完全一致并区分大小写。listen为127.0.0.1时只接受本机连接,适合普通桌面代理入口。port是数字,不要写成带引号的文本;同一地址上的端口不能被其他程序占用。streamSettings必须匹配服务端传输参数,不能仅凭协议名称推断。
inbounds 入站:应用如何把流量交给内核
入站可以理解为 V2Ray 在本机开放的接收入口。示例监听 127.0.0.1:10808,协议为 SOCKS。浏览器、下载工具或系统代理把 SOCKS 地址设为这个端口后,请求才会进入 V2Ray。仅启动内核但没有让应用指向入站端口,不会自动接管普通应用流量。
settings.auth 设为 noauth 表示该 SOCKS 入口不要求用户名和密码,因此应维持本机监听。udp: true 允许 SOCKS UDP 请求进入,但后续出站协议、服务器和网络环境也必须支持相应处理,单独开启这个字段不代表所有 UDP 流量都能正常通过。
SOCKS 入站
- 监听地址
- 127.0.0.1
- 监听端口
- 10808
- 协议
- socks
- UDP
- true
适合支持 SOCKS5 设置的浏览器、命令行工具与桌面应用。
HTTP 入站
- 监听地址
- 127.0.0.1
- 建议示例端口
- 10809
- 协议
- http
- 用途
- HTTP 代理入口
需要同时提供两类入口时,应使用不同端口,避免监听冲突。
多个入站可以同时存在。例如保留 10808 作为 SOCKS,增加 10809 作为 HTTP。每个入站应设置独立标签,便于路由规则按 inboundTag 区分来源。修改 v2rayN 的本地端口时,可进入「设置」→「参数设置」核对 SOCKS 与 HTTP 端口;应用中的代理端口也必须同步修改。
outbounds 出站:代理、直连与阻断的职责
出站定义请求离开 V2Ray 的方式。代理出站通常包含服务器地址、服务器端口、用户凭据和传输设置;直连出站使用 freedom;阻断出站使用 blackhole。路由模块不直接建立远程连接,只根据规则选出一个出站标签。
VMess 示例中的 vnext 是服务器列表,每个服务器可以包含一组用户。address 和 port 必须对应服务端监听信息,id 必须是服务端认可的用户标识。传输层还要核对 TCP、WebSocket、TLS 等配置;客户端和服务端只要有一项不一致,就可能表现为连接建立后立即断开或持续超时。
代理出站 proxy
- 协议
- vmess
- 服务器端口
- 443
- 示例传输
- TCP
- 默认用途
- 未匹配流量
实际服务器参数应来自有效节点配置,不能只替换地址而保留其他示例值。
本地策略出站
- direct
- freedom
- block
- blackhole
- 连接服务器
- 不需要
- 选择方式
- routing 标签
直连和阻断也属于出站,它们同样需要唯一 tag 供规则引用。
| 字段 | 所在位置 | 作用 | 常见错误 |
|---|---|---|---|
protocol |
出站对象 | 决定出站处理器类型 | 把 VMess 参数填入 VLESS 出站 |
settings |
出站对象 | 保存服务器与用户参数 | 端口、用户标识与服务端不一致 |
streamSettings |
出站对象 | 定义底层传输与安全层 | TCP、WebSocket 或 TLS 配置错配 |
tag |
出站对象 | 供路由规则引用 | 规则引用了不存在的标签 |
结论:先确认出站自身可用,再调路由
临时只保留一个代理出站并测试连接;确认服务器参数可用后,再加入 direct、block 和 routing。否则节点错误与分流错误会同时出现,日志难以判断问题来源。
routing 路由:规则顺序决定最终出口
routing.rules 是从上到下检查的规则数组。请求命中一条规则后,就使用该规则指定的 outboundTag,后面的规则不再处理该请求。因此范围更窄、优先级更高的规则应放在前面,范围较宽的规则放在后面。
domainStrategy: IPIfNonMatch 表示先尝试用域名规则匹配;域名规则没有命中时,再解析 IP 并继续检查 IP 规则。这个设置让 geosite:cn 与 geoip:cn 可以配合使用,但也意味着 DNS 结果会影响 IP 规则的判断。
- 先处理需要明确阻断的协议或目标,避免后面的宽泛直连规则提前接管。
- 再处理
geoip:private,让局域网地址和私有地址直接连接。 - 随后匹配
geosite:cn,按域名分类选择直连。 - 域名未命中时,再用
geoip:cn检查解析后的目标 IP。 - 其余流量没有匹配规则,落到出站数组第一项
proxy。
| 匹配条件 | 示例值 | 目标出站 | 处理结果 |
|---|---|---|---|
protocol |
bittorrent | block | 交给阻断出站 |
ip |
geoip:private | direct | 局域网与私有地址直连 |
domain |
geosite:cn | direct | 匹配分类中的域名后直连 |
ip |
geoip:cn | direct | 匹配目标 IP 后直连 |
规则中的 outboundTag 不是协议名称,而是某个出站对象的 tag。如果出站标签叫 proxy,规则却写成 Proxy,两者不会被视为同一个标签。删除或改名出站时,也要搜索整个文件并更新所有引用。
结论:改分流时一次只移动一条规则
先记录目标域名和预期出口,再调整单条规则位置并观察日志。整段复制新的规则集会同时改变域名、IP 与默认出口,出现异常时很难定位是哪一项造成。
DNS 与日志:为什么配置正确仍可能分流异常
DNS 不只是把域名转换为 IP。在启用域名与 IP 混合匹配时,解析结果会参与路由判断。示例把 1.1.1.1 与 localhost 放入服务器列表,表示可以使用指定 DNS,也可以交给本机解析器;真实网络中应根据可达性、解析结果和分流目标选择合适方案。
loglevel 设为 warning 适合日常运行,可以看到警告与错误。排查规则时可临时改为 info,获取更完整的运行信息;问题确认后再恢复,避免日志快速增长。JSON 字符串必须使用双引号,最后一个数组项或对象字段后不能保留多余逗号。
{
"log": {
"access": "access.log",
"error": "error.log",
"loglevel": "info"
},
"dns": {
"hosts": {
"domain:internal.example.com": "192.168.1.20"
},
"servers": [
"1.1.1.1",
"localhost"
]
}
}
- 出现
failed to listen一类信息时,优先检查监听地址和端口占用。 - 出现找不到出站标签时,核对每个
outboundTag与出站tag。 - 连接远程服务器超时时,核对地址、端口、传输方式与当前网络可达性。
- 域名直连结果不符合预期时,检查规则顺序、
domainStrategy和 DNS 返回地址。
常见修改问题:从报错位置反推字段
手改配置最容易出现三类问题:JSON 语法损坏、字段放错层级、标签关系断开。语法错误通常会阻止内核启动;字段层级错误可能提示未知字段;标签错误则可能在请求真正命中规则时才暴露。排查时应先验证文件,再检查入口,最后检查请求走向。
改完端口后,浏览器立刻无法连接怎么办?
同时核对 config.json 的 inbounds.port 与浏览器代理端口。例如入站从 10808 改为 10818,浏览器仍指向 10808 就无法把请求交给新入口。
配置测试通过,为什么全部流量都直连?
检查 outbounds 第一项是否变成了 direct。未命中规则的请求会使用默认出站;若要默认代理,应把可用代理出站放在第一项,或增加明确覆盖目标的代理规则。
加入 geosite 规则后仍没有按域名分流?
先确认规则位于更宽泛的 IP 规则之前,再检查 domainStrategy。如果应用只提交目标 IP 而不提交域名,域名规则本身无法获得原始域名信息。
日志提示找不到 proxy 出站怎么处理?
在 outbounds 中搜索 tag,确认确实存在值为 proxy 的对象。标签区分大小写,也不能在标签前后加入空格。
v2rayN 导入节点后还需要手写整份 JSON 吗?
一般不需要。v2rayN 会根据节点和参数设置生成运行配置。需要定制本地端口时进入「设置」→「参数设置」;只有在使用自定义配置、复杂入站或特殊路由时,才需要逐段维护 JSON。
对于 v2rayNG 与 v2flyNG,订阅或分享链接同样会生成客户端运行所需配置。v2rayNG 使用 Xray 内核,v2flyNG 使用 v2fly 内核,界面中的字段名称和可用传输能力可能随内核而异。不要把某个客户端导出的完整配置直接覆盖到另一内核环境,至少要先检查协议、传输字段和路由资源是否兼容。
- 备份当前可工作的 config.json,并记录本地入站端口。
- 每次只改一个区块,保存后先运行配置测试。
- 启动内核,确认 127.0.0.1:10808 已成功监听。
- 用单一目标测试代理出站,再测试直连规则与阻断规则。
- 观察日志中的目标地址、匹配结果和连接错误,确认后再继续修改。