v2ray core 基础介绍与概念解析 – wiki基地


解密 V2Ray Core:基础介绍与核心概念解析

引言:为什么需要了解 V2Ray Core?

在当今互联网环境下,网络自由与隐私保护日益受到重视。各种网络代理工具应运而生,其中 V2Ray 以其高度的灵活性、强大的功能和优秀的伪装能力脱颖而出,成为许多用户构建安全、可靠网络连接的首选。然而,与一些配置简单的工具不同,V2Ray 功能强大但配置也相对复杂。其核心——V2Ray Core,是一个独立运行的二进制程序,它实现了 V2Ray 的所有核心功能。

理解 V2Ray Core 的基础概念是有效使用 V2Ray 的关键。它不像一个黑盒,而是一个由多个模块协同工作的精密系统。只有理解了这些模块及其之间的关系,我们才能根据自己的需求,灵活地配置 V2Ray,构建出满足特定场景的网络连接方案。

本文将深入浅出地介绍 V2Ray Core 的基础概念,剖析其核心组件,帮助读者理解 V2Ray 是如何工作的,从而更好地掌握这个强大的工具。

一、 V2Ray 的起源与 Project V

要理解 V2Ray Core,首先需要了解其诞生的背景——Project V。

Project V 是一个开源项目,其目标是提供一套构建自定义网络连接的工具集。它不仅仅是为了代理流量,更是一个通用的网络转发平台。Project V 的设计理念是高度模块化和可插拔,这意味着你可以根据需要选择或组合不同的模块来实现特定的功能。

V2Ray Core (通常简称为 v2rayv2ray-core) 是 Project V 项目下最核心、最关键的组件。它是 Project V 设计理念的具象化,负责处理所有的网络连接、数据传输、协议解析、路由分发等核心任务。你可以将 V2Ray Core 理解为 Project V 的“引擎”,其他相关的客户端、GUI 工具、管理面板等都是围绕这个引擎构建的“外壳”或“控制界面”。

因此,当我们谈论 V2Ray 时,通常指的就是这个核心程序及其配套的配置。理解 V2Ray Core,就是理解 V2Ray 的本质。

二、 V2Ray Core 的核心架构与配置

V2Ray Core 的强大之处在于其高度灵活的配置能力。与许多代理软件通过命令行参数或简单的配置文件进行配置不同,V2Ray Core 主要通过一个结构化的 JSON 格式配置文件 来定义其所有的行为。这个配置文件是 V2Ray Core 的“指令书”,告诉它如何接收连接、如何处理流量、如何转发数据。

V2Ray Core 的核心架构可以概括为:接收 (Inbound) -> 路由 (Routing) -> 发送 (Outbound)

一个网络连接进入 V2Ray Core 后,首先由某个 Inbound 负责接收,然后根据 Routing 规则判断这条连接应该如何处理,最后通过某个 Outbound 将数据发送出去。这三个部分是 V2Ray Core 最基本也是最重要的概念。

除了这三个核心部分,V2Ray 的配置还包括日志、策略、API、统计等其他重要设置,共同构成了 V2Ray Core 完整的功能集。

接下来,我们将详细解析 V2Ray Core 配置文件的主要组成部分以及它们对应的概念。

2.1 配置文件的基本结构 (JSON)

V2Ray 的配置文件是一个 JSON 对象。这个对象包含多个顶层键 (key),每个键对应 V2Ray 的一个配置模块。常见的顶层键包括:

  • log: 日志配置。
  • api: 远程 API 配置,用于外部程序与 V2Ray Core 交互。
  • policy: 策略配置,用于更细粒度地控制用户或连接的行为。
  • stats: 统计配置。
  • reverse: 反向代理配置(较少用)。
  • dns: DNS 服务器配置。
  • routing: 路由 配置,决定流量的走向。
  • inbounds: 入站连接 配置,定义 V2Ray 监听的端口和协议。
  • outbounds: 出站连接 配置,定义 V2Ray 如何发送流量。

其中,inbounds, outbounds, 和 routing 是配置的核心。

2.2 Inbound (入站连接)

inbounds 是一个数组,每个元素代表 V2Ray 监听的一个端口以及处理该端口流量的协议。它的作用是接收来自客户端(例如浏览器、手机应用或其他代理软件)的连接。

