VPN简介

产生背景

随着时代的发展和企业规模的壮大,企业网络也在不断的发生着变化,比如一家总部在北京的企业,可能会在上海、广州等地都有分支机构,因此需要把各个分支机构连接在一起,以便共享资源、协同工作,提高工作效率。但在广域网上传输数据有被窃听、被篡改以及被冒充的风险,专线或VPN技术可以解决这些问题。传统的专线联网方式价格昂贵,一般中小企业难以负担,这时低成本的VPN技术就孕育而生了。VPN全称是Virtual Private Network,也就是虚拟专用网络,它可以利用廉价接入的公共网络(主要使用Internet)来传输私有数据,相对于传统的专线连接方式具有成本优势,因此被很多企业和电信运营商所采用。VPN技术建立‘保护’网络实体之间的通信,使用加密技术防止数据被窃听,使用数据完整性验证防止数据被破坏、篡改,使用认证机制确认身份,防止数据被截获、回放。

连接方式

根据网络接入方式的不同,VPN技术主要分为站点到站点(Site to Site)和远程访问(Remote Access)。

Site to Site

img

站点到站点的连接技术是一种主要的VPN连接方式,主要用于公司重要站点之间的连接,两个站点采用VPN技术虚拟的连接在一起,使得它们在通信时就想通过普通网线一样,可以访问到对方。Site to Site对于终端用户来说是透明的,即用户感觉不到VPN技术的存在,而是觉得互相访问的站点位于同一个内网。

Site to Site主要有以下几种:

  • GRE。Generic Routing Encapsulation,通用数据封装,能够对各种网络层协议(例如IP和IPX)的数据进行封装,被封装的数据报文能够在IP网络中传输。GRE采用了Tunnel技术,是VPN的三层隧道协议。

  • IPSec VPN。是业界标准的网络安全协议,可以为IP网络通信提供透明的安全服务,保护TCP/IP通信免遭窃听和篡改,从而有效的抵御网络攻击。IPSec VPN在网络的灵活性、安全性、经济型、扩展性等方面极具优势,因此越来越受到企业客户的青睐。

  • MPLS VPN。使用MPLS技术在宽带IP的骨干网络上搭建企业IP专网,以实现跨地域、安全、高速、可靠的数据、语音、图像等多业务通信。MPLS VPN结合区分服务、流量工程(QOS)等相关技术,将公共网络可靠的性能,良好的扩展性,丰富的功能与专用网络的安全、灵活、搞笑地结合在了一起,可以为用户提供高质量的服务。

Remote Access

img

Site to Site的VPN技术只能满足公司站点之间的连接,也就是说客户必须要在公司内部才能使用这种技术来连接其他站点。如果客户出差在外,希望在一个提供Internet连接的咖啡馆、飞机场或酒店连接到公司内部,Site to Site VPN技术就不适用了。在这种场合下,需要用到Remote Access VPN。远程访问VPN一般需要预先在客户计算机上安装VPN客户端,并且通过客户端拨号到公司VPN网关,如果拨号成功,客户就像通过一根网线虚拟的连接到公司VPN网关,然后获取公司内部网络的一个地址并且使用这个内部地质来访问公司内部的服务器。Remote Access有以下几种:

  • IPSec VPN。是一种全面的VPN技术,不仅适用于站点到站点的VPN连接方式,也能部署远程访问VPN。

  • VPDN。全称为Virtual Private Dial-up Networks,虚拟私有拨号网络,是VPN业务的一种,包括PPTP、L2TP和PPPOE等等,是基于拨号用户的虚拟专用拨号网业务。即用户已拨号接入方式连接,并且通过CDMA 1X分组网络传输数据时,VPDN会对传输的数据进行封装和加密,从而保护了数据的私密性使得VPN达到私有网络的安全级别。

  • SSL VPN。全称是Security Socket Layer,SSL,基于安全套接层协议建立远程安全访问通道的VPN技术。

GRE

概述

GRE全称是Generic Routing Encapsulation,中文是通用路由封装协议,提供了将一种协议的报文封装在另一种协议报文中的机制,是一种隧道封装技术。GRE可以封装组播数据,并可以和IPSec结合使用,从而保证语音,视频等组播业务的安全。

应用场景

img

img

img

  • GRE用来对某些网络层协议,比如IPX的报文进行封装,使这些被封装的报文能够在另一网络协议层协议(比如IP)中传输,GRE可以解决异种网络的传输问题。

  • IPSec VPN技术可以创建一条跨越共享公网的渠道,从而实现私网互联。IPSec VPN能够安全传输IP报文,但无法在隧道的两个端点之间运行RIP和OSPF等路由协议,GRE可以将路由协议信息封装在另一种协议报文(比如IP)中进行传输;

  • 使用GRE可以克服IGP协议的一些局限性,例如RIP是一种距离矢量协议,最大跳数为15,如果网络跳数超过15则无法通信。这种情况下,可以使用GRE技术在两个网络节点之间搭建隧道,隐藏它们之间的跳数,扩大网络的工作范围。

  • GRE并不支持加密,因而通过GRE隧道传输的流量是不加密的。将IPSec技术与GRE相结合,可以先建立GRE隧道队报文进行GRE封装,然后再建立IPSec隧道对报文进行加密,以保证报文传输的完整性和私密性。

报文结构

img

img

  • Checksum present:长度1bit,如果该位置1则表示后面可选的的Checksum字段存在并且包含有效信息;如果Checksum present位或Routing present位置1了,那么后面可选的Checksum以及Offset字段都会存在;

  • Routing present:长度1bit,如果该位置1,则表示后面可选的Offset字段存在并包含有效信息;如果Checksum present位或Routing present位置1了,那么后面可选的Checksum以及Offset字段都会存在;

  • Key present:长度1bit,如果该位置1,那么后面可选的Key字段存在并且包含有有效信息,Key验证是指对隧道接口进行验证,这种安全机制可以防止错误收到来自其他设备的报文。关键字字段(后面可选的Key字段)是一个四字节长的数值,只有隧道两端配置的关键字完全一致时才能通过验证,否则报文将被丢弃;

  • Sequence Number present:长度1bit,如果该位置1,那么后面可选电动车Sequence Number字段存在并且包含有效信息;

  • Strict Source Route:长度1bit,该位置1时,表示所有路由信息都包含了路由严格源的信息;

  • Recursion Control:长度3bit,包含了允许其他封装的数量,默认为0;

  • Flags:长度5bit,保留字段,必须为0;

  • Version:长度3bit,GRE版本号,必须为0;

  • Protocol:长度16bit,标识了载荷的协议类型;

封装\解封装过程

GRE封装报文后,封装前的报文称为净荷,封装前的报文协议称为乘客协议,然后GRE会封装GRE头部,GRE称为封装协议,也叫运载协议,最后,负责对封装后的报文进行转发的协议称为传输协议。

  • 设备从连接私网的接口收到报文后,查询报文头部中的IP地址字段,在路由器查找出下一跳接口,如果发现出接口是隧道接口,则将报文发送给隧道模块进行处理;

  • 隧道模块接收到报文后,首先根据乘客协议的类型和当前GRE隧道配置的校验和参数,对报文进行GRE封装,也就是添加GRE报文头部;

  • 设备给报文添加传输协议报头,即IP报头,该IP报头的源地址就是隧道源地址,目的地址就是隧道目的地址;

  • 设备根据新添加的IP报头的目的地址,在路由表中查找相应的出接口,并发送报文,然后封装后的报文在公网中传输;

  • 接收端设备从连接公网的接口收到报文后,首先分析IP报头,如果发现协议类型字段值为47,也就表示谢意为GRE,于是出接口将报文交给GRE模块处理。GRE模块去掉IP报头和GRE报头,并根据GRE报头的协议类型字段,发现此报文的乘客协议为私有网络中运行的协议,于是将该报文交给该协议处理。

实验

img

PC1和PC2之间通信,在R1和R2上使用GRE隧道进行通信。

配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
R1:
interface Tunnel0
ip address 192.168.12.1 255.255.255.0
tunnel source 192.168.13.1
tunnel destination 192.168.23.2
!
interface Ethernet0/0
ip address 192.168.11.254 255.255.255.0
duplex auto
!
interface Ethernet0/1
ip address 192.168.13.1 255.255.255.0
duplex auto
!
ip route 0.0.0.0 0.0.0.0 192.168.13.3
ip route 192.168.22.0 255.255.255.0 Tunnel0



R3:
interface Ethernet0/0
ip address 192.168.13.3 255.255.255.0
duplex auto
!
interface Ethernet0/1
ip address 192.168.23.3 255.255.255.0
duplex auto




R2:
interface Tunnel0
ip address 192.168.12.2 255.255.255.0
tunnel source 192.168.23.2
tunnel destination 192.168.13.1
!
interface Ethernet0/0
ip address 192.168.23.2 255.255.255.0
duplex auto
!
interface Ethernet0/1
ip address 192.168.22.254 255.255.255.0
duplex auto
!
ip route 0.0.0.0 0.0.0.0 192.168.23.3
ip route 192.168.11.0 255.255.255.0 Tunnel0



PC1:
ip default-gateway 192.168.11.254
!
interface Ethernet0/0
ip address 192.168.11.1 255.255.255.0
!
no ip routing



PC2:
interface Ethernet0/0
ip address 192.168.22.2 255.255.255.0
!
ip default-gateway 192.168.22.254
!
no ip routing

PC1 和PC2使用路由器的IOS,所以要用‘no ip routing’关闭路由功能,并使用‘ip default-gateway’命令配置默认网关;两个Tunnel口使用192.168.12.0/24网段作为地址,在R1\R2上配置默认路由指向R3,并使用静态路由将去往PC1\PC2的网段,下一跳指向Tunnel口,使得流量走Tunnel到达对端。验证结果如下:

1
2
3
4
5
6
7
PC1#traceroute 192.168.22.2
Type escape sequence to abort.
Tracing the route to 192.168.22.2
VRF info: (vrf in name/id, vrf out name/id)
1 192.168.11.254 1 msec 0 msec 1 msec
2 192.168.12.2 1 msec 2 msec 1 msec
3 192.168.22.2 2 msec 2 msec *

DMVPN

概述

