IPsec 和 NAT 的冲突问题详解

背景

IPsec 协议可以用来在 IP 层提供校验和加密等安全特性。基于 IPsec 的 VPN 已经成为 site-site 模式下高可靠连通方案的首选。

NAT 最初是为了解决地址不足的问题,它将 NAT 网关后的实际地址隐藏起来,对外呈现一个外部地址,通常包括基于地址的映射(设备负责将内外地址进行对应和替换)和基于端口(通常外部为同一地址,根据到达端口的不同替换为内部不同的地址和端口)的映射。

两者都是常见的网络技术,然而当 IPsec 处理位于 NAT 处理后工作的时候往往会产生冲突。

IPsec

首选,IPsec 支持两种模式:传输和隧道。传输模式只对 IP 包负载应用IPsec协议,对 IP 包头不进行任何修改,因此只能应用于主机对主机的 IPsec VPN 中。隧道模式中 IPsec 将原有的整个 IP 网包封装成带有新的 IP 头部的网包,这样就隐藏了真实的网包信息。隧道主要应用于主机到网关的远程接入的情况。

IPsec 协议支持两种头部:Authentication Header(AH) 和 Encapsulation Security Payload。前者只可以进行认证,后者则即可以加密也可以认证。

传输模式

下图展示了传输模式下原始网包和封装后网包的格式。

隧道模式 下图展示了隧道模式下原始网包和封装后网包的格式。

冲突总结

  • 首先,由于 NAT 往往需要修改包头中的地址(出去的时候修改源地址、进来的时候修改目的地址),这就让 AH 的认证失败了。因为 AH 头验证的是头部+负载的整个网包。但是 ESP 头则不受影响,因为它不检查 IP 包头信息。
  • 校验和。IP 校验和只校验 20 字节的 IP 头;而 ICMP 校验和覆盖整个报文(ICMP 报头 + ICMP 数据);UDP、TCP校验包括整个报文,而且还有 12 字节的 IP 伪首部,包括源 IP 地址(4字节)、目的 IP 地址(4字节)、协议(2字节,第一字节补0)和 TCP/UDP 包长(2字节)。那么,在传输模式下,ESP 加密和验证的 TCP/UDP 头信息,跟外面的 IP 包头信息就对不上了。原始网包中目标地址是对方的外部地址,而收到的网包目标地址则是内部地址了。
  • IKE 架构中的地址往往不允许修改,端口也是固定的,这跟 NAT 冲突。
  • 同一个 NAT 后的设备在外面看起来往往是来自同一个外部地址,而后面可能有多个 VPN 用户,这将导致协商阶段的冲突。
  • 应用层网关,因为负载被加密了,自然无法解析和修改,导致失败。
  • NAT 超时后,导致 VPN 连接失败。
  • 其它,包括对分片包的处理等。

解决思路

首先 AH 头因为是对整个网包的认证,所以是无法跟 NAT 共存的。而 ESP 头只保护 IP 包头以外的内容,因此是可能跟 NAT 设备共存的。

目前,为了解决这一问题,提出了 NAT-T 方案。在 ESP 外面除了新的 IP 包头,再添加一个 UDP 头,这样,外面的 NAT 设备操作的是新的 IP 头和 UDP 头,而跟内部信息无关。

NAT-T 在实际操作中,需要中间 NAT 设备的探测。

参考

  • RFC 3715
  • NAT-T
转载请注明:http://blog.csdn.net/yeasy/article/details/44624095

你可能感兴趣的:(Tech,Network,网络,安全,vpn)