每个 Inbound 配置至少包含以下关键字段:

  • port: 监听的端口号。
  • protocol: 接收连接使用的协议。V2Ray 支持多种入站协议,常见的有:
    • socks: 标准 SOCKS 代理协议 (SOCKS4, SOCKS5)。
    • http: 标准 HTTP 代理协议。
    • vmess: V2Ray 的原生协议,功能丰富,支持多种传输方式和加密。
    • vless: V2Ray 的新型协议,设计更简洁,性能更高,依赖 TLS。
    • shadowsocks: Shadowsocks 协议,用于兼容。
    • dokodemo-door: “任意门”,一个特殊的入站协议,可以将进入特定端口的流量透明地转发到预设的目标地址,常用于透明代理。
  • listen: 可选字段,指定监听的 IP 地址。默认为 "0.0.0.0" (监听所有网卡)。
  • tag: 重要字段! 为这个入站连接指定一个唯一的标识符(字符串)。在路由配置中,可以通过这个 tag 来引用这个入站连接,从而根据流量的来源(从哪个 Inbound 进入)来决定如何路由。
  • settings: 协议相关的详细配置,例如用户认证信息 (对于 socks, http, vmess, vless, shadowsocks)。
  • streamSettings: 传输配置,定义数据在底层如何传输,例如使用 TCP、mKCP、WebSocket、HTTP/2 等,以及是否开启 TLS、伪装等。这是实现伪装和突破封锁的关键。
  • sniffing: 流量嗅探 配置。V2Ray 可以在接收到连接的初期尝试识别其应用的层协议(如 HTTP、TLS),并获取真实的目标地址。这对于使用 dokodemo-door 透明代理或根据应用协议进行路由非常有用。

示例片段 (SOCKS5 和 VMess 入站):

json
"inbounds": [
{
"port": 1080,
"protocol": "socks",
"settings": {
"auth": "noauth", // 不认证
"udp": true // 开启 UDP 转发
},
"tag": "socks_in" // 标识符
},
{
"port": 10000,
"protocol": "vmess",
"settings": {
"clients": [
{
"id": "你的用户ID (UUID)",
"level": 0,
"alterId": 0 // 针对旧版VMess,新版VLESS/VMess+TLS通常为0
}
]
},
"streamSettings": {
"network": "tcp",
"security": "auto" // 通常与TLS配合使用
},
"tag": "vmess_in" // 标识符
}
]

理解 Inbound 的关键在于它定义了 V2Ray 的“入口”,以及通过哪个协议和在哪个端口上监听连接。每个入口都有一个 tag,这个 tag 将被用于后续的路由判断。

2.3 Outbound (出站连接)

outbounds 是一个数组,每个元素代表 V2Ray 如何将处理后的流量发送出去。它的作用是将数据导向最终的目标地址,可能是实际的互联网服务器,也可能是另一个代理服务器。

每个 Outbound 配置至少包含以下关键字段:

  • protocol: 发送连接使用的协议。V2Ray 支持多种出站协议,常见的有:
    • freedom: “自由连接”,直接连接到目标地址,不使用任何代理协议。这是最常见的 Outbound 类型,用于不需要代理的流量或作为代理链的最后一环。
    • blackhole: “黑洞”,丢弃所有发往此 Outbound 的连接,常用于屏蔽特定网站或广告。
    • vmess: 使用 VMess 协议连接到另一个 V2Ray 节点。
    • vless: 使用 VLESS 协议连接到另一个 V2Ray 节点。
    • shadowsocks: 使用 Shadowsocks 协议连接到 SS 服务器。
    • socks: 使用 SOCKS 协议连接到另一个 SOCKS 代理服务器。
    • http: 使用 HTTP 协议连接到另一个 HTTP 代理服务器。
  • tag: 重要字段! 为这个出站连接指定一个唯一的标识符(字符串)。在路由配置中,可以通过这个 tag 来指定符合特定规则的流量应该通过哪个 Outbound 发送。
  • settings: 协议相关的详细配置,例如 VMess/VLESS 连接的目标服务器地址、端口、用户 ID;Shadowsocks 的服务器地址、端口、加密方式、密码;SOCKS/HTTP 的服务器地址和端口等。
  • streamSettings: 传输配置,与 Inbound 中的 streamSettings 类似,定义数据在底层如何传输(TCP, mKCP, WebSocket, HTTP/2 等)以及是否开启 TLS、伪装等。这通常是配置客户端连接到服务器端的关键部分。