由于现代企业采用的基本是总部——各地分支机构的模式,使用传统的GRE Tunnel的话,如果分支机构之间需要通信,则需要先将流量发回总部,再经由总部发给分支机构,这个过程经历了两次加解密,还需要两次占用中心总部的带宽,而且配置量较大,增加一个分支机构就需要再配置一个GRE Tunnel,每个分支机构\客户都需要固定的IP地址,当任意的分支机构的Tunnel down掉后,即使有其他路径可达也无法自动切换。因此GRE已经无法满足现实网络的需要了。这是DMVPN横空出世,相比Point-to-Point的GRE tunnel,DMVPN的优点有:

  • Tunnel Interface数量大幅减少。比起GRE需要为每个Hub-Spoke配置独立的Tunnel,DMVPN只要在路由器上设定mGRE(Multipoint GRE)就可实现Full Mesh,设置复杂性大大降低;

  • 分支机构不需要有固定的公网IP地址。除了中心站点需要公网固定IP地址外,其他分支机构Spoke不需要固定IP地址,因为分支机构Spoke通过Next Hop Resolution Protocol(NHRP)向Hub路由器注册自己的IP地址,而Spoke路由器亦可使用NHRP向Hub查询其他分支机构Spoke的IP地址;

  • 分支机构设置相同。分支机构的Tunnel设置基本相同,只要有一个设置成功,其他机构都可以使用几乎相同的设置,省时省力。

  • 动态建立Spoke-to-Spoke隧道,这些流量无需穿越Hub中心站点;

  • 支持Hub到Spoke的组播;

  • 拥有自愈能力,最大限度的保障了VPN隧道的运行时间;

DMVPN共有四个组件:

  1. mGRE,也就是Multipoint GRE;

  2. NHRP,也就是Next Hop Resolution Protocol;

  3. Dynamic Routing Protocol,支持路由协议,比如RIP、EIGRP、OSPF、BGP等;

  4. IPSec,不是必须但建议使用以增强数据的安全性;

mGRE

mGRE全称是Multipoint GRE,和传统的单隧道GRE需要建立多个Tunnel不同,mGRE的单个GRE可以支持多个GRE和IPSec隧道,简化了配置的复杂性,如果一个大型企业使用传统的GRE,那么它的大概拓扑如下:

img

可以看到,使用传统的GRE需要多条Tunnel,不仅配置麻烦而且容易出问题。如果使用了mGRE,那么配置会简单明了的多:

img

当使用mGRE的时候,每个路由器只有一个Tunnel接口,如果分支机构之间,比如分支机构1和2之间需要通信的话,那么Tunnel会‘自动的’建立好新隧道,分支机构之间的流量不必通过中心站点,而是可以直接在分支机构之间传输:

img

但此时也有个问题,那就是当配置点对点GRE隧道时,我们需要配置建立隧道的源地址和目标地址,当两个分支机构之间想传输数据时,它们该使用什么IP地址呢?这时分支机构是不知道对方的公网IP地址的,所以需要用第二个关键构成协议,NHRP,Next Hop Resolution Protocol,下一跳地址解析协议。

NHRP

理论知识

当分支机构之间想要知道对方的公网IP地址时,需要使用NHRP协议,协议的基本特点如下:

  • 一个路由器会作为NHRP的Server;

  • 其他的路由器是NHRP的Client;

  • NHRP的Client会在Server上注册并且报告给Server它们自己的公网IP地址;

  • NHRP的Server会在缓存中持续追踪所有的公网地址;

  • 当一个Client需要通过隧道向其他Client使用隧道传输数据时,它会先向Server请求目标路由器的公网IP地址;

因为NHRP协议是一个Server-Client模式的协议,所以mGRE使用Hub and Spoke模式是合理的。所以Hub路由器(总部服务器)就是NHRP的Server服务器,分支机构就是Spoke和Client。

img

上面的拓扑中,我们有两台Spoke路由器,当然它俩也是NHRP中的Client角色,两台Spoke分别和Hub路由器建立了Tunnel。在分支机构路由器的配置中,会配为Hub配置固定的IP地址,而在身为Hub的中心路由器的配置中,会动态的接受Spoke的地址,使用NHRP的注册、请求报文来将分支机构的公网地址注册给中心的Hub路由器。

img

中心的Hub路由器,也就是NHRP的Server路由器,会构建一个公网IP地址以及隧道IP地址的这两者之间的映射

img

当Spoke1想发送信息给Spoke2时,它需要知道Spoke2的公网IP地址,这时它会发送NHRP解析请求,询问身为Hub\Server的路由器,Spoke2的公网地址是什么。

img

Hub\Server路由器会查询缓存,找到Spoke2的条目,并且发送NHRP的解析回复报文给Spoke1,告诉Spoke1它所需要的Spoke2的公网IP地址。

img

Spoke1知道了Spoke2的公网IP地址后,可以直接使用隧道向Spoke2发送数据。只用想Hub路由器请求一个IP地址,而不用像普通GRE一样什么流量都需要经过Hub站点

NHRP的作用是公网IP地址和隧道IP地址之间的转换,换句话说,Spoke路由器会把自己的公网IP地址和Tunnel地址传送给Hub\Server

配置命令

Hub配置

1
2
3
4
5
6
interface Tunnel 0
ip address X.X.X.1
tunnel source C
ip nhrp network-id Y #所有的设备需要配置相同的ID
ip nhrp authentication ZZZ #启动NHRP认证(可选)
ip nhrp map multicast dynamic #动态接收组播映射

Spoke配置

1
2
3
4
5
6
7
interface Tunnel 0
ip address X.X.X.2
ip nhrp network-id Y #所有的设备需要配置相同的ID
ip nhrp authentication ZZZ #启动NHRP认证(可选)
ip nhrp map X.X.X.1 A.A.A.A #Spoke需映射Hub的公网地址<A.A.A.A>和Tunnel地址<X.X.X.1>
ip nhrp map multicast A.A.A.A #Spoke需要手动映射组播到Hub,用于建立动态路由协议邻居
ip nhrp nhs X.X.X.2 #配置NHRP server地址,Spoke启动后会到Server注册自己的Tunnel、公网地址之间的映射

优化命令

1
2
3
4
5
6
Hub:
HUB(config-if)# ip nhrp redirect


Spoke:
SPOKE(config-if)# ip nhrp shortcut

实验

img

几台路由器的公网接口要能彼此先通信,再配置DMVPN,公网互通是一切的寄出,在这里R2\R3\R4上都配置了到R1的默认路由,所以彼此能ping 通:

1
2
3
4
5
6
7
8
9
10
R2#ping 13.1.1.3
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 13.1.1.3, timeout is 2 seconds:
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max = 1/1/2 ms
R2#ping 14.1.1.4
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 14.1.1.4, timeout is 2 seconds:
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max = 1/1/1 ms

然后来配置DMVPN:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
先配置mGRE和NHRP:

R2:
interface Tunnel0
ip address 10.1.1.2 255.255.255.0
no ip redirects
ip nhrp network-id 10
tunnel source Ethernet0/0
tunnel mode gre multipoint



R3:
interface Tunnel0
ip address 10.1.1.3 255.255.255.0
no ip redirects
ip nhrp map 10.1.1.2 12.1.1.2
ip nhrp map multicast 12.1.1.2
ip nhrp network-id 10
ip nhrp nhs 10.1.1.2
tunnel source Ethernet0/1
tunnel mode gre multipoint



R4:
interface Tunnel0
ip address 10.1.1.4 255.255.255.0
no ip redirects
ip nhrp map 10.1.1.2 12.1.1.2
ip nhrp map multicast 12.1.1.2
ip nhrp network-id 10
ip nhrp nhs 10.1.1.2
tunnel source Ethernet0/2
tunnel mode gre multipoint

可以看出,R3和R4的配置基本相同,只在tunnel的IP地址上不一样,配置完mGRE和NHRP后,再来看一下配置是否成功:

1
2
3
4
5
6
7
8
9
10
11
R2#show ip nhrp detail
10.1.1.3/32 via 10.1.1.3
Tunnel0 created 00:10:45, expire 00:09:14
Type: dynamic, Flags: registered nhop
NBMA address: 13.1.1.3
Preference: 255
10.1.1.4/32 via 10.1.1.4
Tunnel0 created 00:00:45, expire 00:09:14
Type: dynamic, Flags: registered nhop
NBMA address: 14.1.1.4
Preference: 255

可以看到,R2上和R3、R4成功配置了mGRE和NHRP,接下来配置路由协议,这里使用OSPF协议:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
R2:
router ospf 1
router-id 2.2.2.2
network 10.1.1.2 0.0.0.0 area 0



R3:
router ospf 1
router-id 3.3.3.3
network 10.1.1.3 0.0.0.0 area 0




R4:
router ospf 1
router-id 4.4.4.4
network 10.1.1.4 0.0.0.0 area 0

这里要注意两点,一是在OSPF中只能宣告Tunnel的IP地址进OSPF,而不能宣告上联的公网IP地址进OSPF;二是宣告完OSPF后,会发现邻居不停的Down\UP:

1
2
3
4
5
Adjacency forced to reset
*May 1 16:14:34.532: %OSPF-5-ADJCHG: Process 1, Nbr 3.3.3.3 on Tunnel0 from EXCHANGE to DOWN, Neighbor Down: Adjacency forced to reset
*May 1 16:14:34.533: %OSPF-5-ADJCHG: Process 1, Nbr 4.4.4.4 on Tunnel0 from EXCHANGE to DOWN, Neighbor Down: Adjacency forced to reset
*May 1 16:14:34.533: %OSPF-5-ADJCHG: Process 1, Nbr 3.3.3.3 on Tunnel0 from EXCHANGE to DOWN, Neighbor Down: Adjacency forced to reset
*May 1 16:14:34.534: %OSPF-5-ADJCHG: Process 1, Nbr 4.4.4.4 on Tunnel0 from EXCHANGE to DOWN, Neighbor Down: Adjacency forced to reset

这是为什么呢?

1
2
3
4
5
6
7
8
R2(config-router)#do show ip ospf int tun 0 | include Network Type
Process ID 1, Router ID 2.2.2.2, Network Type POINT_TO_POINT, Cost: 1000




R3(config-router)#do show ip ospf int tun 0 | include Network Type
Process ID 1, Router ID 3.3.3.3, Network Type POINT_TO_POINT, Cost: 1000

因为这里Tunnel在OSPF协议中默认的网络类型是点对点,Point-to-Point,点对点只能有一个邻居,而这里R2有R3和R4两个邻居,所以它会持续的建立-终端邻接关系,所以Tunnel上不能使用点对点类型,必须将类型改为其他的:

1
2
3
4
5
R2(config-if)#ip ospf network ?
broadcast Specify OSPF broadcast multi-access network
non-broadcast Specify OSPF NBMA network
point-to-multipoint Specify OSPF point-to-multipoint network
point-to-point Specify OSPF point-to-point network

除了点对点以外,还有广播、非广播、点对多点几种网络类型,在DMVPN中一般使用广播和点到多点两种模式。

广播模式

先来看广播模式的配置。

1
2
3
4
5
6
7
8
9
10
11
R2:
interface tunnel 0
ip ospf network broadcast
ip ospf priority 255



R3&R4:
interface tunnel 0
ip ospf network broadcast
ip ospf priority 0

严格来说,不需要为Hub配置255的priority,这么做只是为了更好的确保Hub作为DR,将Spoke的priority设置为0确保它们不会成为DR。接下来配置OSPF进程:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
R2:
router ospf 1
router-id 2.2.2.2
network 10.1.1.2 0.0.0.0 area 0


