VPN工作原理:隧道、封装与握手到底做了什么

Yalgorup 编辑部 · 更新于 2026年8月1日

VPN工作原理:数据包封装与隧道传输过程图解
一句话回答VPN工作原理可以拆成五步:客户端创建虚拟网卡并改写系统路由表,让流量先经过它;每个 IP 数据包被加密后作为「载荷」塞进一个新数据包(封装),发往 VPN 服务器;服务器解封装还原出原包并转发到目标地址。

核心要点

  • 隧道 = 封装 + 加密。封装决定数据怎么走,加密决定别人看不看得懂。
  • 虚拟网卡(TUN/TAP)是操作系统层面的入口,路由表决定哪些流量进入隧道。
  • 握手阶段用非对称加密协商出对称会话密钥,之后的数据传输全部用对称加密,因为它快得多。
  • 封装会增加包头,导致有效载荷变小,这就是 MTU 需要调整的原因。

理解 VPN工作原理,只需要跟着一个数据包走一遍:它从哪里进入隧道、被包了几层、密钥是怎么商量出来的、又在服务器那一端发生了什么。下面五步就是 VPN工作原理的完整链路。

第一步:系统里多了一块网卡

安装 VPN 客户端后,操作系统里会出现一个虚拟网络接口 —— Linux 下叫 tun0,Windows 上是一个虚拟适配器。它没有对应的物理硬件,但在系统看来和真网卡一样可以收发数据包。

TUN 设备处理的是 IP 层数据包,TAP 设备处理的是以太网帧。个人用的 VPN 几乎都用 TUN,因为只需要转发 IP 流量。

第二步:路由表被改写

有了虚拟网卡还不够,还要告诉系统「哪些流量走它」。客户端连接成功后会往路由表里插入条目,常见的做法是加两条 0.0.0.0/1128.0.0.0/1 的路由 —— 它们合起来覆盖全部 IPv4 地址,且优先级高于默认路由,同时又不会把原来的默认网关整个覆盖掉。

如果只想让部分流量走隧道(分流 / split tunneling),客户端就只插入特定网段的路由。

第三步:封装

这是「隧道」这个比喻的技术实体。原始数据包并没有被修改,而是被整个当作数据,装进一个新的数据包里:

[新 IP 头 | 协议头 | 加密后的( 原 IP 头 | TCP/UDP 头 | 应用数据 ) ]
      ↑ 目的地是 VPN 服务器            ↑ 中间设备只看到密文

不同协议的外层不一样:IPsec 用 ESP 头(RFC 4303),WireGuard 用自己定义的 UDP 报文格式,OpenVPN 把加密后的内容放进 UDP 或 TCP 里。

外层包头一定会占用空间。以太网默认 MTU 是 1500 字节,封装后可用于原始载荷的空间就少了几十字节。如果不调整,超长的包要么被分片,要么被丢弃 —— 表现就是「小网页能开、大文件卡死」。

第四步:握手与密钥

在传数据之前,双方必须先商量出一把只有彼此知道的钥匙,而且要在一条不可信的线路上完成。

大致流程是:

  1. 身份验证 —— 服务器出示证书或公钥,客户端验证它是不是自己要连的那台。
  2. 密钥交换 —— 用 Diffie-Hellman 一类的算法,双方各自算出同一个共享秘密,而窃听者拿不到。现代实现普遍用椭圆曲线版本(ECDHE / Curve25519)。
  3. 派生会话密钥 —— 从共享秘密派生出用于加密和校验的对称密钥。
  4. 切换到对称加密 —— 之后所有数据用 AES-GCM 或 ChaCha20-Poly1305 加密,因为对称算法比非对称快几个数量级。

优秀实现还会定期更换会话密钥(rekey)。这样即便某把密钥日后被攻破,也无法解开之前录下的流量 —— 这就是前向保密。详见 VPN 加密原理

第五步:服务器侧的转发

VPN 服务器收到包后解密、还原出原始 IP 包,然后做一次 NAT:把源地址换成自己的公网 IP,记录映射关系,再发往目标网站。回包按相反顺序处理。

正因为这一步,目标网站看到的永远是服务器 IP。也正因为这一步,服务器本身处于能看到全部明文流量的位置。

VPN工作原理在现实中的两个麻烦

NAT 穿透。 家庭路由器和运营商 NAT 会改写端口,长时间无流量的映射会被回收,表现为连接「假死」。协议层的应对是定期发保活包,或者用 MOBIKE(RFC 4555)这类机制在地址变化后重新绑定。

协议特征。 封装后的流量虽然内容不可读,但报文长度、握手模式、端口号构成了可识别的特征。想要不被识别,就需要额外的伪装层,见 混淆与伪装协议

常见问题

TUN 和 TAP 有什么区别?+

TUN 工作在第三层,处理 IP 数据包,是绝大多数 VPN 的选择;TAP 工作在第二层,处理以太网帧,能承载广播和非 IP 协议,多用于需要桥接局域网的场景。

为什么连上 VPN 后有些网站打不开,但大部分正常?+

常见原因是 MTU 过大导致大包被分片或丢弃。握手和小请求能通过,返回大页面时就卡住。把 MTU 调低(例如 1400 或更小)通常能解决。

UDP 和 TCP 承载有什么差别?+

UDP 开销小、延迟低,是默认选择;TCP 更容易穿过限制严格的网络,但会出现 TCP-over-TCP 的重传叠加,网络一差就明显变慢。

握手失败一般是什么原因?+

时间不同步导致证书校验失败、UDP 端口被拦截、服务器证书过期,或者中间设备对特定协议特征做了阻断。

参考资料

延伸阅读