📡 第五章 防火墙功能与防范威胁的对策
📄 一句话概括

VPN 不是「加密一下」,是「在原包外面再套一层,然后走公网」。 套上去的每一字节都占带宽,小包业务最吃亏。

📝 本节和前面几节的关系

上一节讲地址转换,这一节讲「在公网上造一条私有通道」。 03.05.06 讲过隧道的基本原理,这一节补「防火墙怎么参与」。

一、两种模式,差在保不保留原头

传输模式:只加密载荷,保留原来的 IP 头。用于「主机到主机」。 隧道模式:整个原包加密,外面再套一个新 IP 头。用于「网关到网关」。

模式 原 IP 头 典型场景


传输模式 保留,只加 ESP 主机到主机 隧道模式 整体加密,外套新头 站点到站点

为什么会分两种:站点间 VPN 要让「内网的私网地址」穿过公网, 所以必须把整个原包(含私网地址的头)藏进载荷里,外面再用公网地址的头包一层。 这就是隧道模式存在的理由。

二、两套协议,各管一段

IPsec:网络层,管「IP 包怎么安全地穿过公网」。 SSL/TLS VPN:应用层,管「浏览器怎么安全地连进来」。

两者的适用场景不同:IPsec 适合「站点到站点」,因为两端都是固定设备,配置一次长期有效。 SSL VPN 适合「人出差在外」,因为客户端只要一个浏览器,不用装东西。

IPsec 有两个子协议,分工是:IKE 负责「协商密钥」(走 UDP 500 或 4500), ESP 负责「加密与完整性」(走 IP 协议号 50)。 注意 ESP 不是 TCP 也不是 UDP,所以它在 NAT 后面特别麻烦——因为 NAT 只认端口。

这就引出了「NAT 穿透」(NAT-T):把 ESP 包塞进 UDP 4500 里发出去, 这样 NAT 就能按端口做转换了。 代价是多一层 UDP 头(8 字节)。

三、封装的开销怎么算

隧道模式的 ESP 封装,从头到尾要加这些: 新 IP 头 20、ESP 头 8、IV 16、填充、填充长度 1、下一头部 1、ICV 16。

按 AES 的分组长度 16 计算: 一个 100 字节的载荷,加密后从 128 字节涨到 176 字节,膨胀 37.5%。 而 40 字节的小包,膨胀超过 100%。

这个「小包最吃亏」的结论很重要: 因为语音(VoIP)恰好就是小包——每 20 毫秒一个包,每包几十字节。 所以「VoIP 走 VPN」时,链路带宽要按「账面码率的两倍以上」来规划。

还有一笔账是「MTU」:封装之后包变大了,可能超过链路的 MTU(常见 1500), 于是要分片——而分片会大幅降低性能。 所以隧道接口通常要把 MTU 调小(比如 1400),或者开「路径 MTU 发现」。

四、动手 Demo:IPsec 的封包开销有多少

这段把隧道模式 ESP 的每一层开销列出来,按 16 字节分组算填充,再对 40、100、500、 1400 四种载荷算膨胀比例。

inner = 20 + 8 + pl
b = inner + 8 + 16
pad = (16 - (b + 2) % 16) % 16
b += pad + 2 + 16
outer = 20 + b

实跑输出:

--------------------------------------------------------------------
IPsec 的封包开销有多少
--------------------------------------------------------------------
**VPN 不是「加密一下」,是「原包外面再套一层」。**
**套上去的每一字节都要占带宽。**

**ESP 隧道模式的封装结构**(从外到内):

  新 IP 头 20 字节
  ESP 头 8 字节(SPI 4 + 序号 4)
  IV 16 字节(AES 分组长度)
  原 IP 包(含原 IP 头 20 字节)
  填充(补到 16 的整数倍)
  填充长度 1 + 下一头部 1
  完整性校验值 16 字节(SHA-256 截断到 128 位)

**算一个 100 字节的有效载荷会被撑成多大**:

  原始:100 字节载荷 + 28 字节头 = 128 字节。
  加密后:196 字节(其中填充 6 字节)。
  膨胀 53.1%。

**小包最吃亏**:

    40 字节载荷 →  132 字节,膨胀  94.1%。
   100 字节载荷 →  196 字节,膨胀  53.1%。
   500 字节载荷 →  596 字节,膨胀  12.9%。
  1400 字节载荷 → 1492 字节,膨胀   4.5%。

**所以 VoIP 这类小包业务走 VPN 时,实际占用带宽是账面值的两倍以上。**
**规划链路时不能只按业务码率算。**

这段最有用的是「小包最吃亏」那条曲线:40 字节载荷要膨胀一倍以上,1400 字节只膨胀一成多。 所以「加密不影响性能」这句话在大包场景成立,在小包场景完全不成立。

填充到 16 的整数倍是分组密码的要求:AES 一次处理 16 字节,不够就得补。 这也解释了为什么「换个加密算法」不一定能减小开销——开销的大头是固定头(20 + 8 + 16 + 16 = 60 字节),不是填充。

最后那句 MTU 要记住:隧道接口的 MTU 通常设成 1400 而不是 1500, 就是为了给封装留出空间,避免分片。 这个「默认值」背后是一条实打实的算术,不是随手定的。

30 秒实验

  1. 查一下你用的 VPN 客户端,看它是隧道模式还是传输模式。
  2. 看隧道接口的 MTU 设成了多少,和 1500 差多少。
  3. 想一想:为什么 ESP 在 NAT 后面要改成 UDP 封装?

常见误区

  1. 以为 VPN 等于加密。它还管完整性、身份认证与密钥协商,四件事。
  2. 以为加密不影响带宽。小包场景膨胀一倍以上。
  3. 以为 MTU 用默认 1500 就行。封装后超了会分片,性能大跌。
自测三问(点开对答案) 1. 隧道模式与传输模式最本质的区别是什么? —— 隧道模式把整个原包(含原 IP 头)加密后再套一个新头,传输模式保留原头只加密载荷。 2. 为什么 ESP 在 NAT 后面要做 UDP 封装? —— 因为 ESP 是 IP 协议号 50,没有端口,NAT 无法按端口做转换。 3. 为什么隧道接口的 MTU 通常设成 1400? —— 给 IPsec 封装留出空间,避免封装后超过链路 MTU 而触发分片。

下一节:DoS 防御——当攻击的目标不是「进去」而是「让你服务不了」。

相关笔记