R3:
router ospf 1
router-id 3.3.3.3
network 10.1.1.3 0.0.0.0 area 0


R4:
router ospf 1
router-id 4.4.4.4
network 10.1.1.4 0.0.0.0 area 0





R2#show ip ospf neighbor

Neighbor ID Pri State Dead Time Address Interface
3.3.3.3 0 FULL/DROTHER 00:00:36 10.1.1.3 Tunnel0
4.4.4.4 0 FULL/DROTHER 00:00:32 10.1.1.4 Tunnel0

点到多点模式

这里我们将三台路由器的Tunnel接口改成点对多点:

1
2
3
4
5
R2(config-if)#ip ospf network point-to-Multipoint

R3(config-if)#ip ospf network point-to-Multipoint

R4(config-if)#ip ospf network point-to-Multipoint

可以发现,在点对多点的网络类型下,邻居很快就建立起来了,因为在这种网络类型中,不需要选择DR\BDR。

IPSec vpn

出现背景

在IPV4协议出现的时候,由于试用范围很小(一开始在美国国防部高级研究计划局试用)且每个接入网络网络的人均经过审核,每个设备都在严格管控之中,所以一开始IPV4协议中没有加入关于安全方面的考虑,但随着网络技术的发展以及网络范围的机构爆发式的增长,接入互联网的机构不再有审核,每台路由器也不知道都有哪些人来管理,所以安全问题日益突出,所以在IPV6协议的设计之初,加入了IP层安全性方面的设计,设计了IPSec协议,不管是IPV4还是IPV6都能够使用。

基础知识

密钥

密钥是一种参数,它是在明文转换为密文或将密文转换为明文的算法中输入的参数,用来完成加密、解密、完整性验证的秘密信息,在使用密钥对数据进行加密以后,只有用相应的密钥才能进行解密,密钥保护了信息的私密性,没有密钥,即使通信内容被第三方获取也无法获知传输信息的内容。密钥的长度决定了破解的难度,密钥越长,破解起来越困难。

对称密钥算法

对称加密算法是应用较早的加密算法。在对称加密算法中,数据发送方将明文(也就是原始的要发送的数据)和加密密钥一起经过特殊的算法加密处理后,使其变成复杂的加密密文发送出去。数据的接收方收到密文后,若想知道原始发送的数据是什么,需要使用加密过的密钥,以及相同算法的逆算法,将数据解密,才能恢复成可读的铭文数据。在对称算法中,使用的密钥只有一个,收发两端都是用这个密钥对数据进行加密和解密,所以通信的双方必须实现知道加密的密钥。因此对称算法的安全性依赖于密钥,如果密钥泄露,就意味着其他无关人员在获取到加密信息后也能解密获取其中的通信数据。主流的对称加密算法有DES,3DES等。

对称加密算法的优势是,算法公开,计算量小,加密速度快,效率高。不足是双方都要使用相同的密钥,安全性得不到保证;随着参与者数量的增加,密钥数量急剧膨胀,需要(n×(n-1))/2个秘钥;因为密钥数量过多,对密钥的管理和存储是一个很大的问题;不支持数字签名,不具备不可否认性。

非对称密钥算法

非对称算法需要两个密钥:公开密钥,也就是公钥,Publickey;私有密钥,也就是私钥,Privatekey。公钥与私钥是成对且相互匹配的,如果用公钥对数据进行加密,只有对应的私钥才能解密,所以私钥需要持有者严密保护,确保只有使用者才能唯一拥有。因为加密和解密使用的是两个不同的密钥,所以这种算法叫做非对称加密算法。常见的非对称加密算法有,RSA、DH和ECC等等。

非对称加密算法实现机密信息交换过程,用一句话来概括就是公钥加密,私钥解密。基本过程是,所有参与通信的设备,都需要预先使用非对称密钥算法(例如RSA),生成一对密钥(公钥和私钥),然后将公钥公开,放在服务器上共享给所有通信的另一方。假设此时乙方要给甲发送数据,则乙会使用甲所公布的公钥对数据进行加密生,成加密数据,然后发送给甲方。当甲方收到加密的信息后,甲会用自己的私钥对数据进行解密,获取明文信息。

img

  1. 用户1,也就是发起方,需要预先获取用户2,也就是接收方的公钥;

  2. 用户1使用用户2的公钥,对需要传输的信息进行加密;

  3. 中途截获数据的攻击者由于没有用户2的私钥,无法对数据进行解密;

  4. 用户2使用自己的私钥对加密后的数据(由用户2的公钥加密,出现在步骤2中)进行解密,使用公钥加密,私钥解密的方式实现了数据的私密性

非对称密钥算法运算速度极慢,相比对称密钥算法要慢得多得多,因此基本不可能使用非对称密钥算法对实际数据进行加密,在实际通信中,主要使用非对称加密算法对密钥进行加密,以完成密钥交换的步骤。

非对称密钥算法的优势有:

  • 安全。不用担心通信两端的公钥被劫持,所以非对称密钥的分发更加安全;

  • 密钥的数量和通信参与者数目相同;

  • 在交换公钥之前无需建立某种信任关系,因为有了公钥也没法对数据进行解密;

  • 支持数字签名和不可否认性;

非对称密钥算法的不足有:

加密速度奇慢无比,加密同样大小的数据,如果用对称算法DES的话,大概比非对称加密算法的RSA快几百倍。加密后的密文长度会变长,比如用RSA加密1G的数据,加密后可能会变为2G大小。

数字签名

img

img

非对称式算法除了可以用来加密数据,也可以用来做数字签名。数字签名是只有信息的发送者才能产生的,别人无法伪造的一段数字串,这段数字串同时也是对信息的发送者发送信息真实性的一个有效证明。它类似于在纸上的普通的物理签名,但使用了非对称加密技术。纸上的签名,比如合同或者欠条,在上面签名是承认了上面写的东西,事后不能抵赖,也就是不可否认性,签名了就承认纸上写的东西并且要履行相应的义务。谁会去检查这个签名呢?一般都是在出现问题后,比如甲向乙借了10000块钱,甲在欠条上签名,如果甲欠债不还,乙会拿出那张由甲签过名的欠条,只要签名经鉴定是甲签的,那么甲这个借钱行为就无法抵赖,无法否认。数字签名可以提供两个很重要的安全特性,完整性校验和源认证,完整性校验保证了数据在发送过程中不会产生变化,完整性由散列函数完成。源认证由散列算法提供,因为使用了甲的公钥加密以后,只有使用甲的私钥才能对数据进行解密,所以甲没法对这个进行抵赖,从而完成了源认证。数字签名可以用于驱动程序签名,PDF签名,IPSec数字签名认证,数字证书中的数字签名。

实现过程为:

1
2
3
4
5
6
明文数据---------hash算法(md5)----------hash值(128bit-例如12345)-------私钥加密------------数字签名

数字签名 --------用对方公钥解密------hash值12345
明文数据--------hash算法(md5) ---hash值12345

如果散列值1和散列2相同,说明验证成功,如果散列值不相同,说明验证失败

总览

IPSec协议用来在IP层提供安全服务,以便其他TCP/IP协议和应用程序使用,这就意味的IPSec为那些在TCP/IP网络上的设备提供了安全通信所需要的工具。当两个设备(不管是用户终端设备,比如PC,还是中间设备,比如路由器防火墙)想要进行安全通信时,它们会在设备之间设置一个安全的通道来通信,但这个安全通道可能会经过很多中间设备,而这些中间设备并不安全。所以要确保通信的安全,必须达到以下的标准:

  • 两台设备之间必须就使用一组安全协议达成一致,这样彼此之间才能以对方理解的格式发送数据;

  • 它们必须确定给数据加密的算法,这样数据的内容才会有私密性,不会被其他人所知道;

  • 它们必须交换密钥,这个密钥用于解密已加密的数据;

  • 完成了前几步之后,两台设备必须使用之前协商好的协议、算法和密钥,将数据重新编码然后通过网络发送给对方;

为了达成上述的这几个标准,IPSec协议出现了,IPSec(Internet Protocol Security)并不是一个单独的协议,而是一组服务和协议的集合,它为IP网络提供了完整的安全解决方案,提供了多种保护功能。因为IPSec工作在IP层,它能够为IP层以及IP层之上的其他更高层提供保护,而不需要其他额外的安全措施,它可以提供以下三个方面的保护:

  • 私密性(Confidentiality),数据私密性就是通过加密技术,例如使用3DES等算法,对数据进行加密,这样一来即使数据被第三方获取,也只是加密后的,无法破解更无法得知原始数据,从而杜绝数据被窃听;

  • 完整性(Integrity),完整性可以确保数据在传输过程中未经第三方进行篡改,例如MD5或SHA1等算法,从而杜绝数据被篡改;

  • 源认证(Authenticity),源认证就是对发送数据包的源头进行身份认证,确保发送数据的源头是合法用户,从而杜绝通信源头被冒充。源认证除了能提供发送的源用户验证,还能提供不可否认性,因为经过了源认证以后能够确定了发送源设备就是它,所以发送者无法否认;

IPSec框架

img

img

img

IPSec主要使用AH(Authentication Header)Protocol、ESP(Encapsulating Security Algorithms)Protocol和IKE这三个核心协议:

  • AH:AH全称为Authentication Header,它是一个协议,通过添加一个根据数据段中的值所计算出来的AH报头,对数据段的全部或部分内容进行认证(AH is a protocol that provides authentication of either all or part of the contents of a datagram through the addition of a header that is calculated based on the values in the datagram. )。AH只提供了身份验证机制,可以提供数据完整性验证(Data Integrity)、数据源身份认证(Data Origin Authentication)以及可选的对重放攻击的保护(未认证用户大量且反复的发送数据)。数据完整性验证由算法生成的摘要来确保,比如HMAC-MD5或HMAC-SHA算法;数据源身份验证由共享密钥生成的信息摘要确保;重放攻击防护由AH头部的序列号字段来提供保护。AH对IP报头和它的负载提供了完整性校验,但某些字段可能在传输过程中出现合理的变化,比如TTL字段。
  • ESP:ESP全称为Encapsulating Security Payload,ESP不仅提供了认证功能(包含数据完整性验证、数据源身份认证以及重放攻击保户),相比AH来说,ESP还额外提供了数据私密性(通过加密算法)以及。其中数据完整性由MD5或SHA这种验证完整性的算法通过生成消息摘要来确保;数据源认证,由共享密钥创建的消息摘要确保;ESP也可以值提供以上所有的功能,也可以单独提供其中的一个或两个功能,比如只提供数据私密性功能,或者只提供认证功能,或者同时提供数据私密性和认证功能。

img

  • 密钥交换构架和机制:两台设备在通信时为了保证数据的私密性,会对数据进行加密,但数据到了对方设备后,还需要解密的密钥才能正常读取数据,为了让对方能解密就必须要交换密钥,除了交换密钥,还需要交换安全关联信息(Security Associations)。在IPSec中,使用IKE(Internet Key Exchange)协议来完成。

