部署一个使用IPsec的IOS路由器要从配置ISAKMP策略和路由器的ISAKMP认证密钥数据开始。如果路由器仅仅与Site-to-Site拓扑中的另外一个路由器相连,那么ISAKMP配置就完成了。然而,如果路由器也要支持Client-to-Site,就还需要一个额外的IKE模式配置。在我们进行ISAKMP策略配置之前,我们先看一些安全性技巧:
  • 对于初学者,IOS可交换地在配置模型和EXEC模型中使用ISAKMP和IKE。记住IKE是一个支持ISAKMP的协议——ISAKMP是规则,IKE执行规则。
  • IKE监听500端口,使用UDP来协商发送和接收报文。如果你在×××路由器前部署了一个防火墙,或者你正在尝试建立一个穿越防火墙的IPsec客户端连接,这就可能出现问题。而且除非你使用UDP的500端口,否则传统的IKE将不能正常工作。
  • IKE不像Network Address Translation (NAT)。当两个IPsec节点之间使用NAT时,基于IP地址绑定的预共享密钥认证将无法工作。NAT转换修改了源地址和目标地址,结果会造成密钥与发送或接收主机的不匹配。在大多数基于有状态的防火墙使用的Port Address Translation (PAT)也会破坏IPsec连接。然而,IOS的后续版本将使用IPsec Nat透明及Cisco 通道控制协议 (cTCP)解决IPsec和NAT/PAT之间的操作问题。这两种解决方案都在IKE协商阶段中使用。NAT透明在IKE第一阶段增加了一个NAT发现阶段原件以及在第二阶段增加了一个NAT穿越工具。操作上,IPsec NAT透明将IKE移到UDP端口4500,而且在需要时将IPsec数据包封装到UDP帧中。
