【TechTarget中国原创】上一篇文章阐述了如何为Client-to-Site连接和Cisco的EzVPN创建一个VPN网关和客户端以支持Network-to-Network的VPN拓扑。本文我们将介绍实现静态Network-to-Network的IPsec链接的方法。
静态的Network-to-Network IPsec策略是给私有网络提供固定的、安全的网络连接,以便利用非安全的公共网络来传输安全的数据。在前一篇文章中,我们检查了动态建立的半隧道和全加密IPsec策略配置。类似的结构配置也适用于实现Network-to-Network安生性拓扑的静态IPsec VPN。然而,通过动态的客户端配置,策略结构差异表示了客户端与IPsec网关之间所应该安全化的流量。有了静态IPsec策略,对安全策略的操作关注点就转移到了用于交换安全数据的网络“可达性”上。这样看来,Cisco路由器的静态IPsec加密策略可以通过使用下面两种方法中任一种来实现:直接和间接传输VPN。
直接传输与间接传输VPN的比较
直接传输的方法是用来保证网络中交换的直接路由IP流量的。直接传输VPN的关键操作要素是数据的交换依赖于一个独立于IPsec安全性策略的路由寻址策略。这类似于客户端VPN半隧道策略的结构,其中具体的Network-to-Network安全性策略是定义在每一个IPsec节点上的。然后当流量穿越IPsec对等网关或转发路由器时,这些静态IPsec策略会保证特定网络之间的特定IP数据通信交换的安全。直接VPN的优点有两方面。第一,它们比间接VPN效率更高,它比传统的数据包仅仅多了28比特。第二,安全和非安全的流量同时由一个路由策略管理。
直接方法允许直接流量交换选择加密方式,而间接传输VPN方法使用一个虚拟接口来提供Network-to-Network数据交换隧道(通信链路)。间接VPN实现使用全加密模型。隧道化协议在两个公共路由器终端之间激活一个虚拟链路。然后隧道终端路由器之间会建立IPsec对待互连,接着隧道化协议流量被一个IPsec安生性策略加密。
这就是间接VPN比直接VPN更好的地方。它们使得没有任何直接IP访问链路的网络能够通过组合隧道化协议和IPsec来安全地交换数据。但是,这个功能的确需要付出一定的性能代价。间接VPN解决方案使每一个数据包增加了不止60比特,而且还要对私有和公共路由策略进行额外的管理。
在需要对现有IP网络基础结构增加更多安生性的地方,直接传输VPN是更好的选择。它们有以下几个方面好处:
- 增加应用层事务安全性或者在私有校园网或企业网中的特定网络数据交换
- 保证提供包/格/帧传输的工具上私有数据交换的安全
- 作为使用单连接通路的WAN传输替换来连接远程网络集线器

