Skip to content
🏆 2026 编辑力荐晚高峰稳定性实测首选
TOP 1光速云¥99/年

企业级内网 IPLC 专线 · 晚高峰 0 丢包 · 免配置自研微端

专属优惠券:AMM
🚀 直达官网 · 享专属特惠
TOP 2飞猫云¥9.9/月

国内三网 BGP 智能中转 · 专属开箱客户端 · 随时月付无套路

专属优惠券:flycat888
🐱 直达官网 · 9.9元上车

VPN 与代理有什么区别?OSI 模型网络层与应用层转发原理对比实测 ​

网络协议工程核心结论
VPN 与代理在计算机网络体系中处于完全不同的抽象层级。传统商业 VPN 工作在 OSI 模型的第二层数据链路层或第三层网络层,依托操作系统的 TUN 或 TAP 虚拟网卡驱动,把主机生成的所有原始 IP 数据报重新封装并篡改全局路由表。应用层代理工作在第七层,依赖本地监听的 SOCKS5 或 HTTP 端口,仅拦截主动接入该端口的应用进程流量。纯粹以加密专网为设计目标的传统 VPN 协议,例如 WireGuard 和 OpenVPN,具备固定的数据包长、明文头部特征与缺乏白名单伪装的握手过程,在国家级骨干网 DPI 审查下会遭遇迅速识别并被切断。用于突破封锁的现代工具大多采用应用层混淆转发结合用户态虚拟网卡技术,在保证全流量接管的同时模拟标准商业 HTTPS 流量。

返回科学上网入门知识大系

OSI 体系结构中的工作层级差异 ​

许多网络使用者经常把代理工具统称为翻墙软件,甚至直接叫作 VPN。从网络工程实现的角度审视,两者的底层通信协议栈与数据生命周期存在根本差异。国际标准化组织提出的开放系统互连参考模型(OSI 模型)把网络抽象为从物理信号到应用程序的七个层级。明确 VPN 与代理在这个层级图谱中的位置,是理解各类出海工具优缺点的前提。

text
+-----------------------------------------------------------------------------+
|               OSI 参考模型与出海工具协议栈层级映射                          |
+-----------------------------------------------------------------------------+

  OSI 层级               传统 VPN (WireGuard/OpenVPN)     应用层代理 (SOCKS5/HTTP)
  -----------------------------------------------------------------------------
  Layer 7 (应用层)       应用协议 (HTTP/DNS/SSH)          直接接管应用请求与认证
  Layer 6 (表示层)       TLS 加密载荷                     数据格式转换与加解密
  Layer 5 (会话层)       端到端会话维护                   SOCKS5 握手与会话建立
  Layer 4 (传输层)       TCP/UDP 原始段                   通过本地 Socket 端口转发
  -----------------------------------------------------------------------------
  Layer 3 (网络层)       IP 数据报整包捕获与外层封装      [不涉及,交由操作系统栈]
  Layer 2 (数据链路层)   TAP 模式捕获以太网帧             [不涉及]
  Layer 1 (物理层)       网卡物理介质发射                 网卡物理介质发射

网络第二层与第三层的报文封装 ​

虚拟专用网络在诞生之初,用于解决跨地域机构分支与总部内网的安全互联。为了让远程分支主机如同直接接入总部机房交换机,VPN 必须对底层报文保持透明。

当系统处于三层网络层 VPN 状态时,操作系统在内核空间创建 TUN 虚拟网络接口。应用程序向外部目标 IP 发出数据包时,内核协议栈生成标准的 IPv4 或 IPv6 报文头。路由表把该报文引向 TUN 接口。TUN 驱动不对数据载荷做应用层解析,直接把整枚 IP 数据报读取至 VPN 客户端程序。客户端对其执行对称加密并套上新的 UDP 或 TCP 外层报头,由物理网卡发射至对端网关。在对端网关处,外层报文被剥离,内层原始 IP 报文被重新注入对端内核路由表。

若采用二层数据链路层 VPN,操作系统使用 TAP 驱动,捕获对象为包含 MAC 地址与 ARP 广播的以太网数据帧。局域网广播组播通信能无缝穿透隧道,但带来了沉重的封包开销。

应用层第七层的连接代理 ​

SOCKS5 和 HTTP 代理不介入操作系统内核的报文封装逻辑,代理客户端仅在本地回环地址开放 TCP 监听端口。