除了ESP、AH和IKE,还有其他一些辅助的算法及协议:

  • 加密/哈希算法:AH和ESP都是通用协议,不指定使用哪种算法来进行加密,可以使用多种算法来达成目的,这样的话灵活性比较强,所以需要通信的两端进行协商,看使用哪种算法来加密,以便通信时能正确读取数据进而解密。一般使用比较多的算法为MD5(Message Digest 5)SHA(Secure Hash Algorithm 1),它们都叫做哈希算法(Hashing Algorithms)因为这俩都是将输入的数据通过哈希公示计算,得出一个值的方式进行工作。
  • 安全策略和关联及管理办法:因为IPSec让设备自由选择使用的安全协议,所以需要追踪设备之间的使用的是什么协议,IPSec使用安全策略(Security Policies)安全关联(Security Associations)来完成上述工作,并且通过交换安全关联(Security Associations)来完成设备之间的信息交互。

传统的安全技术,比如HTTPS或WEP/WEA,往往会采用某种固定的加密和散列函数,这种做法有一个弊端就是如果某天所采用的的加密算法被破解或被爆出严重的漏洞,那么使用这个算法或散列函数的技术也难免被淘汰,因为协议已经不再安全。为了避免这种事情的发生,IPSec没有定义具体的加密和散列函数,它的做法是提供一个框架性的结构,可以使用不同的算法,具体使用哪种算法,通过协商来决定,比如说,如果3DES这个168位的加密算法满足现实使用要求,那么就用它作为加密算法,如果觉得这个算法不行或出现了严重问题,那么也可以马上更换加密协议,以后出现新的加密算法也可以在IPSec框架下使用,始终保持IPSec协议的可用性,所以IPSec有多重算法选择的组合方式:

img

总体流程

为了建立起IPSec tunnel,我们需要使用IKE协议,全称是Internet Key Exchange,IKE协议用于在IPSec协议中对双方所使用的具体协议,比如使用哪种加密算法、认证方式、密钥有效期等参数进行协商,IKE协商完成后的结果叫做安全关联(SA,Security Association),可以说IKE建立了安全关联。

IPSec的建立过程为5个阶段:

  • 初始化:触发隧道的创建。比如在路由器上配置IPSec,然后配置哪些流量需要被IPSec保护,也就是定义感兴趣流,当路由器收到那些需要被保护的流量时,会开始IKE进程,当然也可以手动初始化隧道。在思科设备上,感兴趣流是用访问列表,access-list来匹配的,被访问列表匹配的流量会被加密,未被匹配的流量将不会被加密;

  • IKE阶段1:两台设备会对对端设备进行身份认证,协商好安全关联(包含使用什么加密协议、认证方式、密钥有效期等),并用安全关联去建立IKE第一阶段的隧道,又叫ISAKMP Tunnel;

  • IKE阶段2:在IKE阶段1的隧道中,基于需要被加密的流量协商并建立IKE阶段2的隧道,也就是IPSec SA。协商的内容包括使用哪个IPSec协议(AH或ESP),是用那种封装方式(Transport或Tunnel),使用哪种加密协议(DES或3DES还是AES),使用哪种认证协议(MD5还是SHA),生存周期为多久,是否使用可选的DH交换;

  • 数据传输:用IKE阶段2的隧道传输并保护发送的数据;

  • 终止:当没有需要保护的数据传输的一段时间后,IPSec隧道会终止进程;

初始化IPSec以后,在IKE phase1中,两个终端会协商,到底使用哪些加密、认证、哈希或其他算法协议,以及IPSec协议需要的其他参数。为什么需要协商呢?因为前面说过了,IPSec协议只规定了框架,没规定具体的协议,从而避免某个加密或认证协议算法出现问题而导致整个IPSec协议被攻破,如果一端用3DE而另一端不支持就麻烦了,所以需要IKE收集两端采用的协议,看两遍支持的协议是否相同。如果两端支持的协议相同协商成功了,会在这个阶段中会建立起ISAKMP(Internet Security Association and Key Management Protocol)会话,它也可以叫做ISAKMP Tunnel或IKE 阶段1 Tunnel。

设备收集起来的关于安全的参数,叫做SA(Security Association,安全关联),让我们来看一个已经建立起IKE 第一阶段的隧道的例子:

img

IKE第一阶段所建立的Tunnel仅供管理流量使用,比如keepalive等,一阶段的Tunnel是为了给第二阶段的流量提供安全保障,第二阶段叫做IKE阶段二Tunnel或IPSec隧道。

当两台路由器之间建立完IKE阶段2以后如图所示:

img

当阶段2建立完毕后,就能使用IKE阶段2Tunnel(或者叫IPSec Tunnel也行)来对数据进行保护,这样一来用户数据就能通过IKE 阶段2Tunnel来传输:

img

IKE协议建立起了Tunnel,但它并不能为用户数据提供认证或加密功能,这需要其他两个协议来完成,它们是AH(Authentication Header)和ESP(Encapsulating Security Payload),这两个协议都能提供身份认证和数据完整性校验功能,但ESP额外支持加密功能,因此ESP在现网中使用更多,毕竟数据的私密性还是很重要的。AH和ESP都支持两种模式,Transport模式(传输模式)和Tunnel模式(隧道模式),两种模式的具体区别在后文写,简单说一下最主要的区别就是,Transport模式用原始的IP报头,原始的IP报头不会被保护,而Tunnel模式会生成新IP报头,原始的IP报头会被保护:

img

Transport模式通常在两个终端通信时使用,用来确保流量的安全,Tunnel模式通常在Site-to-Site模式VPN使用,在这种情况下,我们需要将原始的IP报文封装,因为使用的IP地址通常都是私有地址,无法在互联网中被路由。

IKE协议

基本概念

IKE协议全称为Internet Key Exchange,互联网密钥交换协议,负责建立和维护两种SA(Security Association,安全关联),分别是阶段一的IKE SA(也叫ISAKMP SA)以及阶段二的IPSec SA。IPSec只规定了大的框架而没有规定具体使用的加密\验证协议,所以需要使用IKE协议用来交换两端使用的协议以及其他IPSec需要用到的参数,IKE协议在RFC2409中定义,具体完成以下几个方面的任务:

  • 对建立IPSec的双方进行认证,认证需要事先协商认证的方式;

  • 通过密钥交换,产生用于加密和HMAC的随机密钥;

  • 协商加密参数,比如加密协议、散列函数、封装协议、封装模式和密钥有效期;

大概的工作方式是,IKE通过让具备IPSec能力的设备,交互SA(Security Association,安全关联),用来构建安全关联数据库,然后安全关联数据库被AH或ESP协议使用,由AH或ESP来加密用户数据。

IKE协议也是一个‘混合’协议,因为它集合了或者说支持了三个协议,第一个是ISAKMP,Internet Security Association And Key Management Protocol,互联网安全关联管理协议,它是IKE的核心协议(所以也会把IKE和ISAKMP这两个术语互换使用,但要明白其中区别),规定了交换密钥和安全关联信息的体系及框架,工作的方式是通过一系列步骤来协商设备之间的SA(Security Association,安全关联),ISAKMP协议支持多种密钥交换的方式。在IKE中,ISAKMP框架是密钥交换的基础方式,他决定了IKE协商包的封装格式、密钥交换过程、模式的切换的构架,它其实是规定了一个构架,但不规定具体的协议,其他两种协议是SKEME和Oakley,Oakley规定了密钥交换的方式,提供了IPSec对各种技术的支持,例如,支持新的加密与散列技术,Oakley为IPSec提供了一个框架;SKEME定义了密钥交换的体系结构,例如DH算法就是这个协议引入的。

IKE和IPSec的关系

IKE为IPSec提供了自动协商密钥、建立IPSec SA的服务,能够简化IPSec的使用和管理,大大简化IPSec的配置和维护工作:

img

IKE与IPSec的关系如上图所示,对等体之间建立一个IKE SA完成身份验证和密钥信息交换以后,在IKE SA的保护下,根据配置的AH\ESP安全协议等参数协商出一对 IPSec SA。从此以后,对等体之间的数据将在IPSec隧道中加密传输。

安全联盟

安全联盟的英文全称是Security Association,是建立IPSec隧道的通信双方对隧道参数的约定,包括隧道两端的IP地址、隧道采用的验证方式、验证算法、验证密钥、加密算法、共享秘钥以及生命周期等一系列参数。

SA由三元组来唯一标识,这个三元组包括安全参数索引SPI(Security Parameter Index)、目的IP地址和使用的安全协议号(AH或ESP)。其中,SPI是为了唯一标识SA而产生的一个32bit的数值,它在AH和ESP头中传输。在手工配置SA时,需要手工指定SPI值。一般都使用IKE协商产生SA,SPI将自动随机生成。

SA是一般是单向逻辑连接,因此两设备在使用IPSec通信时,至少需要建立两个SA来分别对两个方向的数据流进行安全保护,但ISAKMP SA是双向的。

SA是IPSec的一个基本组成部分,SA是SADB(Security Association DataBase)的一个条目,它包含着双方关于IKE和IPSec已经协商完毕的安全信息。

IKE or ISAKMP SA:双向的,决定了IKE协议处理的相关细节;

IPSec SA是单向的,与封装协议有关,决定了具体加密流量的处理方式。

上面这两类SA都是由IKE协议协商产生的。

建立IPSec的SA主要有两种方式,手工方式和IKE自动协商的方式,现网中都是用IKE方式建立的,两者的主要区别为:

  • 密钥生成方式不同。手工方式下,建立SA所需的全部参数,包括加密、验证密钥都需要用户手工配置,也只能手工配置,在中大型网络中,这种方式的密钥管理成本很高;IKE方式下,建立SA需要的加密、验证密钥,是通过DH算法生成的,可以动态刷新,因此密钥管理成本低,而且安全性较高,所以现网中都是用IKE方式建立的;
  • 生命周期不同。手工方式建立的SA,一旦建立就永久存在;IKE方式建立的SA,生存周期由双方配置的生存周期参数控制。

阶段1

阶段一是一个进行‘设置’的阶段,由于IPSec是一个框架,可以支持很多具体的技术和协议,所以建立IPSec 隧道之前,先要知道对端设备所使用的具协议和本端设备是否一致,因此要协商这些关于安全的协议和参数,两个设备之间协商后为ISAKMP创建了SA(Security Association,安全关联),也就是ISAKMP SA。SA是指两个设备之间安全相关的信息的集合,这个集合描述了两个设备安全连接的方式,也可以把SA看成是一个合同,这个合同规定了两台设备之间安全通信所使用的具体的安全机制,这个SA安全关联存储在安全关联数据库中(SADB,Security Association DataBase)。一般来说SA都是单向的,但ISAKMP SA是双向的,一旦阶段1建立完成,那么任何一台设备都可以使用ISAKMP SA来为后续的ESP或AH使用,这样还能确保阶段2数据交互的安全。一旦阶段1建立完毕将马上进入阶段2,如果阶段1失败则无法开启阶段2。

