IPsec 在网络层加密,所以上层应用完全不知道它在。 代价是封装会把你辛苦争来的 MTU 吃掉,弄不好就是「网页能开、大文件下不完」。
上一节讲的是「谁在说话」。这一节讲「怎么把两个网连成一条加密隧道」。 Demo 把一个 1500 字节的满包塞进两种模式,算清楚它到底会膨胀多少。
一、AH 和 ESP,两个协议号
IPsec 不是单个协议,是一套,其中真正干活的只有两个头:
| 协议 | 协议号 | 做什么 | 今天还用吗 |
|---|---|---|---|
| AH | 51 | 只认证,不加密 | 基本不用了 |
| ESP | 50 | 加密,也认证 | 主力 |
第一行的设计初衷是「我只要防篡改,不想承担加密开销」, 听着合理,但它有一个致命问题:它连 IP 头一起认证。 而 NAT 会改 IP 头(改地址、改端口),一改,认证就失败。 所以 AH 和 NAT 天生不兼容,这也是它被淘汰的直接原因。 ESP 只认证「ESP 之后的部分」,外面的 IP 头随便 NAT 怎么改都不影响, 所以它能穿过 NAT——工程上能活下来的方案,往往不是最强的那个,是最不挑环境的那个。
二、两种模式,一个藏地址
传输模式和隧道模式的差别只有一句话:原来的 IP 头是保留,还是被当成货物装进去。
| 模式 | 结构 | 典型场景 | 好处 |
|---|---|---|---|
| 传输模式 | 原 IP 头 + ESP | 主机到主机 | 开销小 |
| 隧道模式 | 新 IP 头 + ESP(里面是整个原包) | 网关到网关 | 藏住内网地址 |
第二行就是 VPN 的本质:网关把整个原始包当成货物封起来,再套一层新 IP 头, 于是内网地址在外网完全看不见。 这才是「虚拟专用网」里「虚拟」两个字的来历—— 它不是真的拉了一根专线,而是让公网上的两台网关「表现得像」直连。 所以判断一个方案是不是 VPN,看一个特征就够了:它有没有把原始包整个装进去。 只加密载荷、不动 IP 头的那叫「加密传输」,不叫隧道。
三、IKE 与那五十个字节的代价
两台网关要先商量用哪把钥匙、哪种算法,这件事由 IKE 负责, 它跑在 UDP 500 上(穿过 NAT 时用 4500)。 IKE 分两个阶段:第一阶段建立一条管理通道,第二阶段用这条通道去谈具体的加密参数。 分两阶段的好处是「谈很多次,只建一次通道」。 然后是代价。 ESP 的结构里带着初始向量和完整性校验值,填充又要补齐到 16 的倍数, 所以一个满载的 1500 字节包根本装不下。 不调 MTU 会怎样:包被封好之后超了链路 MTU,只能分片,而分片一旦丢一片,整个包要重传。 表现就是「网页能开(小包),但大文件死活下不完」,这个现象有专门的名字,叫 MTU 黑洞。 排查手法很简单:用 ping 加「不分片」标记,从 1500 往下试,试到能通的那个长度就是真实 MTU。 这也是为什么隧道口普遍设成 1400——留出五十到七十字节的余量,再留一点安全边界。
四、动手 Demo:IPsec 的封装开销,会把你辛苦争来的 MTU 吃掉
一个 1500 字节的满包,分别按传输模式和隧道模式封装,算清楚每一部分占多少, 以及还能不能装进 1500 的 MTU。
ip_h, esp_h, iv, icv = 20, 8, 16, 16
payload = 1500 - ip_h
pad = (16 - payload % 16) % 16 # 补齐到 16 的倍数
esp = esp_h + iv + payload + pad + 1 + 1 + icv
transport = ip_h + esp
tunnel = transport + ip_h # 外面再套一层新 IP 头
print(transport, transport - 1500)
print(tunnel, tunnel - 1500)
实跑输出:
--------------------------------------------------------------------
IPsec 的封装开销,会把你辛苦争来的 MTU 吃掉
--------------------------------------------------------------------
**IPsec 有两种模式,差别只在「原来的 IP 头怎么处理」。**
**下面把一个 1500 字节的满包分别塞进两种模式,算一遍真实长度。**
组成 字节 是什么 要不要
--------------------------------------------------------------------------------
**原始包** **1500** — —
**ESP 头** **8** **SPI 加序号** **两种模式都要**
**初始向量** **16** **AES-CBC 需要** **两种模式都要**
**填充** **8** **补齐到 16 的倍数** **两种模式都要**
**填充长度与下一头** **2** **两个 1 字节** **两种模式都要**
**完整性校验** **16** **ESP 认证** **两种模式都要**
**先说结论**:
模式 封装后长度 多出来的 1500 MTU 下
---------------------------------------------------------
**传输模式** **1550** **50** **超了**
**隧道模式** **1570** **70** **超了**
**两行都超了 1500,而且隧道模式超得更多。**
**为什么多出这么多**:**ESP 的结构本来就带初始向量和校验值,填充又要补齐到 16 的倍数**,
**一个满载的 1500 字节包根本没有余量。**
**所以真实部署里必须把 MTU 调小,常见做法是把隧道口设成 1400。**
**不调会怎样**:**包在 IPsec 网关上被封好之后超了 MTU,只能分片**,
**而分片一旦丢一片,整个包重传**,**表现就是「网页能开,但大文件死活下不完」。**
**这个现象有个专门的名字,叫 MTU 黑洞**,**排查它的标准手法就是 ping 加「不分片」标记试长度。**
**最后分清两种模式用在哪**:
模式 原 IP 头 典型场景 好处
------------------------------------------------------------------------------------
**传输模式** **原 IP 头保留** **端到端,主机之间** **开销小一点**
**隧道模式** **原包整个装进去** **网关到网关** **能藏住内网地址**
**第二行第三列是 VPN 的本质**:**隧道模式把整个原始包当成货物,再套一层新 IP 头**,
**于是内网地址在外网完全看不见**——**这才是「虚拟专用网」里「虚拟」两个字的来历。**
两行都超了 1500,而且隧道模式超得更多。 多出来的五十到七十字节,就是 VPN 的过路费。 为什么这么多: ESP 头 8 字节、初始向量 16 字节、填充 8 字节、填充长度和下一头各 1 字节、校验值 16 字节, 加起来 50;隧道模式再叠一个新 IP 头,就是 70。 注意「填充」那一项是 8 而不是 0:1480 除以 16 余 8,所以要补 8 个字节才能凑成整块。 这个数字每次都可能不同,所以真实设备不会去「算准」,而是直接把 MTU 调小留余量。 最后那张模式对比表是这一节的落点: 传输模式保留原 IP 头,端到端用,开销小;隧道模式把整个包装进去,网关到网关用,能藏地址。 VPN 选的是后者,因为它要解决的正是「内网地址不能暴露在公网上」这件事。
30 秒实验
- 算一下:MTU 设成 1400,最多能容纳多少个原始包的长度?(1400 减 70,也就是 1330 的原始包)
- 想一下:为什么 AH 和 NAT 天生不兼容?
- 想一下:怎么用 ping 判断链路的真实 MTU?
常见误区
- 以为「IPsec 就等于 VPN」。 IPsec 是一套协议,VPN 是它的一种用法,隧道模式才等于 VPN。
- 以为「加密之后包还是那个大小」。 ESP 会加上五十到七十字节,满载的包必然超 MTU。
- 以为「分片了也没关系」。 分片丢一片就整包重传,表现是大文件下不完。
自测三问(点开对答案)
1. AH 和 ESP 的关键差别? —— **AH 只认证不加密,ESP 两头都做**;而且 AH 连 IP 头一起认证,过不了 NAT。 2. 隧道模式为什么能藏住内网地址? —— **整个原始包被当成载荷装进去**,外面只剩两个网关的公网地址。 3. 什么是 MTU 黑洞? —— **小包能过、大包被封完超限只能分片**,丢片就重传,表现为大文件下不动。下一节看最常见的那个:你每打开一个网页,都在用它。
- ☐ (本节完,下一节 9.4.2 TLS/SSL与HTTPS)