运行在系统上的浏览器配置代理端口后,发起网络请求时不会直接建立端到端 TCP 握手,而是主动向本地代理端口建立连接。随后浏览器按照 RFC 1928 规范发送目标域名和端口信息。本地代理程序收到请求后,通过加密通道通知境外服务端,由服务端在远端建立连接并中继应用载荷。

七层代理无法接收操作系统底层的 ICMP 报文、广播数据包或未配置代理规则的后台进程流量。若应用程序未实现代理支持且忽略系统代理环境变量,其流量会完全脱离代理程序,沿默认物理网卡明文直连外网。


TUN/TAP 虚拟网卡与路由表接管机制 ​

为了克服应用层代理必须依赖软件逐一配置端口的局限,现代分流客户端大量集成了 TUN 虚拟网卡模式。这种模式在架构上借鉴了传统 VPN 的三层数据捕获方式,但在出口处保留了代理程序精细分流的控制能力。

text
+-----------------------------------------------------------------------------+
|                   TUN 模式内核协议栈数据截获与转发拓扑                      |
+-----------------------------------------------------------------------------+

 [ 各种用户态应用程序 ]  (浏览器、游戏客户端、终端命令行、系统服务)
        |
        | 发出原始网络调用 (Socket Connect / Sendto)
        v
 +---------------------------------------------------------------------------+
 |                          操作系统内核网络协议栈                           |
 |                                                                           |
 |   +-----------------+           匹配默认路由            +---------------+ |
 |   | 核心路由决策表  | -------------------------------> | TUN 虚拟接口  | |
 |   | (Route Table)   | (0.0.0.0/1 & 128.0.0.0/1)        | (wintun/tun0) | |
 |   +-----------------+                                   +---------------+ |
 +-----------------------------------------------------------------|---------+
                                                                   |
        +----------------------------------------------------------+
        | 读取裸 IP 数据包 (包含完整 IP Header + TCP/UDP Header)
        v
 +---------------------------------------------------------------------------+
 |                     代理客户端用户态内核 (sing-box / clash)                |
 |                                                                           |
 |   [ lwIP / gVisor 网络协议栈解析 ]  --> 提取四元组与域名 (Fake-IP 反查)   |
 |                                                                           |
 |   [ 规则匹配分流引擎 ]                                                    |
 |        |                                                                  |
 |        +-----> 命中直连规则 --------> 物理网卡绑定 Socket 直连出海        |
 |        |                                                                  |
 |        +-----> 命中代理规则 --------> 混淆加密流 (Reality/Hy2) 跨境传输   |
 +---------------------------------------------------------------------------+

虚拟设备驱动的平台差异与实现机制 ​

在主流操作系统中,虚拟网卡由内核驱动模块提供。

  • Windows 平台早期依赖 TAP-Windows 驱动,通过 NDIS 接口挂载,高并发场景下上下文切换频繁。WireGuard 团队研发的 Wintun 精简了三层 TUN 架构,直接集成于 Windows 内核,移除了以太网帧与 ARP 开销,使用环形缓冲区传递数据,吞吐提升显著。
  • Linux 平台原生支持 Universal TUN/TAP 驱动,在 /dev/net/tun 设备字符节点执行 ioctl 调用即可分配虚拟网卡,网络栈成熟。
  • macOS 平台使用 NetworkExtension 框架在用户态提供虚拟网络扩展,规避了传统内核扩展的系统崩溃风险。

路由表覆盖与双网段拆分技巧 ​

虚拟网卡激活后,操作系统需定向分发报文。直接删除系统默认路由 0.0.0.0/0 会导致代理进程回包通信落入死循环。

工程上普遍采用掩码分拆法。IPv4 路由遵循最长前缀匹配原则,掩码越长优先级越高。代理客户端保留原物理网关,向系统追加两条掩码为 /1 的精准路由。

第一条路由 0.0.0.0/1 指向 TUN 设备,覆盖前半段 IP 空间。 第二条路由 128.0.0.0/1 指向 TUN 设备,覆盖后半段 IP 空间。

两条 /1 路由严格优于物理网卡默认的 /0 路由,发往外部的主机报文优先送入 TUN 虚拟网卡。代理自身发往境外节点的底层套接字通过绑定物理网卡 IP 或路由标记(Fwmark)直连物理接口,彻底避免了路由环路。

bash
# 查看 Linux 路由表中最长前缀匹配的两条掩码分拆路由
ip route show