整个阶段1又可以分为3个小的步骤,协商、DH密钥交换和验证。

协商

阶段1的ISAKMP SA(Security Association安全关联)协商的内容如下:

  • 使用的加密算法,用来加密数据,确保数据的私密性,比如是使用DES、3DES还是AES等算法;

  • 使用的哈希算法,用来验证数据的完整性,比如是使用MD5还是SHA等算法;

  • 使用的身份认证方式,通信的两端需要说明自己是谁,可以使用预共享密钥或数字签名证书的形式;

  • DH组,全称英文是Diffie-Hellman group,DH组决定了在密钥交换过程中所使用的的秘钥的强度,DH是IPSec产生密钥资源的主要协议,是一种非对称密钥算法。DH组的数字越高,安全性越高,比如DH group5是1536bit,而长度1是768bit,但长度越长需要计算的时间相对更长。Diffie和Hellman是发明了公钥密码技术的两位大牛先驱,在使用公钥加密技术的情况下,不需再像之前一样使用同一个密钥来进行加密和解密,数据使用公钥进行加密(公钥大家都能获取的),使用保密的私钥进行解密(私钥只有通信两端知道),DH组参数(Diffie-Hellman group)定义了如何进行这种加密的属性,IKE中需要制定四个Oakley衍生出来的参数。

  • 周期,也就是IKE步骤1所持续的时间,持续的时间越短意味着安全性越强,因为一旦周期结束就会换另一套密钥,破解难度很大。每个厂家的默认周期不同,一般的周期为一天,也就是86400秒;

DH密钥交换

DH是一种密钥交换方式,用于生产密钥材料,并通过ISAKMP消息在发送和接收设备之间进行密钥材料交换。然后,两端设备各自计算出完全相同的对称密钥。该对称密钥用于计算加密和验证的密钥。任何时候双方都不会交换真正的密钥,而是交换一些数据,并用这些数据计算出真正的共享秘钥,并且即使第三方获取了双方交换的所有数据,也无法计算出真正的密钥。MD5、SHA1、DES、3DES等算法都可以采用DH算法来共享对称密钥。

当协商的步骤完成后,通信的两端会知道需要使用什么协议,它们会使用协商好的DH组去交换秘钥,密钥交换完毕后,通过一系列的算法,得到加密和处理IKE信息的密钥,最后两端都会有这个共享秘钥,包括加密感兴趣流的密钥也是从这个共享秘钥衍生而来的,可以说这个密钥是所有密钥的始祖。

认证

在认证这个阶段中,通信两端会用之前协商好的认证方式(比如SHA或MD5)对对端进行身份验证。当验证成功以后,意味着IKE的阶段1已经完成,IKE的阶段1会协商出IKE阶段1的隧道(也叫 ISAKMP 隧道),意味着下一步的通信将在该隧道上安全的进行。

两种模式

阶段1的以上三个小步骤可以使用两种模式完成:主模式(Main mode)和主动模式(Aggressive mode)。

阶段2

在这个阶段,其他安全协议会使用阶段1建立好的ISAKMP SA,来为自己(其他安全协议)建立SA,通常来说,这个阶段,是基于感兴(所以policy中有感兴趣流)趣流去协商、建立‘真正的’SA安全关联,因为这个SA才是用来给ESP或AH使用的,用来保护那些需要传输的数据。IKE阶段二协商SA和密钥,用于保护真正传输的数据。

img

img

在阶段2中也需要协商一些参数:

  • 使用哪种IPSec的协议,是AH还是ESP;

  • 使用哪种封装模式,是Transport模式还是Tunnel模式;

  • 使用哪种加密算法,是DES、3DES还是AES;

  • 使用哪种认证方式,是MD5还是SHA;

  • 生存周期为多久,也就是IKE阶段2存在的时间是多久,当隧道将要过期时,会更换另一套密钥;

  • DH交换(可选),DH交换用来确保‘完全向前保密’,这个步骤可选,大概过程是强迫通信两端再次进行DH交换,为IKE第二阶段生成一个新的密钥,能更好的确保通信时的安全;

阶段1VS阶段2

  • SA保护的对象不同。阶段1的SA用来保护通信两端的IKE报文;而阶段2的SA则用来保护感兴趣流,也就是需要加密的通信数据;

  • SA的属性不同。阶段1的SA只能指定一个IP地址作为加密点,阶段2的SA能定义一系列IP地址作为通信点;

  • SA的出现频率不同。阶段2信息出现得非常频繁(有效期小时),但IKE第一阶段的信息每一天发生一次(有效期一天);

  • 阶段1的1-4数据包是明文的,阶段1的5-6数据包以及阶段2的1-3数据包是密文;

数据交换过程

img

img

阶段1可以使用两种模式来完成数据包的交换,分别是主模式(Main mode)和主动模式(Aggressive mode)。主模式使用六个数据包进行交互,主动模式使用三个数据包进行交互。不管使用几个数据包,其主要目的是对建立IPSec的双方来进行认证,以确保只有合法的对等体才能建立IPSec VPN,协商的结果就是IKE SA。

第二阶段总是使用三个数据包的交换来完成,主要目的是根据需要加密的实际流量(感兴趣流),来协商保护这些流量的策略,第二阶段协商的结果就是IPSec SA。

只有通过预共享密钥认证的远程访问VPN(思科叫做EZVPN)的情况下,第一阶段才会使用主动模式,也就是3个包的方式来完成第一阶段。

阶段1

阶段1可以使用两种模式来完成数据包的交换,分别是主模式(Main mode)和主动模式(Aggressive mode)。主模式使用六个ISAKMP数据包进行交互,主动模式使用三个ISAKMP数据包进行交互。不管使用几个数据包,其主要目的是对建立IPSec的双方来进行认证,以确保只有合法的对等体才能建立IPSec VPN,协商的结果就是IKE SA。第一阶段如果完成,一方面标志着收发双方认证通过,还标志着会建立一个双向的ISAKMP/IKE SA(安全关联),这个SA维护了处理ISAKMP/IKE流量的相关策略(这些策略不会处理实际感兴趣流),而对等体双方还会继续使用这个SA来保护后续阶段2的IKE快速模式3个包的交换过程。

我们先看主模式下的6个包交互的过程:

img

img

第一、二个包

主模式数据包1和2主要负责完成两个任务:

  1. 通过核对收到ISAKMP数据包的源IP地址,来确认收到的ISAKMP数据包是否源自于合法的对等体(Peer,相当于合法的通信对象);
  2. 协商IKE策略;IKE策略包含加密策略、散列函数、DH组、认证方式、密钥有效期。但这个策略不是用于实际加密通信点之间流量的策略;

数据包1的wireshark抓包如下:

img

通信的发起者站点1(那个想要建立起隧道的设备)将会发送第一个数据包,这个数据包是建立SA的提议,上面抓包中可以看到,发起者的IP地址是192.168.12.1,收到这个数据包的的对端IP地址是192.168.12.2,并且IKE使用了UDP端口500,抓包中发起者的SPI(Security Parameter Index,安全参数索引)是一个用来标识SA的唯一值。抓包中还能看到,使用的IKE协议版本为1.0,模式为主模式,后面的Payload负载中可以找到发起者希望在SA中使用的参数,比如使用AES算法进行加密、秘钥长度为128位等。

192.168.12.2收到第一个ISAKMP数据包后首先会查看该数据包的源IP地址,如果这个源地址是需要建立IPSec的地址,那么它就会接受这个包,反之则会终止整个协商进程,因为站点2并不希望和不合法的对等体建立IPSec VPN。当站点2确定接收站点1发来的第一个ISAKMP数据包后,它将会回复数据包2,,告诉VPN发起方站点1,同意使用负载中的那些参数来建立连接,数据包2的抓包如下,可以看到站点2使用另一个唯一的SPI值:

img

由于IPSec只规定了框架,没有规定具体使用的协议,所以通信双方可能会支持多协议,前两个包在协商这些具体使用协议的大概过程如下:

img

站点2接收方首先使用本地策略Policy10,来检查对方发过来的全部策略,如果不匹配就由下一个有线的策略来检查,直到找到一个匹配的策略为止。有了这些结果,在后续交换数据包3-6的时候,就可以使用1-2数据包协商好的策略来进行处理了。

第三、四个包

img

前两个数据包已经协商出了IKE策略,但仅仅使用上面协商好的加密策略和散列函数来保护IKE还缺一个重要的内容,密钥。加密和HMAC都需要使用秘钥,这个密钥如何产生呢?从DH交换中使用Diffie-Hellman算法产生。所以3-4个数据包开始交换DH密钥,上图中的Payload中就是交换的参数。

站点2也会发送它关于DH算法所需要交换的参数:

img

交互完DH所需要的参数后,两端使用DH算法计算出了加密和HMAC处理 IKE信息的密钥,加密感兴趣流的密钥也是从这个密钥衍生出来的,可以说是所有密钥的始祖。

第五、六个包

img

img

第五、六个数据包用来在安全的环境下进行认证,从IKE主模式的第五、第六个数据包开始以后,都会使用之前几个数据包协商出来的加密与HMAC算法进行安全保护,所以抓包中看不到具体的内容。前面的1-4个包的交换,只是在为IKE5-6包做认证铺垫,其中1-2是为认证做好策略(比如认证策略,加密策略和散列函数等),3-4包提供密钥以供后面使用。

6个数据包交换完毕后,IKE 阶段1的主模式已经完成,开始阶段2。

阶段2

img

第二阶段总是使用三个数据包的交换来完成,主要目的是根据需要加密的实际流量(感兴趣流),来协商保护这些流量的策略,第二阶段协商的结果就是IPSec SA,比如使用AH还是ESP,使用Transport还是Tunnel,使用哪种加密\认证算法,DH如何交换,生存周期为多久。在阶段2中建立IPSec Tunnel的方式只有快速模式(Quick mode),抓包如下:

img

第一个及第二个数据包主要协商HASH值,SA提案,IPSec转换机,密钥材料以及感兴趣流;

第三个包为,HASH用于确认隧道建立,只是确认而已。

ESP&AH

img

IPSec通过在数据包中插入一个预定义头部的方式,来保障OSI上层协议数据的安全,主要用于保护网络层(IP)数据,因此它提供了网络层的安全性。从上图中可以看出,IPSec在原始的IP头部和IP负载之间加入了一个IPSec头部,这样可以对原始的IP负载实现加密,同时还可以实现对IPSec头部和原始IP负载的验证,以确保数据的完整性。这个头部用来告诉接收方,如何去解密,如果加密没有头部,那么接收方收到以后会一脸懵逼,不知道应该如何去解密。

