网络层安全
为啥要有网络层安全IPSec
TLS 很强,但它不是万能的
TLS 主要保护的是传输层以上的数据,比如 HTTP 内容。
但它通常不隐藏 IP 地址,所以别人还是能知道:
你在和哪个服务器通信
通信双方是谁
一些流量模式信息
而 IPSec 是在网络层干活,所以它更"底层",覆盖范围更大。
网络层机密性
发送方对 IP datagram 的 payload 加密;这个 payload 里可以是 TCP、UDP、ICMP 等;实现位置在传输层下面,所以对更高层透明;因此它能对"所有上层数据"提供一种 blanket coverage
不管上面跑的是网页、邮件、P2P、还是 TCP SYN,到了 IP 层,统统都能一起保护。
这就是它和 TLS 的最大思维差别:
- TLS:保护某个应用连接
- IPSec:保护一整类 IP 通信
VPN
VPN 的动机是:机构想要私有网络,但专线、路由器、链路、DNS 基础设施都很贵,于是把办公点之间的流量放到公共互联网传,但在进入公网前先加密,使其逻辑上和其他流量隔离。
VPN本质是在公网传输,但让数据看起来像走自己家的私网通道。
IPSec 提供哪些安全服务?
- 机密性:别人看不懂内容
- 完整性:别人改了你能发现
- 源认证:确认数据确实来自预期对端
- 抗重放:旧包不能反复拿来骗你
两种模式:
- Transport Mode
- 保护 IP payload
- 原始 IP header 不加密
- Tunnel Mode
- 整个原始 IP 包都被封装
- 外面再加一个新的 IP header
Transport mode
只保护负载,不保护原 IP 头。
原包大概是:[原IP头][TCP/UDP头+数据]
用了 transport mode 后,大概变成:[原IP头][IPSec头][被保护的TCP/UDP头+数据]
别人仍然能看到源 IP和目的 IP,但看不到里面的传输层数据内容。
Tunnel mode
把整个原始 IP 包塞进一个新包里。
原包:
[原IP头][原payload]
隧道模式后:
[新IP头][IPSec头][原IP头][原payload][一些尾巴]
这样公网只看到:
- 外层新 IP 头
- 看不到里面真正通信双方的原始 IP 头
两种格式 AH 和 ESP
- ESP 支持 confidentiality、integrity、source authentication
- AH 支持 integrity、source authentication
AH : Authentication Header
它干的主要是:
- 验证完整性
- 验证来源
但 不负责加密内容。
所以它不能提供机密性。
ESP : Encapsulating Security Payload
它是现在更主流的那个,因为它能:
- 加密
- 做完整性保护
- 做来源认证
AH 提供完整性、源认证。ESP 还额外提供加密

Transport Mode(上半部分)
数据从上往下走,到IPSec层时,ESP直接插在原始IP头后面:
orig IP hdr | ESP hdr | TCP hdr | Data | ESP trlr | ESP auth
关键点:IP头不动,ESP只加密/保护IP头后面的payload(TCP头+数据)。蓝色箭头标的就是被ESP加密的范围。
适用场景:两台主机之间直接通信,比如你的电脑直连服务器。
Tunnel Mode(下半部分)
ESP把整个原始IP包 (包括orig IP hdr)都包进去加密,然后外面再套一个全新的IP头:
new IP hdr | ESP hdr | orig IP hdr | TCP hdr | Data | ESP trlr | ESP auth
关键点:原始IP头也被加密了,外面的new IP hdr是网关的地址。蓝色箭头范围更大,连原始IP头都在加密区内。
SA : Security Associatio
SA 不是"协议本身"
它更像是:
一条已经谈好的安全规则记录。
比如"从 R1 发到 R2 的流量,应该用 AES 加密、用某个 HMAC 算法校验、用哪个 key、SPI 是多少......"
为什么 SA 是单向的?
这点很多人第一次都会懵。
A → B 是一条 SA B → A 还得再来一条 SA
因为:
- 序列号各管各的
- 密钥也可能不同
- 参数也可能不同
所以双向通信通常至少要两条 SA。
SAD : Security Association Database
它就是:
存 SA 的数据库。
发送时:发送端去 SAD 里查:这个包该怎么处理?
接收时:
- 接收端看包里的 SPI
- 用 SPI 去索引 SAD
- 找到对应 SA
- 按这条 SA 的规则解密/验完整性/验认证
Tunnel + ESP 的包

ESP header
有两个关键字段:
- SPI:告诉接收方该去 SAD 里找哪条 SA
- Sequence number:防重放攻击
ESP trailer
- padding:给分组密码对齐用
- next header:告诉里面原始上层是什么,比如原来是 IP / TCP / UDP 之类
ESP auth
这是认证值,课件说 MAC 用共享密钥创建,典型就是 HMAC。
发送端怎么把普通包变成 IPSec 包?
- 在原 datagram 后面加 ESP trailer
- 按 SA 指定算法和 key 对结果加密
- 在前面再加 ESP header
- 对整个 enchilada 计算认证 MAC
- 把 MAC 加到后面
- 最外面再加一个全新的 IP header
SPD : Security Policy Database
这个不是"怎么做",而是"要不要做"。
- SPD :决定 what to do
- SAD :决定 how to do it