# 典型输出如下
default via 192.168.1.1 dev eth0 proto dhcp metric 100
0.0.0.0/1 dev tun0 scope link
128.0.0.0/1 dev tun0 scope link
198.18.0.0/15 dev tun0 scope link

内核态与用户态数据拷贝的性能代价 ​

TUN 模式具备全流量接管能力,但在系统调度上开销高于纯应用层代理。

纯七层 SOCKS5 代理仅在本地环回 Socket 流转,内核只需维护标准 TCP 缓冲区。而在 TUN 模式下,传输流程包含五个环节。

  1. 应用程序发起通信,内核协议栈生成原始 IP 报文并写入 TUN 缓冲区。
  2. 系统发生内核态到用户态上下文切换,驱动拷贝内存至代理进程。
  3. 代理客户端在用户态通过内置的 lwIP 或 gVisor netstack 软件网络栈解析 IP 与 TCP 报头,组装分片重构滑动窗口。
  4. 提取出应用载荷后执行分流判定与协议加密。
  5. 代理进程通过标准 Socket 发送加密数据,经历二次上下文切换进入物理网卡。

千兆网络压测下,用户态协议栈解包与内存拷贝容易拉高单核 CPU 负载。选用 Wintun 驱动与开启硬件校验和是优化吞吐的核心措施。


七层应用代理的连接与中继机制 ​

与三层驱动接管不同,应用层代理从通信发起的源头就把控着请求。理解 SOCKS5 握手和 HTTP CONNECT 隧道的工作方式,有助于排查为什么某些非标准通信无法通过普通代理完成传输。

text
+-----------------------------------------------------------------------------+
|                     SOCKS5 协议 RFC 1928 标准握手时序                       |
+-----------------------------------------------------------------------------+

 客户端应用 (例如 Firefox)                            本地 SOCKS5 代理服务端
       |                                                         |
       |  1. 方法协商请求 (Version: 0x05, NMethods: 1, 0x00无验证) |
       | ------------------------------------------------------> |
       |                                                         |
       |  2. 方法确认响应 (Version: 0x05, Method: 0x00)          |
       | <------------------------------------------------------ |
       |                                                         |
       |  3. 连接命令请求 (CMD: 0x01 Connect, 目标域名与端口)    |
       | ------------------------------------------------------> |
       |                                                         |
       |                                          [发起远端链路建立与鉴权]
       |                                                         |
       |  4. 连接建立响应 (REP: 0x00 成功, 绑定地址与端口)       |
       | <------------------------------------------------------ |
       |                                                         |
       | [============= 隧道握手完成,进入纯双向数据透明中继 ============]
       |                                                         |
       |  5. 原始 TLS ClientHello / HTTP 数据载荷                |
       | ------------------------------------------------------> |

SOCKS5 协议握手流程与报文分析 ​

SOCKS5 是一种纯粹的应用层协议,运行在 TCP 传输层之上,由 IETF 在 RFC 1928 中正式标准化。该协议不强制要求任何加密,核心使命是在防火墙边界为通信双方协商并穿透应用层连接。

在一次完整的连接建立中,客户端与代理服务器首先建立普通 TCP 连接,随后完成两轮交互。

第一轮,认证方法协商 ​

客户端发送协商请求,报文结构极其紧凑。

text
+----+----------+----------+
|VER | NMETHODS | METHODS  |
+----+----------+----------+
| 1  |    1     | 1 to 255 |
+----+----------+----------+

字节 VER 固定为 0x05,代表 SOCKS5 版本。NMETHODS 代表支持的验证方案数量。常见的方案包含 0x00(无须身份认证)和 0x02(账号密码验证)。代理服务器返回确认报文,包含版本号及选定的认证方法。如果选定 0x00,认证阶段结束。

第二轮,连接指令下发 ​

客户端向代理服务器告知想要访问的目标地址。报文结构如下。

text
+----+-----+-------+------+----------+----------+
|VER | CMD |  RSV  | ATYP | DST.ADDR | DST.PORT |
+----+-----+-------+------+----------+----------+
| 1  |  1  | X'00' |  1   | Variable |    2     |
+----+-----+-------+------+----------+----------+

其中 CMD 字段至关重要。取值为 0x01 代表 CONNECT 命令,指示代理建立一条对外的普通 TCP 连接;取值为 0x03 代表 UDP ASSOCIATE 命令,要求代理服务器开辟 UDP 转发通道。