示例片段 (Freedom 和 VMess 出站):

json
"outbounds": [
{
"protocol": "freedom",
"settings": {}, // freedom协议通常没有特殊设置
"tag": "direct" // 用于直连的标识符
},
{
"protocol": "blackhole",
"settings": {}, // blackhole协议通常没有特殊设置
"tag": "block" // 用于屏蔽的标识符
},
{
"protocol": "vmess",
"settings": {
"vnext": [ // 可以配置多个目标服务器,V2Ray会按顺序尝试连接
{
"address": "your_server_address", // 你的服务器地址
"port": 443, // 服务器端口
"users": [
{
"id": "你的用户ID (UUID)",
"level": 0,
"alterId": 0 // 新版通常为0
}
]
}
]
},
"streamSettings": {
"network": "ws", // 使用WebSocket传输
"security": "tls", // 开启TLS加密
"tlsSettings": {
"allowInsecure": false,
"serverName": "your_server_domain" // 必须与服务器证书匹配
},
"wsSettings": {
"path": "/你的websocket路径", // 与服务器配置一致
"headers": {}
}
},
"tag": "proxy" // 用于代理的标识符
}
]

Outbound 定义了 V2Ray 的“出口”,以及通过哪个协议和方式将流量发送出去。每个出口也有一个 tag,用于在路由中引用。通常会有一个默认的 freedom 出站用于直连,以及一个或多个用于代理的出站。

2.4 Routing (路由)

routing 是 V2Ray Core 配置中最为灵活和强大的部分,它决定了进入 V2Ray 的流量应该通过哪个 Outbound 发送出去。路由模块根据一系列的规则来匹配连接的属性,并将匹配到的连接导向指定的 Outbound。

routing 配置是一个对象,包含以下关键字段:

  • domainStrategy: 域名解析策略。当路由规则中包含域名时,V2Ray 如何处理域名解析。常见的选项有:
    • AsIs: 不对域名进行解析,直接将域名发送给 Outbound 处理。
    • IPIfNonMatch: 如果所有基于域名的规则都不匹配,则将域名解析为 IP 地址,并使用 IP 地址继续进行路由匹配。
    • IPOnDemand: 只要路由规则中涉及 IP 地址,即使域名规则已匹配,也会强制进行域名解析,并使用解析出的 IP 地址重新进行路由匹配。
  • rules: 一个数组,包含一系列的路由规则。这是路由配置的核心。 V2Ray 会按照数组中规则的顺序逐一进行匹配。一旦一个连接匹配了某个规则,后续的规则将不再检查。
  • balancers: (可选) 负载均衡器配置。允许将流量分发到多个 Outbound 中。

路由规则 (rules) 是一个对象数组,每个规则至少包含以下关键字段:

  • type: 规则类型,目前只有 "field"
  • inboundTag: (可选) 匹配流量的入站连接 tag。例如,只对从 socks_in 进入的流量应用此规则。
  • outboundTag: 重要! 如果此规则匹配成功,流量将通过具有指定 tag 的 Outbound 发送。
  • balancerTag: (可选) 如果此规则匹配成功,流量将通过指定的负载均衡器发送(负载均衡器会将流量分发到其关联的 Outbound)。outboundTagbalancerTag 二选一。
  • 匹配条件 (这些字段是可选的,可以组合使用):
    • domain: 一个字符串数组,匹配目标地址的域名。支持多种匹配格式:
      • 精确匹配: "google.com"
      • 泛域名匹配: "*.google.com" (匹配所有 google.com 的子域名)
      • 后缀匹配: "geosite:cn" (匹配 ChinaList 中的所有域名,需要配合 geoip 数据库)
      • 前缀匹配: "keyword:google" (匹配包含 “google” 关键字的域名)
      • 正则表达式: "regexp:\\.goo.*\\.com$"
    • ip: 一个字符串数组,匹配目标地址的 IP。支持 CIDR 格式 (e.g., "1.1.1.1/32") 和 IP 范围。也支持 GeoIP 数据库:"geoip:cn" (匹配中国的 IP), "geoip:private" (匹配私有 IP)。
    • port: 一个字符串,匹配目标端口。可以是单个端口号 (“80”),端口范围 (“80-100”),或逗号分隔的列表 (“80,443,8080”)。
    • network: 一个字符串,匹配传输层协议。"tcp""udp"。也可以是数组 ["tcp", "udp"]
    • protocol: 一个字符串数组,匹配应用层协议,通常需要配合 sniffing 使用。例如 ["http", "tls"]
    • source: 匹配来源 IP 地址。格式同 ip
    • sourcePort: 匹配来源端口。格式同 port
    • user: 一个字符串数组,匹配认证用户的邮箱 (email)。通常用于 vmessvless 入站协议的用户。

