飞翔飞翔
主页
  • 计算机基础

    • TCP/IP协议
    • Linux命令
  • 数据库

    • SQL教程
  • 编程语言

    • C语言
    • Python2
    • Python3
  • 数据格式

    • JSON教程
  • 工具

    • Markdown指南
  • Git

    • GitFlow
  • Quartz

    • Quartz教程
  • Java

    • Java设计模式
  • 缓存

    • Redis教程
联系
阿里云
主页
  • 计算机基础

    • TCP/IP协议
    • Linux命令
  • 数据库

    • SQL教程
  • 编程语言

    • C语言
    • Python2
    • Python3
  • 数据格式

    • JSON教程
  • 工具

    • Markdown指南
  • Git

    • GitFlow
  • Quartz

    • Quartz教程
  • Java

    • Java设计模式
  • 缓存

    • Redis教程
联系
阿里云
  • 学习路径
  • IP协议

    • 认识 IP 协议与网络层定位
    • IPv4 编址体系与分类地址
    • CIDR 与子网划分实战
    • IPv6 编址体系
    • ARP 协议详解
    • NDP 协议详解
    • IGMP 与 MLD 组播侦听发现
    • VRRP 与网关冗余
    • IPv4 数据报首部解析
    • IPv6 数据报与扩展首部
    • IPsec 安全扩展
    • 分片、MTU 与路径发现
    • ICMP 与 Traceroute 原理
    • 路由基础与转发流水线
    • 动态路由协议
    • NAT 网络地址转换
    • DHCP 与自动配置
    • Wireshark 与命令行工具
    • IPv6 过渡技术
    • IP 协议栈排障与攻击防御
  • TCP协议

    • 认识 TCP 协议与传输层定位
    • TCP 报文段首部解析
    • 三次握手与连接建立
    • 四次挥手与连接释放
    • TCP 有限状态机
    • 序列号与确认机制
    • 超时重传与 RTO 计算
    • 滑动窗口与流量控制
    • 拥塞控制基础
    • 现代拥塞控制算法
    • TCP 选项与扩展
    • TCP 性能调优与内核参数
    • Nagle 算法与糊涂窗口综合征
    • TCP 定时器与 Keep-Alive 机制
    • TCP 安全与攻击防御
    • TCP 与上层/下层交互
    • TCP 综合实践与排障

IPsec 安全扩展

为什么需要 IPsec

IP 协议设计之初没有考虑安全:

  • 源地址可以伪造(IP Spoofing)
  • 数据内容明文传输,任何人抓包都能看
  • 数据可能被篡改(中间人修改包内容)

IPsec(IP Security) 是网络层的安全框架,为 IP 通信提供认证、完整性校验、加密三种保护。它不依赖应用层,对上层透明——TCP、UDP、ICMP 等应用无需修改就能享受安全保护。

IPsec 的核心协议

IPsec 由三个核心协议组成:

协议RFC功能类比
AH4302认证 + 完整性校验封条(防拆,但不保密)
ESP4303加密 + 认证 + 完整性保险箱(防拆又保密)
IKEv27296密钥协商与管理保险箱密码的交换协议

AH(Authentication Header)

AH 提供:

  • 数据源认证:确认包确实来自声称的发送方
  • 完整性校验:确保传输过程中未被篡改
  • 防重放攻击:通过序列号机制

AH 不加密数据,所以抓包者仍能看到内容,只是无法伪造。

AH 在 IPv6 中作为扩展首部(Next Header=51)插入,在 IPv4 中作为协议号 51 的载荷。

ESP(Encapsulating Security Payload)

ESP 是 IPsec 的主力,提供:

  • 加密:用 AES、ChaCha20 等算法加密数据,抓包者看到的是乱码
  • 认证和完整性:同 AH
  • 可选的防重放

ESP 在 IPv6 中作为扩展首部(Next Header=50),在 IPv4 中作为协议号 50 的载荷。

为什么 ESP 可以替代 AH? 因为 ESP 已经包含了认证功能,现代部署几乎只用 ESP,AH 很少单独使用。

两种工作模式

传输模式(Transport Mode)

原始 IP 首部 + [ESP 首部 + 加密(TCP/UDP 数据) + ESP 尾部] + 原始 IP 首部(修改 Protocol=50)
  • 只加密/认证上层数据(Payload),IP 首部不变
  • 用于端到端通信(两台主机之间直接建立 IPsec)
  • 优点:开销小,原始 IP 地址可见(适合 QoS 路由)

生活例子:你给朋友的信套一个透明信封,信封上有防伪标记(AH)或把信纸折成密文(ESP),但外面的收件地址还是明文。

