适合已经接触订阅、准备阅读内核配置的用户。先运行一个仅监听本机的 SOCKS 入站,用直连和拒绝两种出站验证配置结构,再理解标签引用、规则顺序与 DNS 的边界。样本不包含远端代理节点;完成测试后,再把服务端提供的协议参数接入出站,避免把 JSON 语法、节点连接和分流问题混在一起。
一、先保存一份能独立测试的 config.json
下面使用 V2Ray 传统 JSON 配置结构,适用于支持该格式的 V2Fly 内核。先执行 v2ray version 确认实际运行的程序,再查看 v2ray help。V2Fly 与 Xray 的字段有交集,但扩展功能和命令行参数并不完全相同;不要把其他内核的配置直接当作通用格式。
将以下内容保存为 UTF-8 编码的 config.json。它在 127.0.0.1:10808 提供 SOCKS 入口,对 example.org 及其子域名拒绝连接,其他请求默认直连。这里的“可用”指入口、路由和出站链路能够运行,不表示已经具备远端代理能力。
{
"log": {
"loglevel": "warning"
},
"inbounds": [
{
"tag": "socks-local",
"listen": "127.0.0.1",
"port": 10808,
"protocol": "socks",
"settings": {
"auth": "noauth",
"udp": false
}
}
],
"outbounds": [
{
"tag": "direct",
"protocol": "freedom",
"settings": {}
},
{
"tag": "blocked",
"protocol": "blackhole",
"settings": {}
}
],
"routing": {
"domainStrategy": "AsIs",
"rules": [
{
"type": "field",
"inboundTag": ["socks-local"],
"domain": ["domain:example.org"],
"outboundTag": "blocked"
}
]
},
"dns": {
"servers": [
"1.1.1.1",
"8.8.8.8"
]
}
}
- 对象用花括号包围,数组用方括号包围;
inbounds和outbounds即使只有一项,也仍然是数组。 - 键名和字符串使用英文双引号;数字
10808、布尔值false不加引号。 - 最后一个属性后不加逗号。为便于跨工具检查,本文样本不使用注释或尾随逗号。
- 顶层字段的书写先后不决定请求流向;真正有顺序意义的是路由规则数组,以及默认出站所处的位置。
二、log:先确定错误从哪里看
log 负责日志输出,不承担代理和分流。样本只设置 loglevel,没有指定日志文件路径;手动从终端启动时,应直接观察进程输出。如果通过服务启动,则查看对应服务的日志,而不是在任意目录寻找一个默认日志文件。
| 字段或值 | 用途 | 使用建议 |
|---|---|---|
loglevel: warning | 保留警告与错误等较高等级信息 | 用于日常运行,普通连接不一定出现日志 |
loglevel: info | 提供更多运行信息 | 适合短时检查连接及配置行为 |
loglevel: debug | 提供更细的诊断信息 | 复现一次问题后恢复原级别 |
access / error | 分别指定访问日志和错误日志位置 | 设为文件路径时,先确认目录存在且进程可写 |
遇到启动失败,先读第一条明确的错误:解析错误通常指向字段或位置;address already in use 指向监听端口占用;权限错误则应检查配置文件和日志目录。反复修改节点地址不能解决本地端口冲突。
三、inbounds:应用连接的是本机入口
inbounds 描述内核怎样接收请求。样本中的 protocol: socks 是应用与本机内核之间的 SOCKS 协议,不是远端服务器协议。浏览器或终端需要明确使用这个入口,单纯启动进程不会自动修改系统代理,也不会接管全部应用流量。
本机 SOCKS 入站
- 标签
socks-local- 监听地址
127.0.0.1- 监听端口
10808- 协议
socks
仅接受本机连接;测试应用必须选择 SOCKS 代理,而不是 HTTP 代理。
默认直连出站
- 标签
direct- 协议
freedom- 协议设置
{}- 数组位置
- 第 1 项
未命中规则时使用这个出站;它直接连接目标,不经过远端代理服务器。
listen 决定谁能访问入口,port 决定入口编号。这里使用回环地址,其他局域网设备不能通过电脑的内网地址连接它。不要为了排查问题,随手改成 0.0.0.0 并继续保留无认证设置;那会扩大监听范围。
settings.auth 为 noauth 表示本地 SOCKS 不要求用户名和密码;udp: false 表示此样本不开放 SOCKS UDP 转发。本篇只用 TCP 请求验证流程,不能据此判断游戏、语音或其他 UDP 应用是否已经可用。
四、outbounds:协议参数与出站标签分开理解
outbounds 描述请求离开内核的方式。样本里的 freedom 是直连,blackhole 用于拒绝或丢弃请求。它们都不是远端节点,因此无需填写服务器地址、用户标识或传输安全参数。
- 先看 protocol。它决定
settings中允许出现哪些协议字段。不要把 SOCKS 入站的认证字段复制进 VMess 出站。 - 再看 settings。它承载对应协议的连接参数。新增真实代理节点时,应以服务端信息和当前内核文档为准,而不是猜测默认值。
- 最后看 tag。它是配置内部引用的名称。示例中
direct和blocked都是自定义标签,不是系统保留协议名。 - 核对 streamSettings。需要时在出站对象中配置传输方式与传输安全参数;它与协议的
settings是同级字段,不应随意嵌套。
VMess 与 VLESS 是不同的代理协议,不能只改一个 protocol 就完成转换。使用 VLESS 时,还要核对实际内核版本及其支持范围。尤其是 Xray 的特定传输扩展,不能因为字段看起来相似,就原样移到 V2Fly 配置中。
结论:保留直连基线,再加入真实节点
先让 10808 入口通过直连测试,再新增代理出站并用规则指向它。这样新增失败时,可以优先检查协议与服务端参数,不必同时怀疑入口配置。
五、routing:按规则顺序把请求交给出站
请求进入内核后,路由模块依据目标域名、目标 IP、端口、入站标签等条件选择出站。样本的处理链如下;这里没有虚拟网卡,也没有自动设置系统代理。
样本中的规则要求请求来自 socks-local,并且目标域名匹配 domain:example.org,然后交给 blocked。同一条规则中的这两个条件要同时成立;domain 数组内若列出多个域名,则匹配其中一个即可满足域名条件。
| 配置项 | 引用或含义 | 常见错误 |
|---|---|---|
inboundTag | 匹配入站对象的 tag | 把协议名 socks 当作入站标签 |
outboundTag | 指向出站对象的 tag | 写成不存在的标签,或大小写不一致 |
domain:example.org | 匹配该域名及其子域名 | 误以为只匹配完全相同的主机名 |
full:example.org | 只匹配完整域名 | 期待它同时覆盖所有子域名 |
rules 数组 | 从上到下检查,命中后选择对应出站 | 把覆盖面大的规则放在特殊规则前面 |
没有命中任何规则时,默认使用 outbounds 的第一项。本文第一项是 direct,所以普通请求直连;如果把代理出站移到第一项,未匹配请求的行为也会跟着改变。排查“怎么所有网站都走同一个出口”时,除了检查规则,还要检查数组首项。
domainStrategy: AsIs 表示路由阶段按现有目标信息匹配,不为匹配 IP 规则而主动解析域名。如果应用交给 SOCKS 的已经是 IP,单靠这条域名规则就无法还原原始域名。本例未配置嗅探,因此测试时必须让应用把域名交给 SOCKS 入口。
六、dns:配置解析服务器不等于接管系统 DNS
顶层 dns 配置的是内核内置 DNS 模块。样本列出 1.1.1.1 与 8.8.8.8 两个服务器,但写入这段配置不会修改操作系统的 DNS,也不表示所有应用查询都会自动进入内核。
- 应用提前解析:应用先得到目标 IP,再把 IP 发给 SOCKS。此时内核通常看不到原始域名,域名分流可能无法命中。
- 应用传递域名:应用将域名作为 SOCKS 目标提交,路由模块可以直接匹配域名条件。
- 路由触发解析:采用需要解析的路由策略时,路由模块可能调用内置 DNS,以便继续匹配 IP 规则。
- 出站解析:直连出站还受自身的域名解析策略影响;使用默认
AsIs时,不应假定它必然查询顶层列出的服务器。
因此,本例中的 DNS 段主要展示结构,并不保证在每次测试中都会被调用。路由的 domainStrategy 与直连出站的 settings.domainStrategy 属于不同层次:前者影响规则如何匹配,后者影响直连如何处理目标地址。不要只看到同名字段,就认为修改任意一个都能改变全部解析路径。
结论:先确认谁在解析域名
域名规则不命中时,先用 socks5h://127.0.0.1:10808 重试,让 curl 将目标域名交给 SOCKS。确认请求形态后,再决定是否调整 DNS 或路由策略。
七、配置测试与两组请求验证
对于提供 test 和 run 子命令的 V2Fly 版本,可在配置文件所在目录执行下列命令。Windows 下从当前目录调用时,将程序名写成 .\v2ray.exe;其他版本先根据本机帮助确认参数。启动前应避免桌面客户端同时占用 10808。
v2ray version
v2ray help
v2ray test -c config.json
v2ray run -c config.json
test 成功只说明配置被当前内核接受,不代表网络可达。保持内核运行,在另一个终端执行下列命令。Windows 可使用 curl.exe,避免命令名称被终端别名覆盖。
curl --connect-timeout 10 --max-time 20 --proxy socks5h://127.0.0.1:10808 -I https://example.com/
curl --connect-timeout 10 --max-time 20 --proxy socks5h://127.0.0.1:10808 -I https://example.org/
- 第一组验证直连。在当前网络能够访问目标的前提下,第一条命令应收到 HTTP 响应头。具体状态码由目标站点决定,不要求固定为
200。 - 第二组验证拒绝。第二条请求应无法完成正常的 HTTPS 响应。具体报错随 curl 与内核版本变化,不能只凭某一句错误文本判断成败。
- 检查时间边界。命令设置连接超时 10 秒、总超时 20 秒,用来避免长时间等待;这不是延迟测量,也不是性能结论。
- 逐项改变配置。先把拒绝规则的
outboundTag改为direct,重新测试并重启。若第二条恢复响应,就能验证标签引用和规则确实参与了处理。
修改磁盘上的 JSON 后,不要假定正在运行的进程已经自动重读。本文手动运行方式应停止旧进程,再执行配置测试并重新启动。若在 v2rayN 中使用订阅节点,客户端可能重新生成运行配置;应区分客户端生成文件与自行维护的自定义配置,修改前保留副本。
八、常见配置问题与具体处理
配置测试通过,浏览器为什么还是没走入口?
配置测试不会设置系统代理。先运行本文的 curl 命令确认入口工作,再检查浏览器使用的代理类型和端口。10808 在此配置中是 SOCKS 端口,不能直接填进只接受 HTTP 代理的设置栏。
为什么写了 blocked,网站仍然能打开?
先确认请求真的经过 127.0.0.1:10808,再使用 socks5h 传递域名。随后检查 inboundTag 是否为 socks-local,以及前面是否存在更早命中的规则。修改后重启进程再测。
启动提示 10808 已被占用,应该改哪里?
关闭旧的内核进程,或将入站 port 改为未占用的 10818,并把测试命令的端口同步改成 10818。不要只修改应用端口而保留内核监听原值;端口两端必须一致。
订阅链接能直接放进 outbounds 吗?
不能。订阅是客户端获取节点信息的入口,outbounds 需要内核能够识别的结构化对象。先让 v2rayN 导入订阅,再阅读它为当前节点生成的配置;分享排错片段前,删除订阅地址、服务器认证信息与其他敏感参数。
最终检查顺序固定为:JSON 能解析、内核能启动、入站能连接、规则能命中、出站能到达目标。每次只调整一个层次,保留能工作的基线文件。这样即使后续加入 VMess、VLESS 或更复杂的 DNS 分流,也能把失败范围收敛到具体字段,而不是整体替换配置反复试错。
客户端与平台选择
根据设备系统选择安装包。桌面端使用 v2rayN;安卓端可根据内核需求选择 v2rayNG 或 v2flyNG。先按教程完成基础连接,再返回本篇核对配置结构与规则引用。