路由规则匹配逻辑:

  1. V2Ray 接收到一个新连接。
  2. V2Ray 从连接中提取相关信息:入站 Inbound Tag,目标地址 (域名/IP, 端口),传输协议 (TCP/UDP),来源地址 (IP, 端口),如果开启了嗅探还可能有应用协议。
  3. V2Ray 从 routing.rules 数组的第一个规则开始检查。
  4. 对于当前规则,V2Ray 检查连接的信息是否满足规则中指定的所有匹配条件 (inboundTag, domain, ip, port, network, protocol, source, sourcePort, user)。
  5. 如果所有条件都匹配,则认为该规则匹配成功。V2Ray 会根据该规则的 outboundTagbalancerTag 将连接导向指定的出站或负载均衡器,然后停止检查后续规则。
  6. 如果当前规则有任何一个条件不匹配,则检查下一个规则。
  7. 如果所有规则都检查完毕,都没有匹配成功,则流量将通过 默认的 Outbound 发送。默认 Outbound 是 outbounds 数组中的第一个元素。

示例片段 (路由规则):

json
"routing": {
"domainStrategy": "IPIfNonMatch", // 先尝试域名匹配,失败则解析IP再匹配
"rules": [
{ // 规则1:屏蔽广告域名
"type": "field",
"domain": ["geosite:category-ads-top", "geosite:category-ads-media"], // 匹配广告域名列表
"outboundTag": "block" // 导向 block 出站 (黑洞)
},
{ // 规则2:国内IP直连
"type": "field",
"ip": ["geoip:cn", "geoip:private"], // 匹配中国IP和私有IP
"outboundTag": "direct" // 导向 direct 出站 (直连)
},
{ // 规则3:特定域名直连 (例如不需要代理访问的网站)
"type": "field",
"domain": ["google.cn", "baidu.com"],
"outboundTag": "direct"
},
{ // 规则4:所有剩余流量通过代理出站
// 由于规则是按顺序匹配的,如果前面的规则都不匹配,流量就会走到这里
"type": "field",
// 没有指定匹配条件,意味着匹配所有未被前序规则匹配的流量
"outboundTag": "proxy" // 导向 proxy 出站 (代理)
}
]
}

理解路由的核心在于其规则的顺序和匹配逻辑。精心设计的路由规则是实现分流、过滤和提高性能的关键。通过组合不同的匹配条件,可以实现非常复杂的流量控制策略。

2.5 Protocols (协议) 与 Transports (传输方式)

在 V2Ray 中,协议 (Protocol) 和传输方式 (Transport) 是两个相关但不同的概念。

  • Protocol (协议): 指的是数据内容的编码和处理方式,是应用层或代理层协议。例如 VMess, VLESS, Shadowsocks, SOCKS, HTTP 等。它们定义了客户端和服务器之间如何“说”话,如何封装用户数据,如何进行认证、加密等。
  • Transport (传输方式/网络): 指的是数据在底层网络中如何被发送,是传输层或更底层的概念。例如 TCP, mKCP, WebSocket, HTTP/2, QUIC 等。它定义了数据包的组织、错误重传、流量控制等。

在 V2Ray 配置中,protocol 字段指定的是代理协议,而 streamSettings 字段则配置传输方式。例如,你可以配置一个 vmess 协议的 Inbound/Outbound,但其 streamSettings 可以选择 network: "tcp" (直接 TCP 传输)、network: "ws" (通过 WebSocket 传输,常用于伪装成网页流量) 或 network: "kcp" (使用 mKCP 协议传输,可能在网络环境差时表现更好)。