大图链接:http://media.techtarget.com/digitalguide/images/Misc/DirectVPN.jpeg
例如,如果在你的大型校园网中,有两个研究团队需要进行安全的数据交换,他们分别在大楼A和大楼D上。上图描绘了我们第一个配置例子的基本图示。如果创建一个直接的传输VPN解决方案,首先要考虑的是所需要的安全级别。在上面的图示中,IPsec策略可能被安装在网关路由器或者传输路由器上。如果要求的是LAN-to-LAN的安全,那么IPsec策略必须在网关路由器上实现。否则,如果我们只需要关注于加密离开LAN的流量,我们可以在传输路由器上实现策略。这两种情况在配置上都有一定的复杂性。它们都要求为每一条路径配置IPsec/ISAKMP节点定义。
对于我们的配置例子,我们将在对网关路由器上的流量做安全配置。IPsec配置过程有6个步骤。大楼A的配置是蓝色的,大楼D的配置是红色的。
步骤1. 定义ISAKMP(阶段1)策略:
build-a-gw1(config)#crypto isakmp policy 10 build-a-gw1(config-isakmp)# encr 3des build-a-gw1(config-isakmp)# authentication pre-share build-a-gw1(config-isakmp)# group 2 build-a-gw1(config-isakmp)# lifetime 3600
build-d-gw1(config)#crypto isakmp policy 10 build-d-gw1(config-isakmp)# encr 3des build-d-gw1(config-isakmp)# authentication pre-share build-d-gw1(config-isakmp)# group 2 build-d-gw1(config-isakmp)# lifetime 3600 |
步骤2. 定义ISAKMP策略预共享密钥:
build-a-gw1(config)# crypto isakmp key cisco123 address 0.0.0.0 0.0.0.0 build-a-gw1(config)# crypto isakmp keepalive 30 build-d-gw1(config)# crypto isakmp key cisco123 address 0.0.0.0 0.0.0.0 build-d-gw1(config)# crypto isakmp keepalive 30 |
步骤3. 创建IPsec(阶段2)转换集:
build-a-gw1(config)#$crypto IPsec transform-set direct-trans-vpn esp-3des esp-md5-hmac build-d-gw1(config)#$crypto IPsec transform-set direct-trans-vpn esp-3des esp-md5-hmac |
步骤4. 创建流量合格访问列表:
build-a-gw1(config)#ip access-list extended CRYPT build-a-gw1(config-ext-nacl)#permit ip 172.30.69.0 0.0.0.255 172.30.41.0 0.0.0.255 build-d-gw1(config)#ip access-list extended CRYPT build-d-gw1(config-ext-nacl)#permit ip 172.30.41.0 0.0.0.255 172.30.69.0 0.0.0.255 |
步骤5. 定义IPsec静态密码图:
build-a-gw1(config)#crypto map dir-trans-vpn-buld-a 10 IPsec-isakmp build-a-gw1(config-crypto-map)#set transform-set direct-trans-vpn build-a-gw1(config-crypto-map)# match address CRYPT build-a-gw1(config-crypto-map)#set peer 164.99.99.2 build-a-gw1(config-crypto-map)#set peer 164.99.99.194 build-d-gw1(config)#crypto map dir-trans-vpn-buld-d 10 IPsec-isakmp build-d-gw1(config-crypto-map)#set transform-set gre-vpn-transform build-d-gw1(config-crypto-map)#match address CRYPT build-d-gw1(config-crypto-map)#set peer 147.225.100.2 build-d-gw1(config-crypto-map)#set peer 147.225.101.66 |
步骤6. 安装静态密码图:
build-a-gw1(config)#interface FastEthernet 0/0 build-d-gw1(config-if)#crypto map dir-trans-vpn-buld-a build-a-gw1(config)#interface FastEthernet 0/1 build-a-gw1(config-if)#crypto map dir-trans-vpn-buld-a build-d-gw1(config)#interface FastEthernet 0/0 build-d-gw1(config-if)#crypto map dir-trans-vpn-buld-d build-d-gw1(config)#interface FastEthernet 0/1 build-d-gw1(config-if)#crypto map dir-trans-vpn-buld-d |
在配置创建并安装好后,你可以运行两个命令来验证操作是否正确。第一个命令是:<show crypto isakmp sa>,它可以验证路由器上ISAKMP的状态:
build-a-gw1#sh crypto isakmp sa IPv4 Crypto ISAKMP SA dst src state conn-id slot status 147.225.100.2 164.99.99.2 QM_IDLE 2073 0 ACTIVE build-d-gw1# sh crypto isakmp sa IPv4 Crypto ISAKMP SA dst src state conn-id slot status 164.99.99.2 147.225.100.2 QM_IDLE 2071 0 ACTIVE |
根据Cisco文档,ISAKMP有8个状态:
- MM_NO_STATE:Internet Security Association and Key Management Protocol (ISAKMP)安全关联(SA)已经创建,但其余的都还没有配置。
- MM_SA_SETUP:节点已经确定了ISAKMP SA参数。
- MM_KEY_EXCH:节点已经交换了Diffie-Hellman公钥,并生成了一个共享密钥。ISAKMP SA仍然未认证。
- MM_KEY_AUTH:ISAKMP SA已经通过认证。如果路由器初始化了这个交换,这个状态会马上转变到QM_IDLE,然后快速模式(Quick Mode)的交换开始。
- AG_NO_STATE:ISAKMP SA已经创建,但其余的都还没有配置。
- AG_INIT_EXCH:节点已经完成了积极模式(Aggressive Mode)的第一次交换,但SA还没有通过认证。
- AG_AUTH:ISAKMP SA已经通过认证。如果路由器初始化了这个交换,这个状态马上转变到QM_IDLE,然后快速模式(Quick Mode)交换开始。
- • QM_IDLE:ISAKMP SA挂起。它保持与节点的认证状态,可能会被用于后面的快速模式(Quick Mode)交换。
一个正确配置和激活的ISAKMP节点将位于QM_IDLE状态。如果一个节点的ISAKMP状态不是QM_IDLE,那么或者是配置有错误,或者是路由器正在建立ISAKMP对等操作。另一个简单的命令是<show crypto IPsec sa>:
build-a-gw1#show crypto IPsec sa interface: FastEthernet0/0 Crypto map tag: dir-trans-vpn-buld-a , local addr 147.225.100.2 protected vrf: (none) local ident (addr/mask/prot/port): (147.225.11.0/255.255.255.0/0/0) remote ident (addr/mask/prot/port): (164.99.14.0//255.255.255.0/0/0) current_peer 164.99.99.2 port 500 PERMIT, flags={origin_is_acl,} #pkts encaps: 1711, #pkts encrypt: 1711, #pkts digest: 1711 #pkts decaps: 291, #pkts decrypt: 291, #pkts verify: 291 #pkts compressed: 0, #pkts decompressed: 0 #pkts not compressed: 0, #pkts compr. failed: 0 #pkts not decompressed: 0, #pkts decompress failed: 0 #send errors 2, #recv errors 0 local crypto endpt.: 147.225.100.2, remote crypto endpt.: 164.99.99.2 path mtu 1500, ip mtu 1500, ip mtu idb FastEthernet0/0 current outbound spi: 0x0(0) inbound esp sas: spi: 0x9DD44A4(165495972) transform: esp-3des esp-md5-hmac , in use settings ={Tunnel, } conn id: 141, flow_id: AIM-VPN/SSL-1:141, crypto map: dir-trans-vpn-buld-a sa timing: remaining key lifetime (k/sec): (4545643/2916) IV size: 8 bytes replay detection support: Y Status: ACTIVE inbound ah sas: inbound pcp sas: outbound esp sas: spi: 0xDD5316D7(3713210071) transform: esp-3des esp-md5-hmac , in use settings ={Tunnel, } conn id: 142, flow_id: AIM-VPN/SSL-1:142, crypto map: dir-trans-vpn-buld-a sa timing: remaining key lifetime (k/sec): (4545643/2916) IV size: 8 bytes replay detection support: Y Status: ACTIVE outbound ah sas: outbound pcp sas: |
这个命令产生结果为对应于阶段2的每一个对等互联关系的两个数据元素,它们根据策略接口分组。第一个提供了加密策略的加密方式、压缩方法和错误统计。第二个详细显示了与策略相关的激活的入站和出站SA的寿命和模式信息。这个命令可以让你查看配置的策略是否实际工作了。如果你成功建立了ISAKMP节点但没有在递增的策略统计中看到,你就要检查你的流量合格访问列表。很可能你的流量匹配逻辑有错误。
混合直接VPN配置
我们的第二个配置例子是关于和间接VPN混合模型。类似于直接VPN配置,它仅使用IPsec来传输安全网络之间的数据。但又类似于间接VPN实现,它也可以用来给不可路由或只能通过安全策略到达的网络之间的安全数据交换。