ATYP 字段定义了目标地址的表示形式。0x01 代表标准的 4 字节 IPv4 地址,0x04 代表 16 字节 IPv6 地址,0x03 代表域名格式。当 ATYP 为 0x03 时,DST.ADDR 的首字节为域名的字符长度,后接具体的域名 ASCII 字符串。

这个设计赋予了代理软件强大的远程解析能力。当客户端把目标域名直接写入 SOCKS5 报文交由远端解析时,本地完全不需要执行 DNS 查询,彻底斩断了本地运营商的 DNS 劫持通道。

代理服务器在远端建立连接后,向客户端回传响应报文。当 REP 字段为 0x00 时,代表连接成功。此后,两端之间的 TCP 链路完全进入透传状态,应用层协议如 TLS 或 HTTP 报文在两端之间无序透明流转。

HTTP CONNECT 隧道代理 ​

与 SOCKS5 相似但基于纯文本的代理方式是 HTTP CONNECT。早期 Web 代理服务器用于缓存静态网页,客户端直接向代理发送 GET http://example.com/index.html HTTP/1.1。面对 HTTPS 的端到端加密,明文代理无法读取密文中的主机路径。

为了解决这个问题,HTTP 1.1 引入了 CONNECT 方法。客户端向代理服务器发送一条特殊的明文请求。

http
CONNECT twitter.com:443 HTTP/1.1
Host: twitter.com:443
User-Agent: Mozilla/5.0
Proxy-Connection: Keep-Alive

代理服务器收到该请求后,自行调用系统的 Socket 连接外部的 twitter.com 443 端口。连接成功后,代理服务器向客户端输出状态码。

http
HTTP/1.1 200 Connection Established
Proxy-Agent: ProxyServer/1.0

收到该状态码后,客户端把后续该 Socket 上的所有输入输出都当成直接面对远程服务器,开始发送标准的明文 TLS ClientHello 握手包。HTTP CONNECT 仅能转发基于 TCP 的流式协议,天然无法处理任何 UDP 报文。


裸协议特征为何秒封 WireGuard 与 OpenVPN 的审查困境 ​

在网络工程实践中,一个令许多新手困惑的现象是,工业界被公认为高度安全、采用现代顶级密码学的商业级虚拟专网协议(如 WireGuard 和 OpenVPN),在跨境网络出海中往往存活不超过几十分钟甚至几分钟,服务器端口就会被封锁。许多自建节点用户百思不得其解,误以为自己的服务器 IP 遭受了针对性排查。

这种现象的根源在于安全设计目标与网络审查环境的错位。WireGuard 和 OpenVPN 诞生的初衷是抵抗窃听、篡改与中间人攻击,从一开始就没有将流量混淆与规避模式匹配纳入威胁模型。它们的协议特征在骨干网深度包检测(DPI)面前如同裸奔。

text
+-----------------------------------------------------------------------------+
|                      WireGuard 协议握手报文固定特征剖析                     |
+-----------------------------------------------------------------------------+

 1. Type 1: Handshake Initiation (发起握手) - 严格固定为 148 字节
 +---------+---------+--------------------+-------------------+---------------+
 | Type(1) | RSV(3)  | Sender Index (4B)  | Uncompressed (32B)| Encrypted(16B)|
 | 0x01    | 0x000000| 客户端本地会话索引 | Ephemeral Key     | Static Key    |
 +---------+---------+--------------------+-------------------+---------------+
 | Encrypted Timestamp (12B + 16B Poly1305 MAC)                               |
 +----------------------------------------+-----------------------------------+
 | MAC1 (16B 哈希计算)                    | MAC2 (16B Cookie 散列)            |
 +----------------------------------------+-----------------------------------+

 2. Type 2: Handshake Response (握手响应) - 严格固定为 92 字节
 +---------+---------+--------------------+-------------------+---------------+
 | Type(1) | RSV(3)  | Sender Index (4B)  | Receiver Index(4B)| Ephemeral(32B)|
 | 0x02    | 0x000000| 服务端本地会话索引 | 对应客户端的索引  | 服务端临时公钥|
 +---------+---------+--------------------+-------------------+---------------+
 | Empty Encrypted Payload (0B + 16B MAC) | MAC1 (16B)        | MAC2 (16B)    |
 +----------------------------------------+-------------------+---------------+

 3. Type 4: Data Packet (数据传输) - 报头严格为 32 字节 + 16 字节 MAC 开销
 +---------+---------+--------------------+-------------------+---------------+
 | Type(1) | RSV(3)  | Receiver Index(4B) | Counter (8B)      | Encrypted ... |
 | 0x04    | 0x000000| 对端会话索引       | 单调递增序列号    | 密文载荷      |
 +---------+---------+--------------------+-------------------+---------------+