虽然NAT透明解决了一些问题,但它不能解决所有问题。即使有NAT透明,IPsec客户端连接也不能在有严格防火墙规则的环境中工作。如果在1024之上的UDP端口访问对原始连接关闭,客户端就不能与网关建立连接。为了解决这种环境的问题,Cisco开发了通道控制协议(Tunnel Control Protocol,cTCP)。cTCP接管NAT透明所不能解决的工作,为IKE和ESP数据包提供了TCP封装。通过cTCP的配置,IPsec网关和客户端就能够使用具体的TCP服务端口发送IPsec数据。这使得通过TCP端口80或443发送IPsec数据成为可能。这也使得我们能够更容易地打开只允许有限的网络服务穿越的网络环境中的IPsec客户端连接。
NAT透明默认是激活的,并且它也被整合成为支持这个功能的IOS版本的IKE协商过程的一部分。Cisco通道控制协议需要经过配置,它也是路由器全局加密策略的一部分。下面我们将学习将cTCP配置成为IKE模式配置的一部分的方法。
配置一个ISAKMP策略
接下来让我们看看配置一个ISAKMP策略的各个细节。我们从最基本步骤开始:激活路由器上的ISAKMP(和IKE):
outlan-rt02(config)#crypto isakmp enable    
outlan-rt02(config)#
Oct 13 15:09:27 EST: %CRYPTO-6-ISAKMP_ON_OFF: ISAKMP is ON
outlan-rt02(config)#
一旦ISAKMP被激活,我们需要为每一个策略实体定义五个策略参数。如果没有定义策略,一个使用所有默认值的策略将会被使用。当创建一个策略时,如果没有显式定义策略参数,默认的参数将会被使用。策略的参数及其默认值如下:
1. IKE策略加密,默认值为数据加密标准(Data Encryption Standard,DES)
2. IKE策略哈希,默认值为Secure Hash Standard-1 (SHA-1)
3. IKE密钥交换,默认值为Diffie-Hellman Group 1 (768-Bit)
4. IKE寿命,默认值为一天(86,400秒)
5. IKE认证方式,默认值为RSA公钥
你可能已经知道节点是需要与一个通用ISAKMP策略协商,以建立一个IPsec节点联系。所以根据你想要连接的设备,你可能需要多个ISAKMP策略。每一个ISAKMP策略被赋于一个唯一的1到10,000之间的优先级数。优先级数为1的策略被认为是最高优先级的策略。策略协商从策略数最接近于1的开始。通常的做法是从策略数为10的开始创建,这样做的话当你需要往生产环境的路由器中插入一个优先级更高的策略时,你才有位置可以用。
另一个关于ISAKMP策略优先级数的技巧与用于支持IPsec客户端的ISAKMP策略有关。支持IPsec客户端连接的ISAKMP策略有两个策略组件:ISAKMP策略和IKE模式配置策略。如果路由器准备支持IPsec网关和IPsec客户端之间的节点关系,这种支持“客户端”的ISAKMP策略应该有最低的优先级。这样就可以避免网关到网关请求用户名和密码信息的IKE协商。(在IOS的后续版本中,可以通过在一个预共享密钥定义末尾添加no-xauth来覆载)。现在,让我们继续创建一个策略:
outlan-rt02(config)#crypto isakmp policy 10
我们需要定义的第一个参数是加密算法。IOS支持两种加密算法:Data Encryption Algorithm (DEA) 和 Rijndael。Data Encryption Standard (DES) 和 Triple DES (3DES)标准是基于DEA的。DES和3DES是块分组密码,它们使用一个经过56位密钥加密的64位的块。这二者之间的区别是3DES会对每一个数据块运行三次加密过程,而DES只运行一次。
Advanced Encryption Standard (AES)是基于Rijndael算法的块分组密码。AES使用一个128位块大小,以及三个密钥大小选择:126位、192位或256位。DES和3DES是旧方法,但他们都是被各种Cisco路由器平台广泛支持的,不管是在路由器逻辑板还是通过使用一个加密适配器。在一个只使用一个软件加密引擎的路由器上使用3DES是非常消耗计算资源的,并且不容易升级到多通道。IOS的后续版本是支持AES的,其中也包括了基于硬件的加密选项。AES比3DES更安全且更加高效。在软件中有限的使用AES实现是可能实现的。通常的做法是使用DES或3DES,但如果可能,就使用AES-256。
outlan-rt02(config-isakmp)#encryption 3des
下一步是定义ISAKMP哈希算法。IOS支持两种哈希协议:消息摘要算法5(Message-Digest Algorithm 5,MD5)和安全哈希算法(Secure Hash Algorithm)。MD5是一个单向哈希算法,它生成一个128位的哈希。SHA-1是公认的比这两个算法更新的算法,而这两个算法也的确有些过时了。可以期待的是IOS的后续版本将支持SHA-2,这是一个更加安全的算法,它支持4种不同的哈希长度(224、256、384和512位)。
outlan-rt02(config-isakmp)#hash sha
下面我们来定义Diffie-Hellman (DH)使用的模数。原始的RFC定义值为2;DH组1使用一个768位的模数,DH组2使用一个1024位的模数。这个数值越大,密钥就更加随机,也就更加安全了。IOS支持组1、组2和组5的DH。DH组5使用一个1536位的模数。通常的做法是使用组2,因为组5并没有在所有的IOS版本中支持,并且它也不被Cisco ×××客户端支持。另外一个需要注意的是,模数越长,CPU用来生成密钥的时间也越长。在一些较低端的路由器上,使用一个较短的DH模数更好一些。
outlan-rt02(config-isakmp)#group 2
由于还没有SA算法参数,我们需要定义SA的寿命。对于SA寿命,我们从几个方面来考虑。当一个SA过期时,一个新的SA和新的SPI就被生成或被删除。SA寿命越短就越安全。此外,SA寿命越短,路由器崩溃后的恢复和重新加载速度就越快。如果一个节点停掉了,其它节点就会启动,在一些实例中,新的SA将等到之前的SA过期后才会建立。对于支持上百个通道的网关路由器是特别明显的现象。设置一个保持活跃的ISAKMP可以大大消除这个问题,但却往往被忽略。另一方面,更长的SA寿命需要ISAKMP处理负载更小。而在不同路由器平台上,ISAKMP协商通常不是一个太大的处理负担,这样一个短的SA寿命可以用在大量节点关系的路由器上。
outlan-rt02(config-isakmp)#lifetime 300
在一个Site-to-Site的路由器配置中,我们需要定义的最后一个ISAKMP参数是认证参数。IOS支持3种认证:RSA签名、RSA现时标记和预共享密钥。使用RSA签名认证要配置路由器使用X.509基于证书的认证。这是最安全的方式,但它需要部署和管理一个证书制授权服务器。因为它有这个额外需求,这是一个最少用的方法。更多关于RSA签名的信息可以查询Cisco的网站。
RSA现时标记同样可以使用,一个RSA现时标记是一个由IKE发起者产生的随机数,并用接收者的公钥加密。使用RSA现时标记的好处是它们非常安全;而且它们不需要证书服务器。但是其缺点是节点需要拥有与其通信的所有节点的公钥。这意味着使用这个方法会出现大量的工作量。
最后一个是预共享密钥。预共享密钥是用于同时支持Site-to-Site和Client-to-Site ×××的。虽然预共享的密钥是最不安全的方法,但它们却是最常用于网关节点的认证。这是因为它们速度快并且容易设置,而且通过适当的安全性配置,在主机之间使用一个通用密钥的风险会很小。在一个IPsec客户端配置中,预共享密钥是用IKE Extended Authentication(Xauth)来管理的,这是一个使用一个用户密码加组密码的二元认证方法。组密码功能上是作为预共享密钥使用的,它是一个所有客户端和网关使用的公用值,而用户密码是唯一用于具体用户的。
我们将在后面更深入地看看如何为网关和客户端配置RSA现时标记和共享密钥配置。让我们先举例说明预共享密钥的配置方法,下面是标准的配置:
outlan-rt02(config-isakmp)#authentication pre-share
We are done with our ISAKMP configuration. Here is what our policy statement looks like:
crypto isakmp policy 10
 encr 3des
 hash sha
 lifetime 300
 authentication pre-share
 group 2