IPSec有两种头部也就是两种协议,可以将他们理解为是协议,但更严格的来说,是两种嵌入数据中的报头,它们分别是ESP和AH:

AH

AH全称为Authentication Header,它是一个基于IP的传输层协议,协议号为51,通过添加一个根据数据段中的值所计算出来的AH报头,对数据段的全部或部分内容进行认证(AH is a protocol that provides authentication of either all or part of the contents of a datagram through the addition of a header that is calculated based on the values in the datagram. )。AH只提供了身份验证机制,可以提供数据完整性验证(Data Integrity)、数据源身份认证(Data Origin Authentication)以及可选的对重放攻击的保护(未认证用户大量且反复的发送数据)。数据完整性验证由算法生成的摘要来确保,比如HMAC-MD5或HMAC-SHA算法;数据源身份验证由共享密钥生成的信息摘要确保;重放攻击防护由AH头部的序列号字段来提供保护。AH对IP报头和它的负载提供了完整性校验,但某些字段可能在传输过程中出现合理的变化,比如TTL字段。但AH不提供保密性,也就是说它不会对数据进行加密,数据可以被读取但禁止修改。AH由于无法加密使得它在现网中出现的几率不大。

AH提供身份认证,它起作用的方式和CRC校验有点类似,CRC使用固定的算法,根据传输数据的内容计算出一个校验值,这个校验值随着原始数据一起发送给接收端,接收端会重新计算一遍,如果计算结果和发送端计算的不同,那么说明数据在传输过程中被更改了,这个数据会被丢弃。AH和上面的概念有点像,不过AH不像CRC一样只用一个简单的算法来验证,而是使用一个特定的哈希算法以及特定的密钥(这个密钥只有通信的发送方和接收方知道),两个设备协商出来的SA会决定这些信息,以便两边设备知道如何计算出‘校验值’而其他设备无法计算出这个值。在信息的发送端,AH完成完整性校验并计算出ICV(Integrity Check Value,完整性校验值),并将这个值放入报头中的Authentication Data部分,然后发给接收端。接收端收到以后会用同样的算法以及两设备之间共享的密钥进行计算,如果计算出的值和发送端相同,则表明数据未经篡改,如果计算出的值不同则表示数据被更改了。

AH协议的完整性验证范围为整个IP报文。

报头格式

img

img

  • Next Header:下一个报头,使用IP协议ID来标识IP负载。例如TCP数据中,传输模式值为6表示下一个报头为IP报头;

img

img

  • Payload Length:负载长度,表示AH报头的长度;

  • Reserved:保留字段,设置为全0;

  • SPI:Security Parameter Index,安全索引,与目标地址及安全协议(也就是AH)组合使用,以确保通信的正确安全关联,接收方用SPI确定这个数据包是使用哪一个安全关联的;

  • Sequence Number:序列号,这是一个计数器性质的字段,标识通过SA所发送的数据包的数量。当两个设备之间的SA建立之初,值为0,随着使用该SA传输数据的增加,该值一起增加。该字段唯一标识了SA上的数据段,用来防止重放攻击;

  • Authentication Data:认证数据,该字段包含了AH协议所执行的哈希算法的结果,也就是完整性检查值(Integrity Check Value,ICV);

img

img

ESP

上边提到的AH可以提供数据完整性校验,但在现网中仅仅有数据完整性校验是不够的,我们还需要防止中间设备获取通信的内容,也就是保证通信的私密性,这点AH无法做到,所以需要使用ESP协议。

ESP全称为Encapsulating Security Payload,也是基于IP的传输层协议,协议号为50,ESP不仅提供了认证功能(包含数据完整性验证、数据源身份认证以及重放攻击保户),相比AH来说,ESP还额外提供了数据私密性(通过加密算法)。其中数据完整性由MD5或SHA这种验证完整性的算法通过生成消息摘要来确保;数据源认证,由共享密钥创建的消息摘要确保;重放攻击保户,由AH头部中的序列号确保;

ESP也可以值提供以上所有的功能,也可以单独提供其中的一个或两个功能,比如只提供数据私密性功能,或者只提供认证功能,或者同时提供数据私密性和认证功能。

报文格式

img

img

  • SPI:全称为Security Parameters Index,安全参数索引,用于唯一标识IPSec SA;

  • Sequence Number:序列号,是一个从1开始的单项递增的计数器,唯一的标识每一个数据包,用于防止重放攻击,因为收到相同序列号的数据包可以直接丢弃;

  • ESP Payload Data:包含由下一头部字段给出的边长数据;

  • Padding:填充字段,用于增加ESP报文头部的位数,填充字段的长度与负载数据的长度和算法油管,当待加密报文的明文长度不是密文算法所要求的长度时,需要进行填充补齐;

  • Pad Length:填充长度,给出前面填充字段的长度,如果为0时表示没有填充;

  • Next Header:标识ESP报文后面的下一个负载类型,传输模式下,这个字段是被保护的上层协议(TCP或UDP)的编号,隧道模式下,是IP协议的编号;

  • ESP Authentication Data:认证数据,该字段包含完整性校验值ICV,用于接收方进行完整性校验,可选择的认证算法与AH的相同。ESP的验证功能是可选的,如果启动了数据包验证,会在加密数据的尾部添加一个ICV值;

img

AH VS ESP

img

IPSec两种模式

IPSec共有两种模式,Transport模式和Tunnel模式,选择不同的模式不会对插入的报头有任何影响,但不同的模式会中,受到保护的部分不同,并且也会影响报头如何进行保护。本质上来说,模式是不是用来定义AH或ESP如何执行操作的,而是用来定义其他构成因素的基础,比如SA(Security Associations)。

Transport Mode

基本概念

Transport模式,中文名为传输模式,在终端到终端传输的时候使用该模式,比如一个终端客户和服务器之间的通信,或者一个工作站和网关(网关被对待成另一个终端)之间的通信,在现网中,Transport模式通常在有其他Tunnel协议(比如GRE)出现的时候使用,在这种情况下,IPSec用作保护在Tunnel上的GRE流量:

img

在上图中,服务器和电脑既是实际的通信,也是实际的加密设备,这两台设备既要相互通信,也只能自己加密,所以加密点等于通信点,只要能满足加密点等于通信点的条件就可以进行Transport模式的封装。

Transport模式使用AH或ESP报头为数据提供保护,也就是IP层的Payload,IP层的载荷,Payload载荷又由TCP/UDP报头加上数据构成,在Transport模式下,不管是使用AH还是ESP报头用来保护数据,IP报头都不被保护。载荷由IPSec报头及尾部封装而成,原有的IP报头基本保持不变,不过IP protocol字段需要变为ESP(50)或AH(51),原有的IP protocol字段信息被保存在IPSec尾部中,以便接收设备进行解封装使用。

现在来看Transport模式下的数据结构,先看ESP封装,ESP报头被插到了三层报头和四层报头之间,也就是原有的IP层报头会被挪到最前端,并对protocol字段进行了少许修改,从上面这些也能看出来,Transport模式下不会对原始的IP报头进行保护或加密,因为IP报头在ESP报头前面,没有被ESP所‘包含’。ESP在新的IP报头中,被识别为Protocol ID,50。Transport模式下,传输层报头、传输层负载、ESP尾部被加密,ESP头部、传输层报头、传输层负载和ESP尾部进行验证处理。

img

img

接下来看Transport模式下使用AH报头,当使用Transport模式时,AH可以独立适用,也可以和ESP一起使用,AH的作用是保护整个数据包,和前面提到的ESP的Transport模式差不多,在Transport模式下使用AH报头的数据,也没有重新生成新的IP报头,而是将IP报头中的Protocol ID字段改为51,表示后面跟着的协议为AH,然后将AH报头插入在IP报头和传输层报头之间。

img

img

img

判断方法

通信点地址和加密点地址相同;通信点地址可以被路由。

Tunnel Mode

基本概念

Tunnel模式是默认模式,使用该模式的时候,IPSec会保护整个IP数据包,这意味着IPSec会将原始数据封装起来进行加密,然后加上新的IP报头,再将全新封装好的数据通过VPN Tunnel发送到另一边。

Tunnel模式主要用在网关之间的通信或者终端和网关之间的通信(这时网关充当它背后主机的代理):

img

比如上图中,分支站点有一台电脑要通过站点到站点的IPSecVPN来访问中心站点的服务器,这两台电脑就是通信点,而真正对数据进行加密的设备时两个站点连接互联网的路由器,假设分支站点点路由器获取的互联网地址为202.101.1.1,中心站点的互联网地址为62.128.2.1,那么路由器的这两个地址就是加密点。很明显加密点不等于通信点,这时就应该采用Tunnel模式来对数据进行封装。

在Tunnel模式下,IPSec报头(ESP或AH报头)用来保护已经封装好的完整的IP数据包。IPSec报头插入在原始的IP报头前面,并且会在IPSec的报头前,再插入一个新的IP报头,也就是说,原始的IP报头不会暴露在网络中,也是安全的,然后原始的IP报头会被封装在另一个IP数据包中。如果使用ESP的话,新的IP报头中的Protocol ID字段为50;如果使用AH的话,新的IP报头中的Protocol ID字段为51。

img

img

img

img

判断方法

通信点地址和加密点地址不同;通信点地址到Internet不能被路由则肯定是隧道模式。

两者比较

Tunnel模式会将原始的IP数据包看成一个整体,并将这个包含了原始IP报头的整体进行保护;而Transport模式则不会保护原始的IP报头,因此一般而言,报头的顺序如下:

  • Transport模式:IP报头、IPSec报头(AH或ESP)、IP层负载(包含了传输层报头);
  • Tunnel模式:新IP报头、IPSec报头(AH或ESP)、旧的IP报头、IP层负载;

SOLUTION:

Tunnel mode:

  • Tunnel mode protects the internal routing information by encrypting the IP header of the original packet. The original packet is encapsulated by a another set of IP headers.

  • It is widely implemented in site-to-site VPN scenarios.

  • NAT traversal is supported with the tunnel mode.

  • Additional headers are added to the packet; so the payload MSS is less.

Transport mode:

  • The transport mode encrypts only the payload and ESP trailer; so the IP header of the original packet is not encrypted.

  • The IPsec Transport mode is implemented for client-to-site VPN scenarios.

  • NAT traversal is not supported with the transport mode.

  • MSS is higher, when compared to Tunnel mode, as no additional headers are required.

  • The transport mode is usually used when another tunneling protocol (such as GRE, L2TP) is used to first encapsulate the IP data packet, then IPsec is used to protect the GRE/L2TP tunnel packets.

从安全性来讲,隧道模式优于传输模式,它可以完全的对原始IP数据包进行验证和加密,隧道模式下隐藏内部IP地址,协议类型和端口;

从性能来讲,隧道模式因为有一个额外的IP头,所以它将比传输模式占用更多的带宽。

加密