WireGuard 的报文长度指纹与固定静态头部 ​

WireGuard 以其代码极为紧凑(内核仅约四千行 C 代码)和基于 Noise 协议框架的高性能著称。它在抗封锁层面具有三个致命的确定性特征。

第一,类型字段的绝对固定。每个 WireGuard UDP 报文的第一个字节明确声明了当前报文的语义。0x01 代表发起握手,0x02 代表响应握手,0x03 代表 Cookie 挑战,0x04 代表传输数据载荷。随后的三个字节全部用零填充作为保留字段。

第二,报文长度的高度精确性。在没有任何流量干扰的情况下,客户端发送的 Handshake Initiation 报文长度必须严丝合缝地等于 148 字节。任何多出一个字节或少一个字节的报文都会被 WireGuard 官方内核直接丢弃。服务端回执的 Handshake Response 报文长度必须严丝合缝地等于 92 字节。数据报文由于采用 ChaCha20-Poly1305 算法,拥有固定的 16 字节认证标签与 32 字节固定报头。

对于骨干网 DPI 设备中的硬件 ASIC 交换芯片而言,检测一个发往境外的 UDP 数据流是否以连续的 148 字节包开头、并紧接着收到一个 92 字节应答,比对计算只消耗几个纳秒的时钟周期。审查系统甚至不需要解密其内容,只要在特定滑动窗口内命中这个长度组合,就会立刻对该 UDP 五元组下发阻断策略。

OpenVPN 的静态头部与明文 TLS 握手特征 ​

OpenVPN 默认使用 UDP 1194 端口或 TCP 443 端口。它支持传统的 TLS 握手流程,在握手最前端定义了自己的封包协议头。

OpenVPN 报文的第一个字节由两部分组成,高 5 位是操作码(Opcode),低 3 位是密钥 ID(Key ID)。在建立连接时,客户端必定发出 P_CONTROL_HARD_RESET_CLIENT_V2(Opcode 值为 7)报文。随后的字节依次携带 8 字节的本地会话 ID、重传消息计数器以及确认序列号。

如果审查设备在 443 端口监听到一个声明为 TLS 握手的通信,其报文头部却带上了 OpenVPN 的固定会话标头,DPI 硬件的多模式匹配引擎便能完成判定。即使开启了 OpenVPN 提供的 tls-auth 或 tls-crypt 签名校验,由于缺少现代流控中必须的白名单伪装,其数据流呈现出高随机性的全熵分布(没有任何明文协议结构),在骨干网针对未知加密高熵 UDP 流的启发式分析中,也会被迅速列为可疑并施以 QoS 限速丢包。

主动探测对传统协议的致命确权 ​

很多用户发现自建的 WireGuard 节点在只跑了几兆流量后就无法连通。审查系统不仅仅停留在被动监听,还具备高度自动化的主动探测机制。

当分光监听设备发现一个高可疑度的 UDP 或 TCP 端口时,调度指令下发给分布在各大机房的探测探针。探针伪装成普通客户端向目标主机的对应端口发送经过精心构造的重放报文或者畸形握手报文。

由于标准 WireGuard 严格遵循安全原则,对任何无法解密的包采取静默丢弃策略,探测探针对其发送特定垃圾数据时,服务器表现出完全静默,对合法握手却有响应。这种特定的状态机反应进一步证实了该端口正在运行翻墙或私有加密服务,骨干路由器随之下发单向黑洞路由。


路由表劫持、DNS 泄露与 WebRTC 旁路实测 ​

许多用户在使用代理或自建 VPN 之后,访问检测网站时惊讶地发现自己的国内真实公网 IP 或本地 ISP 分配的 DNS 解析服务器被完全暴露。这种现象被称为网络泄漏,它通常由于操作系统多宿主路由策略缺陷、IPv6 缺乏管控或浏览器特定插件旁路引起。