传输方式 (streamSettings) 提供了强大的伪装和优化能力:

  • network: 指定底层传输协议 (tcp, kcp, ws, http, quic, grpc)。
  • security: 指定传输层的安全选项,最常用的是 "tls"。开启 TLS 可以加密传输过程,使其看起来像普通的 HTTPS 流量,大大提高抗检测能力。V2Ray 支持 TLS 的一些高级特性,如 Server Name Indication (SNI) 和 ALPN。
  • tlsSettings: 当 security"tls" 时的详细配置,包括证书、密钥、serverName (用于 SNI)、allowInsecure 等。
  • wsSettings: 当 network"ws" 时的详细配置,包括 path (WebSocket 路径) 和 headers,用于伪装成网页请求。
  • httpSettings: 当 network"http" (HTTP/2) 时的详细配置,包括 pathhost,也用于伪装。
  • kcpSettings: 当 network"kcp" 时的详细配置,用于优化网络传输。
  • quicSettings: 当 network"quic" 时的详细配置。
  • grpcSettings: 当 network"grpc" 时的详细配置。

XTLS: XTLS 是 V2Ray/Xray 项目引入的一种特殊的传输模式,它结合了 TLS 和 VMess/VLESS 协议的特性,在特定条件下可以实现更高效的加密传输,并且有额外的伪装效果。配置 XTLS 通常需要在 streamSettings 中将 security 设置为 "xtls""tls" (并启用 XTLS 特性),并在协议设置中进行相应配置。

理解协议与传输方式的区别和联系,特别是 streamSettings 的作用,是配置 V2Ray 实现隐蔽性和高性能的关键。

2.6 Policy (策略)

policy 配置允许你为不同的用户或连接级别设置不同的策略,例如连接的空闲超时时间、上行/下行缓冲区大小等。这有助于更精细地控制资源使用。

policy 配置主要有两个部分:levelssystem

  • levels: 一个对象,键是用户级别(数字,如 0, 1, 2…),值是该级别的策略配置。这些级别可以在 inbounds 的用户设置中指定。
  • system: 整个系统的策略配置。

示例片段 (Policy):

json
"policy": {
"levels": {
"0": { // 级别0用户的策略
"handshake": 4, // 握手超时时间
"connIdle": 300, // 连接空闲超时时间 (秒)
"uplinkOnly": 0, // 只计算上行流量 (0或1)
"downlinkOnly": 0 // 只计算下行流量 (0或1)
}
},
"system": {
"statsInboundUplink": true, // 开启入站上行流量统计
"statsInboundDownlink": true // 开启入站下行流量统计
}
}

Policy 配置相对简单,主要用于资源管理和流量统计的开关。

2.7 DNS

dns 配置用于指定 V2Ray 如何处理域名解析。V2Ray 可以在内置的 DNS 服务器中配置多个上游 DNS 服务器,并根据路由规则选择使用哪个 DNS 服务器进行解析。

示例片段 (DNS):

json
"dns": {
"servers": [
"1.1.1.1", // Cloudflare DNS
"8.8.8.8", // Google DNS
{ // 可以指定特定域名的DNS服务器
"address": "localhost",
"port": 53,
"domains": ["geosite:cn"] // 国内域名使用本地DNS
}
],
"hosts": { // 静态Hosts映射
"mydomain.com": "1.2.3.4"
}
}

合理的 DNS 配置对于提高解析速度、避免 DNS 污染以及配合路由规则进行分流非常重要。

2.8 API & Stats

  • api: 允许 V2Ray Core 启动一个内置的 API 服务器,其他程序可以通过这个 API 与 V2Ray Core 交互,例如获取统计信息、管理用户等。这通常用于 GUI 客户端或管理面板。
  • stats: 开启 V2Ray 的内置统计功能,可以统计各个 Inbound、Outbound 或用户的流量信息。需要配合 policy 中的统计开关使用。

示例片段 (API & Stats):

json
"api": {
"tag": "api", // API的出站tag (内部使用)
"services": ["StatsService"] // 开启统计服务API
},
"stats": {} // 开启统计功能 (具体统计项在policy中配置)

这些功能对于监控和管理 V2Ray 实例非常有用。

三、 V2Ray Core 的工作流程总结

