IPSec NAT-T穿越技术安全
在NAT技术和IPsec技术的应用都很是普遍。但从本质上来讲,二者是存在着矛盾的。网络
1.从IPsec的角度上说,IPsec要保证数据的安全,所以它会加密和校验数据。tcp
2.从NAT的观点来看,为了完成地址转换,势必会修改IP地址。ide
IPSec提供了端到端的IP通讯的安全性,但在NAT环境下对IPSec的支持有限,AH协议是确定不能进行NAT的了,这和AH设计的理念是相违背的;ESP协议在NAT环境下最多只能有一个×××主机能创建×××通道,没法实现多台机器同时在NAT环境下进行ESP通讯(缘由以下图:)加密
关于IPSec在NAT环境下的需求问题在RFC3715中进行了描述。url
NAT穿越(NATTraversal,NAT-T)就是为解决这个问题而提出的,RFC3947,3948中定义,在RFC4306中也加入了NAT-T的说明,但并没废除RFC3947,3948,只是不区分阶段1和阶段2。该方法将ESP协议包封装到UDP包中(在原ESP协议的IP包头外添加新的IP头和UDP头,也被称为NAT-T头部)spa
使之能够在NAT环境下使用的一种方法,这样在NAT的内部网中能够有多个IPSec主机创建×××通道进行通讯(缘由是以下图,由于有了UDP报文的封装ESP加密的报文后,PAT模式下使用UDP端口号能够区分不一样的ESP PAYLOAD:)。设计
AH封装:AH封装的校验从IP头开始,若是NAT将IP的头部改动,AH的校验就会失败,所以咱们得出结论,AH是没法与NAT共存的。ip
ESP封装的传输模式:对于NAT来讲,ESP封装比AH的优点在于,不管是加密仍是完整性的校验,IP头部都没有被包括进去。以下图:ci
可是仍是有新的问题,对于ESP的传输模式,NAT 没法更新上层校验和。由于TCP 和 UDP 报头包含一个校验和,它整合了源和目标 IP 地址和端口号的值,而源和目的IP地址和端口号在作NAT时会发生改变。
当 NAT 改变了某个包的 IP 地址和(或)端口号时,它一般要更新 TCP 或 UDP 校验和。当 TCP 或 UDP 校验和使用了 ESP 来加密时,它就没法更新这个校验和。因为地址或端口已经被 NAT 更改,目的地的校验和检验就会失败。虽然 UDP 校验和是可选的,可是 TCP 校验和倒是必需的。因此ESP的传输模式也不支持NAT穿越。
ESP封装的隧道模式:从ESP隧道模式的封装中,咱们能够发现,ESP隧道模式将整个原始的IP包整个进行了加密,且在ESP的头部外面新加了一层IP头部,因此NAT若是只改变最前面的新的IP地址对后面受到保护的部分是不会有影响的。所以,IPsec只有采用ESP的隧道模式来封装数据时才能与NAT共存。
AH模式的IPSec ×××由于完整性校验牵涉到IP头部,因此NAT没法对其修改,不兼容。
ESP的传输模式,由于TCP部分被加密,NAT没法对TCP校验和进行修改,不兼容。
ESP的隧道模式,因为NAT改动外部的IP而不能改动被加密的原始IP,使得只有这种状况下才能与NAT共存。
NAT穿越(NAT Traversal,NAT-T)
Cisco IOS的版本在12.2(13)T之后,能够支持NAT-T技术。之前NAT和IPsec只能以1对1的形式共存(非PAT的状况),NAT-T打破了这种形式(由于使用了NAT-T包头作的UDP端口区分)。并且NAT-T支持ESP的传输模式。NAT-T的基本思想:将ESP协议包封装到UDP包中(在原ESP协议的IP包头外添加新的IP头和UDP头)。使得NAT对待它就像对待一个普通的UDP包同样。并且支持ESP的传输模式。NAT-T的基本原理和执行步骤
1. 检测通讯中是否存在NAT设备和对方是否支持NAT-T
2.检测对方是否支持NAT-T是经过交换vendor ID载荷来实现的,若是自身支持NAT-T,在IKE开始交互就要发送这种载荷,载荷内容是“RFC 3947”的MD5值,也就是十六进制的“4a131c81070358455c5728f20e95452f”
上面的NAT-D数据就是源IP和源端口(或者目的IP和目的端口)的组合分别计算的hash值,用于验证peer之间是否存在NAT设备,可是没法区分是PAT仍是一对一的NAT。
若是有NAT存在且双方都支持NAT-T,则:
上面IKE的1-2个包相互发送VID来声明本身是否支持NAT-T,IKE的3-4个包(MM主模式)或者2-3个包(AM主动模式)发送由源IP和源端口号,以及目的IP和目的端口组合分别计算的NAT-D负载。
若是双方判断后确实须要NAT-T技术,则在IKE的5-6个包开始后面全部ISKAMP包,以及全部的ESP包,都被封装到中目的UDP为4500的包中。
断定CISCO路由器是否启用NAT-T技术,能够经过show crypto ipsec sa:
查看in use setting是否为Tunnel(未启用NAT-T)
若是CISCO路由器启用了NAT-T技术,则显示以下(Tunnel UDP-Encaps):
断定cisco ASA防火墙是否启用了NAT-T技术,也能够经过show crypto ipsec sa:查看in use setting是否为L2L tunnel(未启用NAT-T)
若是CISCO ASA防火墙启用了NAT-T技术,则显示以下:L2L tunnel NAT-T-Encaps:
NAT-T的两端peer之间的设备(如ASA设备)的connection会显示以下:UDP 500和UDP 4500两个会话(源目端口号同样),其中UDP 500是IKE的1-4的4个包,从IKE的5个包开始,一直到ESP封装的数据包均封装在UDP4500中。
拓扑图以下(SITE1和SITE2之间创建了L2L ×××,Internet模拟被穿越的中间NAT网络):
ASA/IOS NAT-T技术对比表(IOS只支持公有的NAT-T技术)
配置方法
1.ipsec over tcp
该方法致使双方使用TCP端口通讯,缺省端口是10000,只支持client方式(远程拨号×××),该技术牛B的地方是整个工做过程的ISAMP和ESP包均封装在TCP的某个任意端口号内,包括isakmp的前1-4个UDP 500的包也被封装在TCP中,网络的穿越效果最好。缺省被禁用,打开方法:
crypto isakmp ipsec-over-tcp
以下实例,能够同时在ASA端设置多个端口号:
client端的设置方式以下:
当实际环境中不常规×××通讯或NAT-T,IPSEC OVER UDP的时候使用。
2.NAT-T
该方法致使双方最终使用udp 4500端口通讯,支持client(远程拨号×××),L2L 两种方式。缺省是被禁用的。NAT-T的打开方法:
crypto isakmp nat-traversal 20 ,缺省keepalives时间20秒,该isakmp的NAT keeplive包的发送是为了不在通过的PAT时候,在NAT会话表(xlate)超时(PAT类型的NAT会话表超时时间很短但大于20s)以前维持住该NAT会话表。
3.ipsec over udp
致使双方使用UDP通讯,缺省端口10000,只支持client方式(远程拨号×××)。缺省被禁用,该技术的前4个包依然是UDP 500的封装,5-6个包开始包含ESP包均封装在任意的UDP端口中(默认是UDP 1000)。
打开方法:
在组策略中配置
hostname(config-group-policy)#ipsec-udp {enable | disable}
hostname(config-group-policy)#ipsec-udp-port10000 //端口号能够任意配置
以下实例:
client端貌似很差设置UDP的12345端口,只要ASA服务端设置UDP 12345端口就能够。
上述三种方法都启用时候的优先级别: over tcp>NAT-T>over udp