!
crypto isakmp keepalive 20 5
crypto isakmp nat keepalive 30
注意除了我们的ISAKMP策略,这里多了两个keepalive语句。这是必须作为全局加密配置命令而增加的,因为默认的IOS加密配置把keepalive服务禁用了。ISAKMP的keepalive是通过全局配置命令配置的。当ISAKMP的keepalive激活后,路由器会每隔10到3600秒发送Dead Peer Detection (DPD)消息。如果没有收到DPD的响应,路由器就会以更高频率地发送DPD消息——在2到60秒之间。如果节点路由器在高频探测激活后还不能响应,发送消息的路由器会删除这个节点的SA。命令就是在路由器支持IPsec客户端连接时使用的。如果没有收到从客户端发来的流量,一个keepalive数据包会在间隔时间到达前而流量没有发出时被发送出去。
IKE模式配置
关于IPsec客户端支持,我们来接着看IKE模式配置安装。为了支持Client-to-Site的IPsec配置,客户端要求有一个安全的IP身份。然后IPsec客户端的IP地址将被用于所有与其他由IPsec网关保护的安全主机的IP通信。IP地址分配,以及其他全部的客户端配置参数(如域名、子网掩码、DNS服务器)都定义在IKE模式策略中。IKE客户端配置依赖于ISAKMP策略定义。
outlan-rt04#config t
Enter configuration commands, one per line.  End with CNTL/Z.
outlan-rt04(config)#crypto isakmp policy 1000
outlan-rt04(config-isakmp)# encr 3des
outlan-rt04(config-isakmp)# hash md5
outlan-rt04(config-isakmp)# authentication pre-share
outlan-rt04(config-isakmp)# group 2
outlan-rt04(config-isakmp)#exit 
outlan-rt04(config)#
IKE模式配置有三个部分。第一部分是ISAKMP客户端组。这是使用命令创建的。这个命令定义了大多数的客户端配置和组策略信息,这些信息是用于支持IPsec客户端连接的。第二部分是一个客户端IP地址池的创建,IP地址是客户端配置组分配IP给客户端的地方。它是通过使用全局配置命令来创建的。最后一部分是半隧道的客户端访问策略访问控制列表(ACL)。ACL定义了可以通过IPsec客户端IP接口访问的网络。如果没有定义ACL,客户端会使用一个catch-all访问策略,它表示所有网络都应该通过IPsec客户端IP接口访问。半隧道的意思是一个IPsec客户主机可能想要通过一个“非安全”的环境访问一些IP节点,而其它的客户主机则通过一个“安全的”环境访问。这个方法的好处是通过激活半隧道,用户可以同时访问本地LAN设备和因特网,比如,使用客户端的LAN接口访问LAN服务,而不需要通过IPsec ×××网关。而它的缺点是当×××客户端激活时,主机是同时连接到非安全和安全网络的。这会带来安全资源暴露的风险。ISAKMP客户端组需要五个必要的参数来正确工作。除了基本的配置参数外,客户端组策略还可以定义许多客户端条件参数,但这根据你的IOS版本不同而有所不同。我们将在后面的Client-to-Site拓扑配置中讨论这些附加的属性。下面是客户端组定义使用的五个基本参数:
outlan-rt04(config)#crypto isakmp client configuration 
group outlan-ras
outlan-rt04(config-isakmp-group)# key outlan-ras
outlan-rt04(config-isakmp-group)# dns 172.30.40.2
outlan-rt04(config-isakmp-group)# domain outlan-ras.net
outlan-rt04(config-isakmp-group)# pool outlan-ras
outlan-rt04(config-isakmp-group)# acl outlan-ras-networks 
outlan-rt04(config-isakmp-group)#exit
outlan-rt04(config)#