大图链接:http://media.techtarget.com/digitalguide/images/Misc/IndirectVPN.jpeg
上图描绘我们这个例子的配置场景。在这个例子中,我们为所有核心和远程位置提供Internet连接,并激活每个位置的某些网络的安全数据交换。在这种情况下,每一个位置都在使用“RFC-1918 私有Internet寻址”,所以NAT转换将用于以提供Internet访问。就像我们的第一个例子,每一个地方都有两条连接到每个网关路由器的链路,但它们是两条不同的ISP链路,这两条链路都有一条默认的路由路径。其中一条链路是10Mbps的,它是用作主流量通道的;另一条是下行2Mbps、上行512Kbps的ADSL链路,它是用作VPN备份的。
为了实现动态路径故障恢复,我们必须引入动态路由协议(Dynamic Routing Protocol)。因为是我们使用了RFC-1918寻址,而且没有直接的网络连接支持Interior Gateway Protocol (IGP),我们将使用Border Gateway Protocol(BGP)多跳来交换路由信息并设置路径引用。一个分布式列表将用于过滤BGP路由公告,而Cisco私有有BGP度量权重则用于设置路径引用。
从数据包处理的角度上看,所有的LAN流量都在穿越IPsec策略之前穿越NAT策略。所以我们将使用一个显式的NAT流量匹配访问列表来放行必须到IPsec策略上加密的流量。当流量由IPsec策略修饰合格后, “不可路由”的IP数据包就被封装在一个ESP帧中,并且这个ESP帧是来自IPsec节点网关的公共接口,目标是其它节点路由器的公共地址。这个配置包括了下面列出的11个步骤。核心数据中心的配置是绿色的,远程办公室配置是橙色的。
步骤1. 定义ISAKMP(阶段1)策略:
CORE-VPN-GW(config)#crypto isakmp policy 10 CORE-VPN-GW(config-isakmp)# encr 3des CORE-VPN-GW(config-isakmp)# authentication pre-share CORE-VPN-GW(config-isakmp)# group 2 CORE-VPN-GW(config-isakmp)# lifetime 3600 REMOTE-VPN-GW(config)#crypto isakmp policy 10 REMOTE-VPN-GW(config-isakmp)# encr 3des REMOTE-VPN-GW(config-isakmp)# authentication pre-share REMOTE-VPN-GW(config-isakmp)# group 2 REMOTE-VPN-GW(config-isakmp)# lifetime 3600 |
步骤2. 定义ISAKMP策略预共享密钥:
CORE-VPN-GW(config)# crypto isakmp key cisco123 address 0.0.0.0 0.0.0.0 REMOTE-VPN-GW(config)# crypto isakmp key cisco123 address 0.0.0.0 0.0.0.0 |
步骤3. 创建IPsec(阶段2)转换集:
CORE-VPN-GW(config)#crypto IPsec transform-set CRT-ESP-COMP esp-3des esp-md5-hmac comp-lzs REMOTE-VPN-GW(config)#crypto IPsec transform-set RRT-ESP-COMP esp-3des esp-md5-hmac comp-lzs |
步骤4. 创建流量修饰访问列表:
CORE-VPN-GW(config)# CORE-VPN-GW(config-crypto-map)#permit ip 172.30.71.0 0.0.0.255 10.10.11.0 0.0.0.255 CORE-VPN-GW(config-crypto-map)#permit ip 172.30.68.0 0.0.0.255 10.10.11.0 0.0.0.255 REMOTE-VPN-GW(config)# REMOTE-VPN-GW(config-crypto-map)#permit ip 10.10.11.0 0.0.0.255 172.30.71.0 0.0.0.255 REMOTE-VPN-GW(config-crypto-map)#permit ip 10.10.11.0 0.0.0.255 172.30.68.0 0.0.0.255 |
步骤5. 创建NAT修饰访问列表:
CORE-VPN-GW(config)#ip access-list extended NAT CORE-VPN-GW(config-ext-nacl)#deny ip 172.30.68.0 0.0.0.255 10.10.11.0 0.0.0.255 CORE-VPN-GW(config-ext-nacl)#deny ip 172.30.71.0 0.0.0.255 10.10.11.0 0.0.0.255 CORE-VPN-GW(config-ext-nacl)#permit ip 172.30.68.0 0.0.0.255 any CORE-VPN-GW(config-ext-nacl)#permit ip 172.30.71.0 0.0.0.255 any CORE-VPN-GW(config-ext-nacl)#permit ip 172.30.70.0 0.0.0.255 any REMOTE-VPN-GW(config)#ip access-list extended NAT REMOTE-VPN-GW(config-ext-nacl)#deny ip 10.10.11.0 0.0.0.255 172.30.68.0 0.0.0.255 REMOTE-VPN-GW(config-ext-nacl)#deny ip 10.10.11.0 0.0.0.255 172.30.71.0 0.0.0.255 REMOTE-VPN-GW(config-ext-nacl)#permit ip 10.10.11.0 0.0.0.255 any REMOTE-VPN-GW(config-ext-nacl)#permit ip 10.10.41.0 0.0.0.255 any REMOTE-VPN-GW(config-ext-nacl)#permit ip 10.10.44.0 0.0.0.255 any |
步骤6. 创建NAT策略:
CORE-VPN-GW(config)#ip nat inside source list NAT interface FastEthernet 0/0 REMOTE-VPN-GW(config)#ip nat inside source list NAT interface FastEthernet 0/0 |
步骤7. 安装NAT配置:
CORE-VPN-GW(config)#int fa 0/0 CORE-VPN-GW(config-if)#ip nat outside CORE-VPN-GW(config)#int fa 0/1 CORE-VPN-GW(config-if)#ip nat inside REMOTE-VPN-GW(config)#int fa 0/0 REMOTE-VPN-GW(config-if)#ip nat outside REMOTE-VPN-GW(config)#int fa 0/1 REMOTE-VPN-GW(config-if)#ip nat inside |
步骤8. 创建静态密码图:
CORE-VPN-GW(config)#crypto map CORE-VPN 10 IPsec-isakmp CORE-VPN-GW(config-crypto-map)#set transform-set CRT-ESP-COMP CORE-VPN-GW(config-crypto-map)#match address CRYPT CORE-VPN-GW(config-crypto-map)#set peer 89.26.71.194 CORE-VPN-GW(config-crypto-map)#set peer 144.100.46.66 REMOTE-VPN-GW(config)#crypto map REM-VPN 10 IPsec-isakmp REMOTE-VPN-GW(config-crypto-map)#set transform-set RRT-ESP-COMP REMOTE-VPN-GW(config-crypto-map)#match address CRYPT REMOTE-VPN-GW(config-crypto-map)#set peer 89.26.40.10 REMOTE-VPN-GW(config-crypto-map)#set peer 144.100.99.50 |
步骤9. 安装静态密码图:CORE-VPN-GW(config)#interface FastEthernet0/0 CORE-VPN-GW(config-if)#description primary ISP path 10Mbit/s CORE-VPN-GW(config-if)#crypto map CORE-VPN CORE-VPN-GW(config)#interface FastEthernet0/1 CORE-VPN-GW(config)#description secondary ISP path 2/512 ADSL CORE-VPN-GW(config-if)#crypto map CORE-VPN REMOTE-VPN-GW(config)#interface FastEthernet0/0 REMOTE-VPN-GW(config-if)#description primary ISP path 10Mbit/s REMOTE-VPN-GW(config-if)#crypto map REM-VPN REMOTE-VPN-GW(config)#interface FastEthernet0/1 REMOTE-VPN-GW(config-if)#description secondary ISP path 2/512 ADSL REMOTE-VPN-GW(config-if)#crypto map REM-VPN |
步骤10. 创建BGP分布列表访问列表
CORE-VPN-GW(config)#ip access-list standard VPN-BGP CORE-VPN-GW(config-std-nacl)#permit 172.30.71.0 0.0.0.255 CORE-VPN-GW(config-std-nacl)#permit 172.30.68.0 0.0.0.255 REMOTE-VPN-GW(config)#ip access-list standard VPN-BGP REMOTE-VPN-GW(config-std-nacl)#permit 10.10.11.0 0.0.0.255 |
步骤11. 创建BGP策略:
CORE-VPN-GW(config)#router bgp 65020 CORE-VPN-GW(config-router)#network 172.30.71.0 mask 255.255.255.0 CORE-VPN-GW(config-router)#network 172.30.68.0 mask 255.255.255.0 CORE-VPN-GW(config-router)#neighbor 89.26.71.194 remote-as 65010 CORE-VPN-GW(config-router)#neighbor 89.26.71.194 ebgp-multihop CORE-VPN-GW(config-router)#neighbor 89.26.71.194 weight 62000 CORE-VPN-GW(config-router)#neighbor 89.26.71.194 distribute-list VPN-BGP out CORE-VPN-GW(config-router)#neighbor 89.26.71.194 soft- reconfiguration ibound CORE-VPN-GW(config-router)#neighbor 144.100.46.66 remote-as 65010 CORE-VPN-GW(config-router)#neighbor 144.100.46.66 ebgp-multihop CORE-VPN-GW(config-router)#neighbor 144.100.46.66 weight 62000 CORE-VPN-GW(config-router)#neighbor 144.100.46.66 distribute-list VPN-BGP out CORE-VPN-GW(config-router)#neighbor 144.100.46.66 soft- reconfiguration ibound REMOTE-VPN-GW(config)#router bgp 65010 REMOTE-VPN-GW(config-router)#network 10.10.11.0 mask 255.255.255.0 REMOTE-VPN-GW(config-router)#neighbor 89.26.40.10 remote-as 65020 REMOTE-VPN-GW(config-router)#neighbor 89.26.40.10 ebgp-multihop REMOTE-VPN-GW(config-router)#neighbor 89.26.40.10 weight 63000 REMOTE-VPN-GW(config-router)#neighbor 89.26.40.10 soft-reconfiguration i REMOTE-VPN-GW(config-router)#neighbor 89.26.40.10 distribute-list VPN-BGP out REMOTE-VPN-GW(config-router)#neighbor 144.100.99.50 remote-as 65020 REMOTE-VPN-GW(config-router)#neighbor 144.100.99.50 ebgp-multihop REMOTE-VPN-GW(config-router)#neighbor 144.100.99.50 weight 63000 REMOTE-VPN-GW(config-router)#neighbor 144.100.99.50 soft- reconfiguration i REMOTE-VPN-GW(config-router)#neighbor 144.100.99.50 distribute-list VPN-BGP out |
当BGP过程建立后,两种VPN路由候选都会被存储到路由器BGP数据库中。但只有一个会与远程节点路由器的网关列出的地址一起出现在路由表中。
CORE-VPN-GW#sh ip route Codes: 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 Gateway of last resort is 0.0.0.0 to network 0.0.0.0 10.0.0.0/24 is subnetted, 1 subnets B 10.10.11.0 [20/0] via 89.26.40.10, 01:04:14 89.0.0.0/30 is subnetted, 1 subnets C 89.26.40.8 is directly connected, FastEthernet0/0 144.100.0.0/30 is subnetted, 1 subnets C 144.100.99.48 is directly connected, FastEthernet3/0 172.30.0.0/24 is subnetted, 4 subnets C 172.30.71.0 is directly connected, FastEthernet2/0 C 172.30.70.0 is directly connected, FastEthernet1/1 C 172.30.68.0 is directly connected, FastEthernet1/2 S* 0.0.0.0/0 is directly connected, FastEthernet0/0 CORE-VPN-GW# |
当这个混合直接VPN变异版工作时,管理IP路由信息的操作仅限于表态路由或BGP多跳,在这里传统的“直接”配置依赖于独立于安生策略的路由策略。路由策略是有局限性的,这种方法在数据包开销上来说是更高效的,并且不会给基于隧道的VPN上带来数据包大小和片段大小的问题。
上面的两个配置例子都是非常传统的静态的基于图的IPsec配置。它们都是安全的和高效的,但也都缺乏可扩展性。这就是间接VPN解决方案比直接VPN优胜很多的原因。