text
+-----------------------------------------------------------------------------+
|                      常见网络泄露的三大技术漏洞成因                         |
+-----------------------------------------------------------------------------+

 1. IPv6 旁路回源泄露 (缺乏 IPv6 路由接管)
   [客户端应用] ---- 域名含 AAAA 记录 ---> 发起 IPv6 连接
        |
        +-- (代理未接管 IPv6) ---> 操作系统走物理网卡原生 IPv6 直连出海 (真 IP 泄露)

 2. Windows 智能多宿主名称解析 (SMHNR 泄露)
   [系统 DNS 查询]
        |
        +---- 并发向 TUN 虚拟接口 DNS 发送查询 (经过代理)
        |
        +---- 并发向 物理网卡运营商 Local DNS 发送查询 (明文直连泄露域名行为)
              (谁最快返回就采信谁,运营商完整记录用户访问的每一个境外域名)

 3. 浏览器 WebRTC STUN 穿透泄露
   [网页 JavaScript] ---- 调用 RTCPeerConnection API
        |
        +---- 绕过应用代理设置,直接向 STUN 服务器发起 UDP 打洞
        |
        +---- 返回客户端本地局域网私有 IP 以及当前直连物理网卡的真实公网 IP

IPv6 旁路绕过与本地真实 IP 暴露 ​

国内三大运营商已普遍普及公网 IPv6 地址。部分自建节点仅配置了单栈 IPv4 网络,客户端也仅接管 IPv4 路由。当访问支持双栈的网站时,浏览器依据 RFC 8305 快乐眼算法同时发起 A 与 AAAA 记录解析。

原生 IPv6 路由未被代理规则接管,操作系统直接通过物理网卡走电信、联通或移动的 IPv6 出口直连境外。测试网站捕获的正是本地运营商分配的真实 IPv6 地址,直接暴露用户所在城市与宽带账号。

Windows 智能多宿主名称解析机制与 DNS 泄露 ​

Windows 引入的智能多宿主名称解析机制(SMHNR)在多网卡环境下会并发向所有适配器的 DNS 服务器发送查询。

即便 TUN 虚拟网卡配置了远端安全 DNS,物理网卡由运营商分配的本地 DNS 依然并发收到了用户的明文 UDP 查询。运营商日志因此完整记录了域名访问流水。

powershell
# 在 Windows PowerShell 中检测当前活跃网络适配器的真实 DNS 绑定情况
Get-NetIPConfiguration | Select-Object InterfaceAlias, IPv4Address, DNSServer

# 排查是否配置了防止多宿主名称解析泄露的组策略
# 推荐执行该注册表写入以关闭智能多宿主解析
Set-ItemProperty -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows NT\DNSClient" -Name "DisableSmartNameResolution" -Value 1 -Type DWord

浏览器 WebRTC STUN 穿透漏洞实测 ​

WebRTC(Web 实时通信)是一项内置于现代浏览器(Chrome、Edge、Firefox、Safari)中的底层技术,用于支持网页端无需插件直接进行低延迟音视频会议或 P2P 文件传输。

为了穿透双方客户端复杂的 NAT 设备,WebRTC 规范定义了 ICE(交互式连通建立)框架,客户端在 JavaScript 调用下会主动向公网 STUN 服务器(Session Traversal Utilities for NAT)发送 UDP 绑定探测包。

致命的是,浏览器底层的 WebRTC 穿透代码直接穿透所有常规的应用层 HTTP 与 SOCKS5 代理设置。即使你在 Chrome 浏览器中安装了 Proxy SwitchyOmega 等扩展并指定了全局代理,网页中的一段简短脚本依然能强行触发物理网卡发射 UDP 探测,让远程 STUN 服务器把本地网卡的内网 IP 和物理公网 IP 回传给网页后台。

javascript
// 一段能够检测并暴露真实 IP 的标准 WebRTC 测试代码片段
const rtc = new RTCPeerConnection({ iceServers: [{ urls: "stun:stun.l.google.com:19302" }] });
rtc.createDataChannel("");
rtc.createOffer().then(offer => rtc.setLocalDescription(offer));
rtc.onicecandidate = (event) => {
  if (event && event.candidate && event.candidate.candidate) {
    const candidateStr = event.candidate.candidate;
    // 候选者字符串中直接包含了未经代理保护的本机物理 IP 地址
    console.log("检测到暴露的物理网络候选地址: " + candidateStr);
  }
};