传输模式只保护上层数据,IP 首部不变,适合端到端主机通信;隧道模式加密整个原始 IP 包并套新首部,适合 VPN 网关之间保护整个网络。

隧道模式(Tunnel Mode)

新 IP 首部(隧道端点)+ [ESP 首部 + 加密(原始 IP 首部 + TCP/UDP 数据) + ESP 尾部]
  • 加密整个原始 IP 包,外面套一个新的 IP 首部
  • 用于 VPN(虚拟专用网):两个网关之间建立隧道,保护内部网络通信
  • 优点:隐藏原始 IP 地址,保护整个网络

生活例子:你把信装进一个铁盒,铁盒上写"寄给上海分公司",上海分公司收到后打开铁盒,取出里面的信(原始 IP 包)再转发给真正的收件人。

IKEv2 的两阶段设计分离了"密钥协商"和"身份认证":第一阶段用 Diffie-Hellman 建立临时加密通道,第二阶段在保护通道内完成身份认证和 IPsec 参数协商。即使第二阶段被截获,攻击者也无法解密第一阶段的内容。

IKEv2 密钥交换

IPsec 需要双方约定:

  • 用什么加密算法(AES-256?ChaCha20?)
  • 用什么认证算法(HMAC-SHA256?)
  • 密钥怎么生成
  • 密钥多久换一次

手动配置这些参数不现实,IKEv2(Internet Key Exchange v2) 自动完成:

IKEv2 两阶段

第一阶段(IKE_SA_INIT):

  • 双方交换支持的算法列表
  • 用 Diffie-Hellman 算法协商出共享密钥
  • 建立 IKE 安全关联(IKE SA)

第二阶段(IKE_AUTH):

  • 双方用证书或预共享密钥(PSK)认证身份
  • 协商 IPsec 参数(加密算法、SPI、序列号窗口)
  • 建立 Child SA(即 IPsec SA)

SA(Security Association,安全关联)

SA 是 IPsec 的核心数据结构,定义了"如何保护通信"。每个方向一个 SA:

SPI(Security Parameter Index,32 位):SA 的唯一标识
目的 IP 地址
安全协议(AH 或 ESP)
加密算法 + 密钥
认证算法 + 密钥
序列号计数器
生存时间

SPI 的作用:接收方收到 ESP 包后,看 SPI 值就能找到对应的 SA,知道用哪个密钥解密。

IPsec 在 IPv6 中的位置

IPv6 强制要求支持 IPsec(虽然实际不一定启用)。AH 和 ESP 作为扩展首部插入链中:

[IPv6 首部, Next=50] → [ESP 首部] → [加密的数据] → [ESP 尾部]

Wireshark 中可以看到:

  • Next Header: 50 (ESP)
  • SPI: 0x12345678
  • Sequence Number: 1234

如果 Wireshark 配置了密钥,还能解密查看内部内容。

NAT 与 IPsec 的冲突

ESP 加密了 TCP/UDP 的端口号,NAT 设备无法修改端口号做端口映射。AH 认证了整个 IP 首部(包括 IP 地址),NAT 修改地址后认证失败。

解决方案:

  • NAT-T(NAT Traversal):检测到有 NAT 时,用 UDP 4500 端口封装 ESP 包
  • ESP 不认证外层 IP:隧道模式下外层 IP 是 NAT 后的公网地址,内层 IP 不变

本篇小结

  • IPsec 提供网络层安全:认证、完整性、加密
  • AH(51)只认证不加密;ESP(50)加密+认证,现代主流
  • 传输模式保护端到端;隧道模式保护整个网络(VPN)
  • IKEv2 自动协商算法和密钥,建立 SA
  • SPI 标识 SA,接收方据此选择解密密钥
  • NAT 与 IPsec 冲突,用 NAT-T(UDP 4500)解决

动手实践

  1. Wireshark 抓取 VPN 流量,过滤 esp 或 udp.port == 4500,观察 SPI 和 Sequence Number

  2. 在 Linux 上配置 IPsec(StrongSwan),建立主机到主机的传输模式隧道:

    # 安装 strongswan
    sudo apt install strongswan
    # 配置 /etc/ipsec.conf
    
  3. 对比抓包:未加密 ping 和 IPsec 保护后的 ping,观察 ESP 包的内容是否为乱码

  4. 思考:为什么 AH 在现代网络中很少使用?如果 ESP 已经提供认证,AH 还有什么独立价值?

上一页
IPv6 数据报与扩展首部
下一页
分片、MTU 与路径发现