IPSec是基于网络层的,不能穿越通常的NAT、防火墙,这篇文章就是要讨论,在需要NAT网络的环境中,如果使用IPsec ××× 隧道技术。
IPsec 协议有两种运行模式:
IPSec隧道模式
IPSec传输模式
隧道模式通常是建立在双方的网关之间的。传输模式下,IPSec主要对上层的传输进行封装保护,通常情况下,传输模式只用于两台主机之间的通信。
因为我们讨论的是NAT环境下的×××传输,所以我们就只是关注隧道模式下IPSec是如何动作的。
不过我们先来看一看两种模式的区别,下面给出包头的结构,就一目了然。
一、封装AH认证头的两种方式的不同
1、传输模式:
AH协议(IP协议号为51)提供数据源认证、数据完整性校验和防报文重放功能,它能保护通信免受篡改,但不能防止窃听,适合用于传输非机密数据。AH的工作原理是在每一个数据包上添加一个身份验证报文头,此报文头插在标准IP包头后面,对数据提供完整性保护。可选择的认证算法有MD5(Message Digest)、SHA-1(Secure Hash Algorithm)等。MD5算法的计算速度比SHA-1算法快,而SHA-1算法的安全强度比MD5算法高。
设计AH认证协议的目的是用来增加IP数据报的安全性。AH协议提供无连接的完整性、数据源认证和抗重放保护服务,但是AH不提供任何保密性服务。IPSec验证报头AH是个用于提供IP数据报完整性、身份认证和可选的抗重传***的机制,但是不提供数据机密性保护。验证报头的认证算法有两种:一种是基于对称加密算法(如DES),另一种是基于单向哈希算法(如MD5或SHA-1)。 传输模式只对上层协议数据(传输层数据)和IP头中的固定字段提供认证保护,把AH插在IP报头的后面,主要适合于主机实现。
2、隧道模式:
隧道模式把需要保护的IP包封装在新的IP包中,作为新报文的载荷, 然后把AH插在新的IP报头的后面。隧道模式对整个IP数据报提供认证保护。
二、ESP认证加密方法
传输模式:
隧道模式:
ESP(Encapsulate Security Payload,封装安全载荷)协议:封装安全载荷(ESP)用于提高Internet协议(IP)协议的安全性。它可为IP提供机密性、数据源验证、抗重放以及数据完整性等安全服务。ESP属于IPSec的机密性服务。其中,数据机密性是ESP的基本功能,而数据源身份认证、数据完整性检验以及抗重传保护都是可选的。ESP主要支持IP数据包的机密性,它将需要保护的用户数据进行加密后再重新封装到新的IP数据包中。
上面看过了AH和ESP认证头的结构,与两种模式下的不同。下面讨论的是,为什么在NAT环境中,ipsec *** 不能使用AH认证方法?
IPSec协议的主要目标是保护IP数据包的完整性,这意味着IPSec会禁止任何对数据包的修改。但是NAT处理过程是需要修改IP数据包的IP包头、端口号才能正常工作的。所以,如果从我们的网关出去的数据包经过了ipsec的处理,当这些数据包经过NAT设备时,包内容被NAT设备所改动,修改后的数据包到达目的地主机后其解密或完整性认证处理就会失败,于是这个数据包被认为是非法数据而丢弃。无论传输模式还是隧道模式,AH都会认证整个包头,不同于ESP 的是,AH 还会认证位于AH头前的新IP头,当NAT修改了IP 头之后,IPSec就会认为这是对数以完整性的破坏,从而丢弃数据包。因此,AH是约 可能与NAT一起工作的。
意思就是说,AH处理数据时,所使用的数据是整个数据包,甚至是IP包头的IP地址,也是处理数据的一部分,对这些数据作整合,计算出一个值,这个值是唯一的,即只有相同的数据,才可能计算出相同的值。当NAT设备修改了IP地址时,就不符合这个值了。这时,这个数据包就被破坏了。
而ESP并不保护IP包头,ESP保护的内容是ESP字段到ESP跟踪字段之间的内容,因此,如何NAT只是转换IP的话,那就不会影响ESP的计算。但是如果是使用PAT的话,这个数据包仍然会受到破坏。
所以,在NAT网络中,只能使用IPSec的ESP认证加密方法,不能用AH。
但是也是有办法解决这个缺陷的,不能修改受ESP保护的TCP/UDP,那就再加一个UDP报头。
解决方案:NAT穿越
NAT-T的基本思路是IPSec封装好的数据包外再进行一次UDP数据封装。这样,当此数据包穿过NAT网关时,被修改的只是最外层的IP/udp数据报。
NAT-T的操作步骤:
一、判断双方是否支持NAT-T,这是IKE协商的第一阶段,双方通过发送一个VENDOR ID来识别是否支持NAT-T,等一下做实验会看到这个。
二、判断通信链路上是否存在NAT设备,这一步是NAT 发现,NAT发现的原理是判断通信方的IP地址和端口是否发生了改变,判断的方法是,使用IP地址和端口号进行HASH运算,送往对方进行校验。一旦发现NAT,则立即进行端口浮动,也就是在IKE协议的第二阶段将IKE的UDP 500浮动到UDP 4500端口。
三、进行ESP处理
做做实验吧,不然没意义。
首先我们先不做NAT,把IPSEC ×××做通。
- R0:
- crypto isakmp policy 10
- encr 3des
- authentication pre-share
- group 2
- crypto isakmp key 6 yeelone address 21.1.1.1 255.255.255.0
- !
- !
- crypto ipsec transform-set cisco esp-3des
- !
- crypto map cisco 10 ipsec-isakmp
- set peer 21.1.1.1
- set transform-set cisco
- match address 100
- interface Loopback0
- ip address 192.168.1.1 255.255.255.0
- !
- interface Serial0/0
- ip address 20.1.1.20 255.255.255.0
- serial restart-delay 0
- crypto map cisco
- router ospf 100
- network 20.1.1.20 0.0.0.0 area 0
- network 192.168.1.1 0.0.0.0 area 0
- !
- i
- access-list 100 permit ip 192.168.1.0 0.0.0.255 172.16.1.0 0.0.0.255
- R1:
- crypto isakmp policy 10
- encr 3des
- authentication pre-share
- group 2
- crypto isakmp key 6 yeelone address 20.1.1.20 255.255.255.0
- !
- !
- crypto ipsec transform-set cisco esp-3des
- !
- crypto map cisco 10 ipsec-isakmp
- set peer 20.1.1.20
- set transform-set cisco
- match address 100
- interface Loopback0
- ip address 172.16.1.1 255.255.255.0
- !
- interface Serial0/0
- ip address 21.1.1.1 255.255.255.0
- serial restart-delay 0
- crypto map cisco
- router ospf 100
- router-id 1.1.1.1
- log-adjacency-changes
- network 10.1.1.2 0.0.0.0 area 0
- network 12.1.1.1 0.0.0.0 area 0
- network 21.1.1.1 0.0.0.0 area 0
- network 172.16.1.1 0.0.0.0 area 0
- access-list 100 permit ip 172.16.1.0 0.0.0.255 192.168.1.0 0.0.0.255
- R2:
- router ospf 100
- router-id 2.2.2.2
- log-adjacency-changes
- network 12.1.1.2 0.0.0.0 area 0
- network 20.1.1.2 0.0.0.0 area 0
- network 21.1.1.2 0.0.0.0 area 0
这个就是UDP报头,端口号是500.
下面我们开始做NAT转换。
先帖上我的配置
- R1:R1的配置基本没有任何改变。
- crypto isakmp policy 10
- encr 3des
- authentication pre-share
- group 2
- crypto isakmp key 6 yeelone address 23.1.1.3 255.255.255.0
- !
- !
- crypto ipsec transform-set myset esp-3des esp-md5-hmac
- !
- crypto map cisco 10 ipsec-isakmp
- set peer 23.1.1.3
- set transform-set myset
- match address 100
- interface Loopback0
- ip address 192.168.1.1 255.255.255.0
- !
- interface Serial0/0
- ip address 12.1.1.1 255.255.255.0
- ip nat inside
- ip virtual-reassembly
- serial restart-delay 0
- crypto map cisco
- !
- interface Serial0/1
- no ip address
- ip nat outside
- ip virtual-reassembly
- shutdown
- serial restart-delay 0
- !
- router ospf 100
- log-adjacency-changes
- network 0.0.0.0 255.255.255.255 area 0
- access-list 100 permit ip 192.168.1.0 0.0.0.255 172.16.1.0 0.0.0.255
- R2:nat配置
- interface Serial0/0
- ip address 12.1.1.2 255.255.255.0
- ip nat inside
- ip virtual-reassembly
- serial restart-delay 0
- !
- interface Serial0/1
- ip address 23.1.1.2 255.255.255.0
- ip nat outside
- ip virtual-reassembly
- serial restart-delay 0
- !
- router ospf 100
- log-adjacency-changes
- network 0.0.0.0 255.255.255.255 area 0
- !
- ip http server
- no ip http secure-server
- !
- !
- ip nat inside source list 100 interface Serial0/1 overload
- ip nat inside source static udp 12.1.1.1 500 interface Serial0/1 500
- ip nat inside source static udp 12.1.1.1 4500 interface Serial0/1 4500
- ip nat inside source static esp 12.1.1.1 interface Serial0/1
- !
- 上面三条命令是建立***隧道的协商用的。这在nat穿越中是关键。
- access-list 100 permit ip 192.168.1.0 0.0.0.255 any
- R3:注意看R3的红色部分
- crypto isakmp policy 10
- encr 3des
- authentication pre-share
- group 2
- crypto isakmp key 6 yeelone address 23.1.1.2 255.255.255.0
- !
- !
- crypto ipsec transform-set myset esp-3des esp-md5-hmac
- !
- crypto map cisco 10 ipsec-isakmp
- set peer 23.1.1.2
- set transform-set myset
- match address 100
- !
- !
- !
- !
- interface Loopback0
- ip address 172.16.1.1 255.255.255.0
- !
- interface Serial0/0
- ip address 23.1.1.3 255.255.255.0
- serial restart-delay 0
- crypto map cisco
- !
- router ospf 100
- log-adjacency-changes
- network 0.0.0.0 255.255.255.255 area 0
- !
- ip http server
- no ip http secure-server
- !
- !
- !
- access-list 100 permit ip 172.16.1.0 0.0.0.255 192.168.1.0 0.0.0.255
刚开始我没有注意到要将R3的peer对象改为23.1.1.2 ,害得我的实验失败了好几十次,一次一次的做,有时候做实验做到凌晨4点,仍然没做成,就是因为配错了peer。
我们要注意的是,配置的peer是nat转换后的地址,不能再使用内网地址。
再回顾一下:
NAT-T的操作步骤:
一、判断双方是否支持NAT-T,这是IKE协商的第一阶段,双方通过发送一个VENDOR ID来识别是否支持NAT-T,等一下做实验会看到这个。
二、判断通信链路上是否存在NAT设备,这一步是NAT 发现,NAT发现的原理是判断通信方的IP地址和端口是否发生了改变,判断的方法是,使用IP地址和端口号进行HASH运算,送往对方进行校验。一旦发现NAT,则立即进行端口浮动,也就是在IKE协议的第二阶段将IKE的UDP 500浮动到UDP 4500端口。
三、进行ESP处理
看一下抓包:
一、判断双方是否支持NAT-T,这是IKE协商的第一阶段,双方通过发送一个VENDOR ID来识别是否支持NAT-T:::
上面第一个12.1.1.1就是第一步:
vendor id如上图所示。
第二步:nat 发现
然后下 一个包马上进行端口浮动,表明存在nat设备。
端口已经浮动到4500.
这样子, ipsec *** nat穿越的实验就已经完成了。
转载于:https://blog.51cto.com/yeelone/449403