防御该漏洞的工程方案是在客户端开启深度 TUN 模式,把所有 UDP 流量从三层截获,或者在 Chrome 启动参数中追加 --disable-webrtc-hw-decoding,或在浏览器中安装防 WebRTC 泄露扩展将候选者绑定模式强制限定为主机接口。


巨幅技术参数对比大表 ​

为了帮助网络工程师与技术读者建立直观的选型图谱,下表对标准 VPN、传统应用代理与现代出海混淆代理三大技术流派的综合参数进行了横向拆解。

评估维度标准二三层 VPN (WireGuard / OpenVPN)传统应用代理 (SOCKS5 / Shadowsocks)现代混淆翻墙代理 (VLESS Reality / Hysteria 2)
OSI 工作层级Layer 2(数据链路层)/ Layer 3(网络层)Layer 7(应用层)Layer 7 结合用户态 TUN(全层覆盖)
流量接管粒度全局操作系统网卡级接管单进程或手动配置代理端口按域名、IP、进程名称进行规则精确分流
抗 GFW DPI 能力极弱。握手有固定长度,无抗主动探测较弱。纯加密流存在高熵检测特征极强。借用正规知名站点证书,无固定指纹
伪装与混淆技术无。直接暴露专有报文头或对称密文仅基础对称加密,缺乏协议层伪装伪装为真实主流 HTTPS/QUIC Web 流量
ICMP/Ping 报文支持原生完全支持完全不支持TUN 模式下可在用户态模拟回显
原生 UDP 转发支持原生无缝封装支持需客户端和服务端显式支持 UDP 扩展全面支持,部分协议利用 QUIC 实现多路复用
系统资源与 CPU 消耗内核态处理,CPU 极低(WireGuard 极佳)用户态轻量 Socket,内存占用极少需用户态网络栈协议解包,高吞吐下占 CPU
DNS 泄露防范能力依赖严格的路由规则或强制锁定 DNS易发生本地 DNS 与 IPv6 旁路泄露内置 Fake-IP 映射与远端安全 DoH 解析
抗晚高峰网络丢包差。OpenVPN 基于 TCP 时频繁拥塞退避取决于底层协议,标准 TCP 容易断流极强。Hysteria 2 等配备暴力拥塞控制算法
移动端耗电与保活WireGuard 无状态心跳省电,OpenVPN 耗电客户端保活性能中等规则分流引擎在移动端需持续占用少许内存

常见网络故障与配置排查实战 ​

在理解了二三层网卡接管与七层代理的工作差异后,工程实践中遇到的各类偶发网络故障便能迅速定位。

为什么开启代理后公司内网、局域网打印机或 NAS 无法连接? ​

这是开启 TUN 虚拟网卡后最常见的故障场景。

当代理客户端的 TUN 模式向路由表中写入 0.0.0.0/1 和 128.0.0.0/1 时,如果分流规则文件没有明确剔除局域网私有保留地址段,所有发往 192.168.0.0/16、10.0.0.0/8 和 172.16.0.0/12 的通信报文也会被无脑导入 TUN 接口。

代理客户端在用户态收到这些报文后,发现其目标是私有 IP,无法通过境外 VPS 进行公网投递,导致局域网通信全部超时断开。

解决方案是确保分流配置文件的路由表接管中配置了精准的保留地址绕过清单。以 sing-box 客户端为例,其 inbound 配置中必须设置 auto_route 并声明绕过内网网段。

json
{
  "inbounds": [
    {
      "type": "tun",
      "tag": "tun-in",
      "interface_name": "tun0",
      "inet4_address": "172.19.0.1/30",
      "auto_route": true,
      "strict_route": true,
      "stack": "system",
      "route_exclude_address": [
        "10.0.0.0/8",
        "172.16.0.0/12",
        "192.168.0.0/16",
        "fc00::/7"
      ]
    }
  ]
}

终端命令行执行 curl 或 git 命令时为什么不走代理? ​

在 Windows 的图形界面中开启代理软件后,系统代理设置(System Proxy)本质上只是在 Windows 注册表 HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings 写入了 ProxyEnable=1 和代理服务器地址。

这个注册表键值只会被 Chrome、Edge 等基于系统网络库的 GUI 软件主动读取。Linux 终端环境、Windows PowerShell、Git 命令行工具或 Python 脚本默认完全忽略该注册表项。

如果代理软件仅以系统代理模式运行,命令行发出的所有网络请求依然走物理网卡明文直连。