crypto isakmp client configuration group outlan-ras
 key outlan-ras
 dns 172.30.40.2
 domain outlan-ras.net
 pool outlan-ras
 acl outlan-ras-networks 
一旦客户端组定义完成后,我们就需要创建IP地址池:
outlan-rt04(config)#ip local pool outlan-ras 172.30.99.10 172.30.99.100
The final step is the client access policy ACL:
outlan-rt04(config)#ip access-list extended outlan-ras-networks 
outlan-rt04(config-ext-nacl)# permit ip 172.30.40.0 0.0.0.255 172.30.99.0 0.0.0.255
技术上说我们的ISAKMP ×××客户端支持配置已经完成了。然而,如果我们想要扩展我们的×××客户端以支持连接到其它安全的主机上,我们需要配置Cisco Tunnel Control Protocol。NAT透明默认是激活的,所以激活cTCP要求更多的全局加密配置命令。这个命令的端口设置是可选的,可以设置一个端口或都不设置或者设置一个监听端口列表。如果没有设置端口,cTCP会监听端口10000。下面是监听HTTP、HTTPS和默认cTCP服务端口的cTCP配置:
outlan-rt04(config)#crypto ctcp port 443 80 10000
必须记住的一点是,当配置cTCP时,如果路由器正在运行着一个HTTP或HTTPS后台程序,IKE服务和HTTP/HTTPS服务是不能在同一个路由器接口运行的。下面是完成的ISAKMP客户端配置:
!
crypto isakmp policy 1000
 encr 3des
 hash md5
 authentication pre-share
 group 2
crypto isakmp keepalive 20 5
crypto isakmp nat keepalive 30
!
crypto isakmp client configuration group outlan-ras
 key outlan-ras
 dns 172.30.40.2
 domain outlan-ras.net
 pool outlan-ras
 acl outlan-ras-networks
!
crypto ctcp port 443 80 10000
!
ip local pool outlan-ras 172.30.99.10 172.30.99.100
!
ip access-list extended outlan-ras-networks
 permit ip 172.30.40.0 0.0.0.255 172.30.99.0 0.0.0.255
这个过程的下一步就是生成和交换预共享的RSA密钥。