对称密钥算法和非对称密钥算法各自都有相应的优缺点,对称密钥算法加密速度快,但密钥不好管理,且分发密钥的过程不安全,一旦密钥被窃取就完蛋了;非对称密钥算法密钥数量少,分发方便且不存在安全隐患,但加密速度奇慢无比,不可能用于大流量数据的加密。所以在实际使用加密算法的时候,一般会让两种算法共同工作,发挥其各自的优点。

发送方

img

简单来说就是首先使用对称密钥加密明文,得到密文;然后使用非对称密钥算法(用对端的公钥),加密上一步的密钥(对称加密算法的密钥)得到密钥包。

具体步骤如下:

  1. 用户1,也就是发起方,使用本地随机数产生器,产生用于对称密钥算法的随机密钥。如果使用的对称密钥算法是DES(DES的密钥长度为56bit),也就是说随机数产生器需要产生随机的56个数字,比如‘00011101011000100101….’用于加密数据;

  2. 使用步骤1产生的随机密钥,对重要的明文信息通过对称加密算法进行加密,得到密文,这个过程利用了对称加密算法速度快和加密后数据紧凑的特点;

  3. 用户1,也就是发起方,需要预先获取用户2,也就是接收方的公钥,并使用用户2的公钥,对步骤1产生的随机密钥进行加密,得到加密的密钥包;

  4. 将上两个步骤产生的密文和密钥包进行打包,一起发给接收方。

接收方

img

大概步骤是,使用自己的私钥从密钥包中得到明文的对称密钥,然后用对称密钥解密密文,得到明文数据。

  1. 用户2首先提取出密钥包,并且使用自己的私钥对它进行解密,并得到密钥,这个密钥是明文的密钥。这个明文密钥之所以使用非对称密钥算法进行交换,能够有效的防止密钥在中途被劫持;
  2. 用户2提取出密文,然后用上一个步骤中得到的密钥解密,得到明文信息。

总结

在这个解决方案中,使用了对称密钥算法对实际传输的数据进行了加密,利用的是对称算法加密速度快、加密后数据紧凑的特点。同时也使用了非对称式加密算法,加密的是对称式加密算法的密钥,从而保证了密钥交换的安全性,利用的是非对称式加密算法不怕中途劫持的特点,因为即使被中途劫持了,劫持者没有私钥依旧无法对数据进行解密,没法获取数据实际的明文内容。

GRE&IPSec

由于IPSec不支持IP协议的封装,不支持多上层协议,也不支持组播,但GRE支持多种上层协议、支持组播(意味着可以运行组播类协议,比如OSPF等动态路由协议)和QOS。所以GRE Over IPSec可以使得GRE和IPSec优势互补,通过GRE将组播、广播和非IP报文封装成普通的IP报文,通过IPSec为封装后的IP报文提供安全的通信,进而可以提供在总部和分支之间安全传送广播、组播业务,例如视频会议或动态路由协议报文等。

可以使用GRE over IPSec或IPSec over GRE两种方式来封装。当网关之间采用GRE Over IPSec连接时,先进性GRE封装,再进行IPSec封装。GRE Over IPSec使用的封装模式,可以是隧道模式也可以是传输模式,因为隧道模式和传输模式相比增加了IPSec头,导致报文长度更长,更容易导致分片,所以更推荐采用传输模式GRE Over IPSec。

IPSec over GRE的封装方式现网中很少用到,这里就不展开讲了。

img

GRE over IPSec也有Tunnel和Transport两种模式,默认是Tunnel模式,IPSec会创建一个Tunnel的新IP头;在Transport模式下,IPSec会使用GRE的原有IP报头:

img

img

img

GRE over IPSec就是IPSec在最外层,或者叫最底层,也就是在R1和R2之间建立IPSec tunnel,把里面的GRE Tunnel整个进行加密。over是在…..只上的意思,IPSec在最底层,GRE 在IPSec的基础上运行所以叫GRE over IPSec。路由协议在GRE tunnel完成路由交换,所有数据在GRE Tunnel中传送,因为整个GRE Tunnel被加密,所以里面的路由协议以及传输的数据都会被加密。

img

其他重要概念

Security Policies

Security Parameter Index

IPSec实验

img

实验需要配置R4和R5之间的Site to Site IPSec VPN。R4、R5为两台主机,网关为R2\R3的E0/0接口。

基础配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
R2:
interface Ethernet0/0
ip address 192.168.1.254 255.255.255.0
!
interface Ethernet0/1
ip address 12.1.1.2 255.255.255.0
!
ip route 0.0.0.0 0.0.0.0 12.1.1.1




R3:
interface Ethernet0/0
ip address 192.168.2.254 255.255.255.0
!
interface Ethernet0/2
ip address 13.1.1.3 255.255.255.0
!
ip route 0.0.0.0 0.0.0.0 13.1.1.1




确保两边可以ping通:
R2#ping 13.1.1.3
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 13.1.1.3, timeout is 2 seconds:
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max = 1/1/1 ms

初始化IPSec

在前面介绍IPSec总体流程时说过,第一个阶段是初始化,也就是激活ISAKMP,思科设备默认已经激活,配置命令是‘crypto isakmp enable’

设置IKE Phase 1

阶段1主要协商ISAKMP SA的相关参数,因为IPSec只规定了框架,没有规定具体使用的协议且支持多协议,因此需要协商通信双方使用的协议,只有使用了相同的协议才能正常进行加解密、认证等步骤,为阶段2做准备。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
R2:
crypto isakmp policy 10
#进入配置ISAKMP模式,每个policy由后边所配置的序号唯一标识

encryption aes
#设置加密算法,默认为DES

hash md5
#设置完整性校验的散列算法

authentication pre-share
#一阶段第5-6个包,认证方式为预共享密钥

group 2
#一阶段第3-4个包,DH交换使用Group2

lifetime 30000
设置生存周期,默认为一天,86400秒


R3:
crypto isakmp policy 10
encryption aes
hash md5
authentication pre-share
group 2
lifetime 30000

设置IKE Phase 2

在阶段2,其他安全协议会使用阶段1建立好的ISAKMP SA来为自己建立SA,这个阶段建立的才是‘真正的’SA安全关联,因为这个SA才是用来给ESP\AH使用,用来保护那些需要传输的数据的。这个阶段需要协商一些参数:

  • 使用哪种IPSec的协议,是AH还是ESP;

  • 使用哪种封装模式,是Transport模式还是Tunnel模式;

  • 使用哪种加密算法,是DES、3DES还是AES;

  • 使用哪种认证方式,是MD5还是SHA;

  • 生存周期为多久,也就是IKE阶段2存在的时间是多久,当隧道将要过期时,会更换另一套密钥;

  • DH交换(可选),DH交换用来确保‘完全向前保密’,这个步骤可选,大概过程是强迫通信两端再次进行DH交换,为IKE第二阶段生成一个新的密钥,能更好的确保通信时的安全;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
R2(config)#crypto ipsec transform-set TS ?
ah-md5-hmac AH-HMAC-MD5 transform
ah-sha-hmac AH-HMAC-SHA transform
comp-lzs IP Compression using the LZS compression algorithm
esp-3des ESP transform using 3DES(EDE) cipher (168 bits)
esp-aes ESP transform using AES cipher
esp-des ESP transform using DES cipher (56 bits)
esp-md5-hmac ESP transform using HMAC-MD5 auth
esp-null ESP transform w/o cipher
esp-seal ESP transform using SEAL cipher (160 bits)
esp-sha-hmac ESP transform using HMAC-SHA auth

设置转换集并进入转换集配置模式,转换集(transform-set)是一个双方使用的安全协议以及安全算法的集合,包含了阶段2协商好的那些协议。



R2(config)#crypto ipsec transform-set TS esp-3des ah-sha-hmac
R3(config)#crypto ipsec transform-set TS esp-3des ah-sha-hmac

设定Pre-share key

设定

1
2
3
4
5
6
7
8
R2(config)#crypto isakmp key 6 ccie address 13.1.1.3


R3(config)#crypto isakmp key 6 ccie address 12.1.1.2



6表示密码传输是以密文形式,ccie是预共享密钥,12.1.1.2和13.1.1.3是需要共享密钥的地址

设置感兴趣流

所谓的感兴趣流(Interesting Traffic)就是需要通过VPN保护的流量,在本例中,R1的Interesting Traffic就是由192.168.1.0/24到192.168.2.0/24的流量,而R2正好相反,是从192.168.2.0/24到192.168.1.0/24的,用Access-list将这些流量匹配好。

1
2
3
4
5
6
7
8
9
10
R2:
ip access-list extended VPN-TRAFFIC
permit ip 192.168.1.0 0.0.0.255 192.168.2.0 0.0.0.255




R3:
ip access-list extended VPN-TRAFFIC
permit ip 192.168.2.0 0.0.0.255 192.168.1.0 0.0.0.255

设置Crypto Map

将刚才设置的参数,都整合放入Crypto Map中,然后在接口上调用这个Map,从接口发出的数据就会使用设置好的IPSec 进行加密:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
R2(config)#crypto map CMAP 1 ipsec-isakmp
% NOTE: This new crypto map will remain disabled until a peer
and a valid access list have been configured.
R2(config-crypto-map)#set peer 13.1.1.3
R2(config-crypto-map)#set transform-set TS
R2(config-crypto-map)#match address VPN-Traffic
R2(config-crypto-map)#exit
R2(config)#interface ethernet 0/1
R2(config-if)#crypto map CMAP



R3(config)#crypto map CMAP 1 ipsec-isakmp
% NOTE: This new crypto map will remain disabled until a peer
and a valid access list have been configured.
R3(config-crypto-map)#set peer 12.1.1.2
R3(config-crypto-map)#set transform-set TS
R3(config-crypto-map)#match address VPN-Traffic
R3(config-crypto-map)#exit
R3(config)#interface ethernet 0/0
R3(config-if)#crypto map CMAP

验证测试

1
2
3
4
5
R4#ping 192.168.2.1
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 192.168.2.1, timeout is 2 seconds:
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max = 1/1/1 ms

img

从抓包中能看到,无法知道具体传输了什么内容,只知道Payload是ESP。

查看第一阶段建立

1
2
3
4
R2#show crypto isakmp sa
IPv4 Crypto ISAKMP SA
dst src state conn-id status
13.1.1.3 12.1.1.2 QM_IDLE 1001 ACTIVE

查看第二阶段建立

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
R2#show crypto ipsec sa

interface: Ethernet0/1
Crypto map tag: CMAP, local addr 12.1.1.2

protected vrf: (none)
local ident (addr/mask/prot/port): (192.168.1.0/255.255.255.0/0/0)
remote ident (addr/mask/prot/port): (192.168.2.0/255.255.255.0/0/0)
current_peer 13.1.1.3 port 500
PERMIT, flags={origin_is_acl,}
#pkts encaps: 9, #pkts encrypt: 9, #pkts digest: 9
#pkts decaps: 9, #pkts decrypt: 9, #pkts verify: 9
#pkts compressed: 0, #pkts decompressed: 0
#pkts not compressed: 0, #pkts compr. failed: 0
#pkts not decompressed: 0, #pkts decompress failed: 0
#send errors 0, #recv errors 0