综合上述概念,一个典型的 V2Ray Core 工作流程如下:

  1. 启动: V2Ray Core 启动,加载并解析 JSON 配置文件。
  2. 监听: 根据 inbounds 配置,V2Ray 在指定的端口和 IP 上开始监听连接。
  3. 接收连接: 客户端发起一个连接(例如,浏览器通过 SOCKS5 连接到 V2Ray 监听的 1080 端口)。V2Ray 的 SOCKS 入站模块接收到这个连接。
  4. 解析目标: SOCKS 入站模块解析出客户端想要连接的最终目标地址(例如 google.com:443)。
  5. 嗅探 (可选): 如果入站配置开启了流量嗅探,V2Ray 会尝试识别连接的应用层协议(例如识别出这是 TLS 连接)。
  6. 交给路由: V2Ray 将连接的信息(入站 Tag, 目标地址,协议等)提交给路由模块。
  7. 路由匹配: 路由模块按照 rules 列表从上到下检查。它会根据目标地址、入站 Tag、协议等信息,尝试找到第一个匹配的规则。
  8. 选择出站: 如果找到匹配的规则,路由模块根据规则指定的 outboundTagbalancerTag 选择相应的出站连接。
  9. 发送流量: V2Ray 使用选定的出站模块,根据其配置 (protocolstreamSettings),将客户端的数据发送到最终的目标地址(如果是 freedom 出站)或另一个代理服务器(如果是 vmess, shadowsocks 等出站)。
  10. 数据回传: 目标服务器响应数据后,数据会沿着出站 -> 路由 -> 入站的路径返回给客户端。

如果路由规则都没有匹配,流量会通过 outbounds 数组中的第一个出站连接发送。

四、 核心概念间的关系与协同工作

  • Inbound 和 Outbound: 它们是 V2Ray 的入口和出口,定义了数据如何进入和离开。每个 Inbound 和 Outbound 都有一个 tag,作为在路由中被引用的唯一标识。
  • Routing: 它是 V2Ray 的大脑,根据规则将来自特定 Inbound、符合特定条件的流量导向特定的 Outbound。
  • Protocol: 定义了数据内容的格式和处理逻辑,是应用层或代理层的功能。
  • Transport (Stream Settings): 定义了数据在底层如何传输,提供了伪装和优化的手段,是传输层的功能,依附于具体的 Protocol。
  • Configuration File: 它是所有这些组件的粘合剂和指令集,通过结构化的 JSON 格式将它们组织起来,定义了 V2Ray 的完整行为。

理解这些概念以及它们在配置文件中的位置和关系,是理解 V2Ray Core 工作原理的关键。V2Ray 的强大和灵活性正是来源于这种模块化设计和通过配置文件进行的自由组合。

五、 总结与展望

V2Ray Core 是 Project V 项目的核心,是一个功能强大、高度灵活的网络转发引擎。它通过 Inbound、Outbound 和 Routing 三大核心组件以及丰富的协议和传输方式配置,实现了复杂的流量控制、伪装和分发功能。

本文详细介绍了 V2Ray Core 的基础概念,包括其起源、基于 JSON 配置文件的架构、Inbound (入站)、Outbound (出站)、Routing (路由)、Protocol (协议)、Transport (传输方式) 等核心概念,并解释了它们之间的关系以及数据流在 V2Ray 内部的走向。

掌握这些基础概念,你就能读懂 V2Ray 的配置文件,理解每一项配置的意义,并能够根据自己的需求修改或从零开始构建 V2Ray 配置,从而充分利用 V2Ray 的强大功能,构建稳定、安全、高效的网络连接。

虽然 V2Ray Core 的配置初看起来可能有些复杂,但一旦理解了其模块化设计的理念和各个组件的作用,你会发现它提供了一个无比强大的平台,远不止一个简单的代理工具。无论是用于个人隐私保护、访问特定资源,还是构建更复杂的网络基础设施,V2Ray Core 都能提供坚实的基础。

未来,随着网络环境和技术的不断发展,V2Ray Core 及其社区也在持续演进,新的协议、传输方式和功能不断加入,使其能够应对更复杂的挑战。持续关注 V2Ray 的官方文档和社区资源,将帮助你更好地使用和掌握这个强大的工具。


发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注

滚动至顶部