要让命令行程序走代理,有两种工程手段。

手段一,在终端中主动声明环境变量。

bash
# 在 Linux / macOS Bash 环境下设置环境变量
export http_proxy="http://127.0.0.1:7890"
export https_proxy="http://127.0.0.1:7890"
export all_proxy="socks5://127.0.0.1:7890"

# 在 Windows PowerShell 环境下设置环境变量
$env:http_proxy="http://127.0.0.1:7890"
$env:https_proxy="http://127.0.0.1:7890"
$env:all_proxy="socks5://127.0.0.1:7890"

手段二,直接启动代理软件的内核 TUN 模式。一旦三层虚拟网卡与全局路由表生效,无论什么命令行工具、甚至无代理配置选项的编译工具链,其发出的 IP 报文均在操作系统底层被强制捕获并导入分流,无须逐一配置环境变量。


VPN 与代理技术常见问答 ​

现代代理工具的 TUN 模式与商业 VPN 还有区别吗? ​

在数据捕获层面上它们已经基本相同,都依靠虚拟网卡驱动接管三层 IP 数据包并修改路由表。核心区别在于出口处理机制。商业 VPN 把抓到的数据包简单打包装入加密隧道全盘送往境外单一出口;而现代代理工具在用户态通过内置的虚拟网络协议栈把数据包还原,再依据预先设定的规则(例如域名列表、国内 IP 数据库、应用进程白名单)实现分流。国内网站直连物理网卡,国外网站走混淆节点,特定内网完全绕过。

为什么很多人不推荐用商业 VPN 翻墙? ​

海外知名的商用 VPN(如 ExpressVPN、NordVPN、Surfshark)面向欧美用户在公共 Wi-Fi 环境下的隐私加密场景,核心功能是防御局域网嗅探与商业跟踪,设计时没有将规避深度包检测作为目标。它们采用的底层协议多为 OpenVPN、IKEv2 或 WireGuard 原生实现,协议头特征显著且缺乏伪装。在遇到大规模国际出口 DPI 阻断时,极易出现大面积节点不可用。同时,商业 VPN 缺乏针对国内常用应用的分流白名单,一旦开启,访问微信、淘宝或国内银行也会绕经境外节点,导致访问变慢甚至触发账号风控。

SOCKS5 代理和 HTTP 代理在安全性上有何区别? ​

两者在协议本身上都是未加密的纯文本协议。SOCKS5 仅在握手建立阶段声明目标主机与端口,对后续传输的载荷一概不审视,如果其承载的是 HTTPS 流量,客户端与远程目标网站端到端加密,中间人无法读取其内容。HTTP 代理(非 CONNECT 隧道模式)直接解析 HTTP 文本,缺乏端到端加密防护。现代科学上网客户端提供的所谓本地 HTTP/SOCKS5 端口,仅仅是主机内部的本地环回接口,真正的跨洋传输部分会被客户端二次打包成高强度的加密协议进行通讯,因此在本地接口层面无需过分焦虑加密强弱。

开启 TUN 模式后打外服游戏,能起到游戏加速器的效果吗? ​

取决于节点线路质量与底层拥塞控制协议。游戏加速器本质上也是一种特定路由策略的虚拟专用网或应用代理,其核心优势在于购买了昂贵、低抖动的专线带宽(例如 IPLC 或 IEPL 专线)。如果你的代理节点是优质的低延迟专线节点,且客户端开启了抗丢包算法,TUN 模式完全能够接管游戏客户端的 UDP 数据包并提供优秀的加速体验。如果使用的是普通跨洋公网节点,晚高峰严重的国际出口拥塞和丢包会导致游戏跳 Ping、丢包卡顿。

为什么在进行 DNS 泄漏测试时,看到多个不同国家的 DNS 服务器? ​

当你在测试网站看到多个海外 DNS 节点时,说明代理客户端的远程解析功能已经正常生效。代理服务端在海外向当地的公共 DNS(如 Cloudflare 的 1.1.1.1 或 Google 的 8.8.8.8)发出递归查询,公共 DNS 在全球部署了大量 Anycast 泛播节点,根据服务端所在机房的最佳路由就近应答。只要测试结果中没有出现任何属于你所在省份电信、联通、移动的本地 DNS IP,就代表你的实际访问行为没有发生明文泄漏。


返回科学上网入门知识大系