local crypto endpt.: 12.1.1.2, remote crypto endpt.: 13.1.1.3
plaintext mtu 1438, path mtu 1500, ip mtu 1500, ip mtu idb Ethernet0/1
current outbound spi: 0x36EDBC65(921549925)
PFS (Y/N): N, DH group: none

inbound esp sas:
spi: 0x7809602A(2013880362)
transform: esp-3des ,
in use settings ={Tunnel, }
conn id: 5, flow_id: SW:5, sibling_flags 80000070, crypto map: CMAP
sa timing: remaining key lifetime (k/sec): (4251466/3356)
IV size: 8 bytes
replay detection support: Y
Status: ACTIVE(ACTIVE)

inbound ah sas:
spi: 0x8C299743(2351535939)
transform: ah-sha-hmac ,
in use settings ={Tunnel, }
conn id: 5, flow_id: SW:5, sibling_flags 80000070, crypto map: CMAP
sa timing: remaining key lifetime (k/sec): (4251466/3356)
replay detection support: Y
Status: ACTIVE(ACTIVE)

inbound pcp sas:

outbound esp sas:
spi: 0x27E3BDAF(669236655)
transform: esp-3des ,
in use settings ={Tunnel, }
conn id: 6, flow_id: SW:6, sibling_flags 80000070, crypto map: CMAP
sa timing: remaining key lifetime (k/sec): (4251466/3356)
IV size: 8 bytes
replay detection support: Y
Status: ACTIVE(ACTIVE)

outbound ah sas:
spi: 0x36EDBC65(921549925)
transform: ah-sha-hmac ,
in use settings ={Tunnel, }
conn id: 6, flow_id: SW:6, sibling_flags 80000070, crypto map: CMAP
sa timing: remaining key lifetime (k/sec): (4251466/3356)
replay detection support: Y
Status: ACTIVE(ACTIVE)

outbound pcp sas:

GRE over IPSec实验

img

本实验需要在R1和R2这两个站点之间建立GRE隧道Tunnel0,Tunnel的网段为172.16.12.0/24,另外还需要在GRE隧道上运行OSPF,使得两个站点通过动态路由协议学习到身后网络的路由,1.1.1.0/24和2.2.2.0/24,最后配置IPSec VPN,对两个站点之间的GRE流量进行加密。

基础设置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
R1:
hostname R1
!
interface Loopback0
ip address 1.1.1.1 255.255.255.0
!
interface Ethernet1/0
ip address 192.168.13.1 255.255.255.0
!
ip route 0.0.0.0 0.0.0.0 192.168.13.3



R2:
hostname R2
!
interface Loopback0
ip address 2.2.2.2 255.255.255.0
!
interface Ethernet1/0
ip address 192.168.23.2 255.255.255.0
!
ip route 0.0.0.0 0.0.0.0 192.168.23.3




R3:
hostname R3
!
interface Ethernet1/0
ip address 192.168.13.3 255.255.255.0
!
interface Ethernet1/1
ip address 192.168.23.3 255.255.255.0



验证确保只有192.168.13.1 能 Ping 通 192.168.23.2:
R1(config)#do ping 192.168.23.2
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 192.168.23.2, timeout is 2 seconds:
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max = 1/1/1 ms


R1#ping 2.2.2.2 source 1.1.1.1
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 2.2.2.2, timeout is 2 seconds:
Packet sent with a source address of 1.1.1.1
.....
Success rate is 0 percent (0/5)

配置GRE隧道

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
R1:
interface Tunnel0
ip address 172.16.12.1 255.255.255.0
tunnel source Ethernet0/0
tunnel destination 192.168.23.2




R2:
interface Tunnel0
ip address 172.16.12.2 255.255.255.0
tunnel source Ethernet0/0
tunnel destination 192.168.13.1



测试GRE隧道:
R1#ping 172.16.12.2
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 172.16.12.2, timeout is 2 seconds:
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max = 1/1/1 ms

配置路由协议

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
R1:
router ospf 1
router-id 1.1.1.1
network 1.1.1.1 0.0.0.0 area 0
network 172.16.12.1 0.0.0.0 area 0




R2:
router ospf 1
router-id 2.2.2.2
network 2.2.2.2 0.0.0.0 area 0
network 172.16.12.2 0.0.0.0 area 0



R1#show ip ospf nei

Neighbor ID Pri State Dead Time Address Interface
2.2.2.2 0 FULL/ - 00:00:39 172.16.12.2 Tunnel0




R1#show ip route ospf
Codes: L - local, C - connected, S - static, R - RIP, M - mobile, B - BGP
D - EIGRP, EX - EIGRP external, O - OSPF, IA - OSPF inter area
N1 - OSPF NSSA external type 1, N2 - OSPF NSSA external type 2
E1 - OSPF external type 1, E2 - OSPF external type 2
i - IS-IS, su - IS-IS summary, L1 - IS-IS level-1, L2 - IS-IS level-2
ia - IS-IS inter area, * - candidate default, U - per-user static route
o - ODR, P - periodic downloaded static route, H - NHRP, l - LISP
a - application route
+ - replicated route, % - next hop override, p - overrides from PfR

Gateway of last resort is 192.168.13.3 to network 0.0.0.0

2.0.0.0/32 is subnetted, 1 subnets
O 2.2.2.2 [110/1001] via 172.16.12.2, 00:01:17, Tunnel0

通过show命令可以看到R1和R2之间建立了邻居关系,并且学到了对方身后的Loopback网段的路由。

设置感兴趣流

由于目标是要将整个Interface加密,因此设置ACL用来匹配感兴趣流

1
2
3
4
R1(config)#ip access-list extended IPSEC_TUNNEL 
R1(config-ext-nacl)#permit ip host 192.168.13.1 host 192.168.23.2
R2(config)#ip access-list extended IPSEC_TUNNEL
R2(config-ext-nacl)#permit ip host 192.168.23.2 host 192.168.13.1

设置IPSec

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
R1(config)#crypto isakmp key ccie address 192.168.23.2
R1(config)#crypto isakmp policy 10
R1(config-isakmp)#encryption aes
R1(config-isakmp)#authentication pre-share
R1(config-isakmp)#group 2
R1(config-isakmp)#exit
R1(config)#crypto ipsec transform-set TS esp-3des
R1(cfg-crypto-trans)#exit
R1(config)#crypto map GRE_OVER_IPSEC 10 ipsec-isakmp
R1(config-crypto-map)#set peer 192.168.23.2
R1(config-crypto-map)#set transform-set TS
R1(config-crypto-map)#match address IPSEC_TUNNEL
R2(config)#crypto isakmp key ccie address 192.168.13.1
R2(config)#crypto isakmp policy 10
R2(config-isakmp)#encryption aes
R2(config-isakmp)#authentication pre-share
R2(config-isakmp)#group 2
R2(config-isakmp)#exit
R2(config)#crypto ipsec transform-set TS esp-3des
R2(cfg-crypto-trans)#exit
R2(config)#crypto map GRE_OVER_IPSEC 10 ipsec-isakmp
R2(config-crypto-map)#set peer 192.168.13.1
R2(config-crypto-map)#set transform-set TS
R2(config-crypto-map)#match address IPSEC_TUNNEL

将IPSec应用到接口

1
2
3
4
R1(config)#int ethernet 1/0
R1(config-if)#crypto map GRE_OVER_IPSEC
R2(config)#int ethernet 1/0
R2(config-if)#crypto map GRE_OVER_IPSEC

验证配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
R1#ping 2.2.2.2 source 1.1.1.1
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 2.2.2.2, timeout is 2 seconds:
Packet sent with a source address of 1.1.1.1
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max = 2/5/6 ms




R1#show crypto isakmp sa
IPv4 Crypto ISAKMP SA
dst src state conn-id status
192.168.23.2 192.168.13.1 QM_IDLE 1001 ACTIVE

IPv6 Crypto ISAKMP SA





R1#show crypto ipsec sa

interface: Ethernet0/0
Crypto map tag: GRE_OVER_IPSEC, local addr 192.168.13.1

protected vrf: (none)
local ident (addr/mask/prot/port): (192.168.13.1/255.255.255.255/0/0)
remote ident (addr/mask/prot/port): (192.168.23.2/255.255.255.255/0/0)
current_peer 192.168.23.2 port 500
PERMIT, flags={origin_is_acl,}
#pkts encaps: 294, #pkts encrypt: 294, #pkts digest: 294
#pkts decaps: 294, #pkts decrypt: 294, #pkts verify: 294
#pkts compressed: 0, #pkts decompressed: 0
#pkts not compressed: 0, #pkts compr. failed: 0
#pkts not decompressed: 0, #pkts decompress failed: 0
#send errors 0, #recv errors 0

local crypto endpt.: 192.168.13.1, remote crypto endpt.: 192.168.23.2
plaintext mtu 1462, path mtu 1500, ip mtu 1500, ip mtu idb Ethernet0/0
current outbound spi: 0x9E692FBE(2657693630)
PFS (Y/N): N, DH group: none

inbound esp sas:
spi: 0x1EF8F00(32476928)
transform: esp-3des ,
in use settings ={Tunnel, }
conn id: 1, flow_id: SW:1, sibling_flags 80004040, crypto map: GRE_OVER_IPSEC
sa timing: remaining key lifetime (k/sec): (4236140/882)
IV size: 8 bytes
replay detection support: N
Status: ACTIVE(ACTIVE)

inbound ah sas:

inbound pcp sas:

outbound esp sas:
spi: 0x9E692FBE(2657693630)
transform: esp-3des ,
in use settings ={Tunnel, }
conn id: 2, flow_id: SW:2, sibling_flags 80004040, crypto map: GRE_OVER_IPSEC
sa timing: remaining key lifetime (k/sec): (4236140/882)
IV size: 8 bytes
replay detection support: N
Status: ACTIVE(ACTIVE)

outbound ah sas:

outbound pcp sas:

引用文章

GRE

Dynamic Multipoint VPN (DMVPN) 动态多点虚拟私人网络

Introduction to DMVPN

IPsec Basics

IPSec

IPSec VPN Overview

What is the difference between the AH and ESP protocols of IPSec?

AH and ESP protocols

IPSec Authentication Header (AH)

UNDERSTANDING VPN IPSEC TUNNEL MODE AND IPSEC TRANSPORT MODE - WHAT’S THE DIFFERENCE?

IPsec (Internet Protocol Security)

Internet Key Exchange

IPSec基本原理

IPSec之IKEv1协议详解

IPSec之IKEv2协议详解

How IPSec Works

An Illustrated Guide to IPsec

GRE over IPSec技术原理

GRE over IPSec vs IPSec over GRE