一、IPSec VPN 简介
IPSec 的全称是 IP 安全性,它可以用来保证使用 IP 承载的数据端到端的私密性、完整性、不可抵赖性、以及不可重放攻击性。
IPSec 最初是为 IPv6 而设计的,后来才被移植到了 IPv4 上。
IPSec 不是一个具体的协议,而是一个可扩展的协议框架。该框架不会强制要求使用某种特定的算法,只会提供一些使用建议。并且该协议框架中的算法是实时更新的,完全不用担心旧的算法被破解之后整个协议框架会变得不安全。
IPSec 目前被广泛用于搭建各种 VPN,以实现远程主机在不安全的公网环境中安全地访问园区网中的资源,或者让两个园区网通过不安全的公网彼此互联互通。
本文将介绍思科路由器普通 LAN-to-LAN IPSec VPN 以及 GRE over IPSec VPN 的配置方法。
二、两种 IPSec VPN 的对比
GRE over IPSec 指的是受 IPSec 保护的 GRE Tunnel。
GRE over IPSec VPN 相比普通的 LAN-to-LAN IPSec VPN 最大的优势在于它可以提供一个逻辑的 Tunnel 接口。
这个 Tunnel 接口可以看作是一个虚拟的 PPP 接口,它支持传输任意类型的流量,包括组播流量和广播流量。
而支持组播和广播流量意味着可以在两个园区网之间运行各种诸如动态路由选择协议的非单播应用。
普通的 LAN-to-LAN IPSec VPN 由于没有提供这个 Tunnel 接口,所以只能在两个园区网之间传输单播流量,用途大大受限;并且还要专门指定哪些流量走 VPN,管理起来也非常不方便。
三、网络拓扑图及说明
如图,一家公司有 A、B 两个不同的办公地点。它们均使用单个静态 IP 接入公网,然后通过 NAPT 让内网主机上网。接口及网段的关系如上图所示。
下面将介绍如何通过 LAN-to-LAN IPSec VPN 以及 GRE over IPSec VPN 这两种方式来实现两个办公地点内网主机的互访。(只介绍 IPSec VPN、NAPT、路由有关的配置)
四、LAN-to-LAN IPSec VPN
4.1 配置
4.1.1 配置 NAPT
由于 LAN-to-LAN IPSec VPN 没有独立的接口来转发 VPN 流量,VPN 流量跟普通外网流量的出接口是相同的,所以这里需要防止 VPN 流量被 NAPT。
R1(A 地)
Router(config)#ip access-list extended nat % 创建一个名为 nat 的扩展 ACL 用于 NAPT
Router(config-ext-nacl)#deny ip 10.0.0.0 0.0.0.255 10.1.1.0 0.0.0.255 % 防止 A 地内网访问 B 地内网的流量被 NAPT
Router(config-ext-nacl)#permit ip 10.0.0.0 0.0.0.255 any % 允许 A 地内网主机访问公网
Router(config-ext-nacl)#exit
Router(config)#int e0/1
Router(config-if)#ip nat outside % 配置公网接口为 NAT 外部接口
Router(config-if)#exit
Router(config)#int e0/0
Router(config-if)#ip nat inside % 配置内网接口为 NAT 内部接口
Router(config-if)#exit
Router(config)#ip nat inside source list nat interface ethernet 0/1 overload % 将被名为 nat 的 ACL 匹配到且出接口为外网接口的流量进行 NAPT
R2(B 地)
Router(config)#ip access-list extended nat % 创建一个名为 nat 的扩展 ACL 用于 NAPT
Router(config-ext-nacl)#deny ip 10.1.1.0 0.0.0.255 10.0.0.0 0.0.0.255 % 防止 B 地内网访问 A 地内网的流量被 NAPT
Router(config-ext-nacl)#permit ip 10.1.1.0 0.0.0.255 any % 允许 B 地内网主机访问公网
Router(config-ext-nacl)#exit
Router(config)#int e0/1
Router(config-if)#ip nat outside % 配置公网接口为 NAT 外部接口
Router(config-if)#exit
Router(config)#int e0/0
Router(config-if)#ip nat inside % 配置内网接口为 NAT 内部接口
Router(config-if)#exit
Router(config)#ip nat inside source list nat interface ethernet 0/1 overload % 将被名为 nat 的 ACL 匹配到且出接口为外网接口的流量进行 NAPT
4.1.2 配置 IPSec 专用 ACL
该 ACL 用来决定哪些流量要走 IPSec VPN。
R1(A 地)
Router(config)#ip access-list extended ipsec % 创建一个名为 ipsec 的扩展 ACL
Router(config-ext-nacl)#permit ip 10.0.0.0 0.0.0.255 10.1.1.0 0.0.0.255 % 匹配 A 地内网访问 B 地内网的流量
Router(config-ext-nacl)#exit
R2(B 地)
Router(config)#ip access-list extended ipsec % 创建一个名为 ipsec 的扩展 ACL
Router(config-ext-nacl)#permit ip 10.1.1.0 0.0.0.255 10.0.0.0 0.0.0.255 % 匹配 B 地内网访问 A 地内网的流量
Router(config-ext-nacl)#exit
4.1.3 配置 IPSec 第一阶段(IKE)
本阶段使用以下安全参数:
认证模式 | 加密算法 | 散列算法 | DH 组 | 预共享密钥 | DPD |
---|---|---|---|---|---|
主模式 | 128 位 AES | MD5 | 2 | 12345678 | 不使用 |
R1(A 地)
Router(config)#crypto isakmp key 12345678 address 0.0.0.0 % 配置预共享密钥
Router(config)#crypto isakmp policy 10 % 创建一个优先级为 10 的 ISAKMP 规则
Router(config-isakmp)#authentication pre-share % 使用预共享密钥认证
Router(config-isakmp)#encryption aes 128 % 使用 128 位 AES 作为加密算法
Router(config-isakmp)#hash md5 % 使用 MD5 作为散列算法
Router(config-isakmp)#group 2 % 使用 DH 组 2
Router(config-isakmp)#exit
R2(B 地)
Router(config)#crypto isakmp key 12345678 address 0.0.0.0 % 配置预共享密钥
Router(config)#crypto isakmp policy 10 % 创建一个优先级为 10 的 ISAKMP 规则
Router(config-isakmp)#authentication pre-share % 使用预共享密钥认证
Router(config-isakmp)#encryption aes 128 % 使用 128 位 AES 作为加密算法
Router(config-isakmp)#hash md5 % 使用 MD5 作为散列算法
Router(config-isakmp)#group 2 % 使用 DH 组 2
Router(config-isakmp)#exit
4.1.4 配置 IPSec 第二阶段
本阶段使用以下安全参数:
工作模式 | 封装模式 | 加密算法 | 散列算法 | PFS |
---|---|---|---|---|
隧道模式 | ESP | 128 位 AES | MD5 | 不使用 |
R1(A 地)
Router(config)#crypto ipsec transform-set ipsec esp-aes 128 esp-md5-hmac
% 创建一个名为 ipsec 的 IPSec 传输集,使用 ESP 封装,加密算法为 128 位 AES,散列算法为 MD5
Router(cfg-crypto-trans)#mode tunnel % 指定工作模式为隧道模式
Router(cfg-crypto-trans)#exit
Router(config)#crypto map ipsec 10 ipsec-isakmp % 创建一个名为 ipsec,序列号为 10 的 IPSec 加密映射
Router(config-crypto-map)#set transform-set ipsec % 使用名为 ipsec 的 IPSec 传输集
Router(config-crypto-map)#match address ipsec % 让匹配到名为 ipsec 的 ACL 的流量走 VPN
Router(config-crypto-map)#set peer 100.2.2.1 % 设置对端地址为 B 地路由器外网接口的地址
Router(config-crypto-map)#exit
R2(B 地)
Router(config)#crypto ipsec transform-set ipsec esp-aes 128 esp-md5-hmac
% 创建一个名为 ipsec 的 IPSec 传输集,使用 ESP 封装,加密算法为 128 位 AES,散列算法为 MD5
Router(cfg-crypto-trans)#mode tunnel % 指定工作模式为隧道模式
Router(cfg-crypto-trans)#exit
Router(config)#crypto map ipsec 10 ipsec-isakmp % 创建一个名为 ipsec,序列号为 10 的 IPSec 加密映射
Router(config-crypto-map)#set transform-set ipsec % 使用名为 ipsec 的 IPSec 传输集
Router(config-crypto-map)#match address ipsec % 让匹配到名为 ipsec 的 ACL 的流量走 VPN
Router(config-crypto-map)#set peer 100.1.1.1 % 设置对端地址为 A 地路由器外网接口的地址
Router(config-crypto-map)#exit
4.1.5 在接口上启用 IPSec
R1(A 地)
Router(config)#interface ethernet 0/1
Router(config-if)#crypto map ipsec % 在外网接口上使用刚才创建的 IPSec 加密映射
Router(config-if)#exit
R2(B 地)
Router(config)#interface ethernet 0/1
Router(config-if)#crypto map ipsec % 在外网接口上使用刚才创建的 IPSec 加密映射
Router(config-if)#exit
4.1.6 添加静态路由条目(可选)
两个办公地点互访需要两台路由器都拥有去往对方内网网段,且出接口为去往对端路由器外网接口地址的出接口的路由条目。
如果两台路由器有出接口为去往对端路由器外网接口地址的出接口的默认路由条目,则可以不用配置。
R1(A 地)
Router(config)#ip route 10.1.1.0 255.255.255.0 ethernet 0/1 100.1.1.2
R2(B 地)
Router(config)#ip route 10.0.0.0 255.255.255.0 ethernet 0/1 100.2.2.2
4.2 验证 & 测试
PC1 访问 8.8.8.8(公网)
VPCS> ping 8.8.8.8
84 bytes from 8.8.8.8 icmp_seq=1 ttl=62 time=3.908 ms
84 bytes from 8.8.8.8 icmp_seq=2 ttl=62 time=1.689 ms
84 bytes from 8.8.8.8 icmp_seq=3 ttl=62 time=1.807 ms
84 bytes from 8.8.8.8 icmp_seq=4 ttl=62 time=2.126 ms
84 bytes from 8.8.8.8 icmp_seq=5 ttl=62 time=2.051 ms
PC1 ping PC2
VPCS> ping 10.1.1.2
10.1.1.2 icmp_seq=1 timeout
84 bytes from 10.1.1.2 icmp_seq=2 ttl=62 time=4.149 ms
84 bytes from 10.1.1.2 icmp_seq=3 ttl=62 time=3.317 ms
84 bytes from 10.1.1.2 icmp_seq=4 ttl=62 time=3.144 ms
84 bytes from 10.1.1.2 icmp_seq=5 ttl=62 time=3.074 ms
PC1 trace PC2
VPCS> trace 10.1.1.2
trace to 10.1.1.2, 8 hops max, press Ctrl+C to stop
1 10.0.0.1 0.642 ms 0.631 ms 0.646 ms
2 * * *
3 *10.1.1.2 3.494 ms (ICMP type:3, code:3, Destination port unreachable)
R1 的 IPSec 会话信息
Router#show crypto session
Crypto session current status
Interface: Ethernet0/1
Session status: UP-ACTIVE
Peer: 100.2.2.1 port 500
Session ID: 0
IKEv1 SA: local 100.1.1.1/500 remote 100.2.2.1/500 Active
IPSEC FLOW: permit ip 10.0.0.0/255.255.255.0 10.1.1.0/255.255.255.0
Active SAs: 2, origin: crypto map
PC1 ping PC2 时在 R1 的外网接口抓包
可以看出,两地内网主机已经可以通过加密的方式互访,并且公网连接不受 VPN 的影响。验证通过。
五、GRE over IPSec VPN
5.1 配置
⚠️ 注意
• 在开始配置之前请先清空上面的配置。
5.1.1 配置 NAPT
这里只需要配置普通的 NAPT 就可以了。
R1(A 地)
Router(config)#ip access-list standard nat % 创建一个名为 nat 的标准 ACL 用于 NAPT
Router(config-std-nacl)#permit 10.0.0.0 0.0.0.255 % 允许 A 地内网主机访问公网
Router(config-std-nacl)#exit
Router(config)#int e0/1
Router(config-if)#ip nat outside % 配置公网接口为 NAT 外部接口
Router(config-if)#exit
Router(config)#int e0/0
Router(config-if)#ip nat inside % 配置内网接口为 NAT 内部接口
Router(config-if)#exit
Router(config)#ip nat inside source list nat interface ethernet 0/1 overload % 将被名为 nat 的 ACL 匹配到且出接口为外网接口的流量进行 NAPT
R2(B 地)
Router(config)#ip access-list standard nat % 创建一个名为 nat 的标准 ACL 用于 NAPT
Router(config-std-nacl)#permit 10.1.1.0 0.0.0.255 % 允许 B 地内网主机访问公网
Router(config-std-nacl)#exit
Router(config)#int e0/1
Router(config-if)#ip nat outside % 配置公网接口为 NAT 外部接口
Router(config-if)#exit
Router(config)#int e0/0
Router(config-if)#ip nat inside % 配置内网接口为 NAT 内部接口
Router(config-if)#exit
Router(config)#ip nat inside source list nat interface ethernet 0/1 overload % 将被名为 nat 的 ACL 匹配到且出接口为外网接口的流量进行 NAPT
5.1.2 配置 IPSec 第一阶段(IKE)
本阶段使用以下安全参数:
认证模式 | 加密算法 | 散列算法 | DH 组 | 预共享密钥 | DPD |
---|---|---|---|---|---|
主模式 | 128 位 AES | MD5 | 2 | 12345678 | 不使用 |
R1(A 地)
Router(config)#crypto isakmp key 12345678 address 0.0.0.0 % 配置预共享密钥
Router(config)#crypto isakmp policy 10 % 创建一个优先级为 10 的 ISAKMP 规则
Router(config-isakmp)#authentication pre-share % 使用预共享密钥认证
Router(config-isakmp)#encryption aes 128 % 使用 128 位 AES 作为加密算法
Router(config-isakmp)#hash md5 % 使用 MD5 作为散列算法
Router(config-isakmp)#group 2 % 使用 DH 组 2
Router(config-isakmp)#exit
R2(B 地)
Router(config)#crypto isakmp key 12345678 address 0.0.0.0 % 配置预共享密钥
Router(config)#crypto isakmp policy 10 % 创建一个优先级为 10 的 ISAKMP 规则
Router(config-isakmp)#authentication pre-share % 使用预共享密钥认证
Router(config-isakmp)#encryption aes 128 % 使用 128 位 AES 作为加密算法
Router(config-isakmp)#hash md5 % 使用 MD5 作为散列算法
Router(config-isakmp)#group 2 % 使用 DH 组 2
Router(config-isakmp)#exit
5.1.3 配置 IPSec 第二阶段
本阶段使用以下安全参数:
工作模式 | 封装模式 | 加密算法 | 散列算法 | PFS |
---|---|---|---|---|
传输模式 | ESP | 128 位 AES | MD5 | 不使用 |
由于 GRE 会为内网流量封装一层新的 IP 报头,所以这里没有必要让 IPSec 再给 GRE 流量封装一层新的 IP 报头,使用传输模式即可。
R1(A 地)
Router(config)#crypto ipsec transform-set ipsec esp-aes 128 esp-md5-hmac
% 创建一个名为 ipsec 的 IPSec 传输集,使用 ESP 封装,加密算法为 128 位 AES,散列算法为 MD5
Router(cfg-crypto-trans)#mode transport % 指定工作模式为传输模式
Router(cfg-crypto-trans)#exit
Router(config)#crypto ipsec profile ipsec % 创建一个名为 ipsec 的 IPSec 配置文件
Router(ipsec-profile)#set transform-set ipsec % 使用名为 ipsec 的 IPSec 传输集
Router(config-crypto-map)#exit
R2(B 地)
Router(config)#crypto ipsec transform-set ipsec esp-aes 128 esp-md5-hmac
% 创建一个名为 ipsec 的 IPSec 传输集,使用 ESP 封装,加密算法为 128 位 AES,散列算法为 MD5
Router(cfg-crypto-trans)#mode transport % 指定工作模式为传输模式
Router(cfg-crypto-trans)#exit
Router(config)#crypto ipsec profile ipsec % 创建一个名为 ipsec 的 IPSec 配置文件
Router(ipsec-profile)#set transform-set ipsec % 使用名为 ipsec 的 IPSec 传输集
Router(config-crypto-map)#exit
5.1.4 配置 Tunnel 接口
R1(A 地)
Router(config)#interface tunnel 0
Router(config-if)#ip address 10.100.100.1 255.255.255.252 % 配置 Tunnel 接口的 IP 地址
Router(config-if)#tunnel source 100.1.1.1 % 指定 Tunnel 接口的源地址为路由器外网接口的地址
Router(config-if)#tunnel destination 100.2.2.1 % 指定 Tunnel 接口的目的地址为对端路由器外网接口的地址
Router(config-if)#tunnel mode ipsec ipv4 % 设定 Tunnel 接口的模式为 GRE over IPSec
Router(config-if)#tunnel protection ipsec profile ipsec % 使用刚才创建的 IPSec 配置文件来加密 Tunnel 口流量
Router(config-if)#exit
R2(B 地)
Router(config)#interface tunnel 0
Router(config-if)#ip address 10.100.100.2 255.255.255.252 % 配置 Tunnel 接口的 IP 地址
Router(config-if)#tunnel source 100.2.2.1 % 指定 Tunnel 接口的源地址为路由器外网接口的地址
Router(config-if)#tunnel destination 100.1.1.1 % 指定 Tunnel 接口的目的地址为对端路由器外网接口的地址
Router(config-if)#tunnel mode ipsec ipv4 % 设定 Tunnel 接口的模式为 GRE over IPSec
Router(config-if)#tunnel protection ipsec profile ipsec % 使用刚才创建的 IPSec 配置文件来加密 Tunnel 口流量
Router(config-if)#exit
5.1.5 配置动态路由选择协议
下面在两个园区网路由器之间使用 OSPF 来相互学习彼此内网的路由条目。
⚠️ 注意
• 千万不要将外网接口宣告进 OSPF 中,否则会导致 Tunnel 接口不停地 Up/Down。
R1(A 地)
Router(config-if)#router ospf 1 % 开启 OSPF 进程 1
Router(config-router)#exit
Router(config)#interface range tunnel 0 , ethernet 0/0
Router(config-if-range)#ip ospf 1 area 0 % 将内网接口和 Tunnel 接口宣告进 OSPF 进程 1 的区域 0 中
Router(config-if-range)#exit
R2(B 地)
Router(config-if)#router ospf 1 % 开启 OSPF 进程 1
Router(config-router)#exit
Router(config)#interface range tunnel 0 , ethernet 0/0
Router(config-if-range)#ip ospf 1 area 0 % 将内网接口和 Tunnel 接口宣告进 OSPF 进程 1 的区域 0 中
Router(config-if-range)#exit
5.2 验证 & 测试
PC2 访问 8.8.8.8(公网)
VPCS> ping 8.8.8.8
84 bytes from 8.8.8.8 icmp_seq=1 ttl=62 time=5.644 ms
84 bytes from 8.8.8.8 icmp_seq=2 ttl=62 time=2.469 ms
84 bytes from 8.8.8.8 icmp_seq=3 ttl=62 time=2.905 ms
84 bytes from 8.8.8.8 icmp_seq=4 ttl=62 time=2.068 ms
84 bytes from 8.8.8.8 icmp_seq=5 ttl=62 time=2.409 ms
PC2 ping PC1
VPCS> ping 10.0.0.2
84 bytes from 10.0.0.2 icmp_seq=1 ttl=62 time=4.510 ms
84 bytes from 10.0.0.2 icmp_seq=2 ttl=62 time=3.399 ms
84 bytes from 10.0.0.2 icmp_seq=3 ttl=62 time=3.022 ms
84 bytes from 10.0.0.2 icmp_seq=4 ttl=62 time=2.440 ms
84 bytes from 10.0.0.2 icmp_seq=5 ttl=62 time=3.122 ms
PC2 trace PC1
VPCS> trace 10.0.0.2
trace to 10.0.0.2, 8 hops max, press Ctrl+C to stop
1 10.1.1.1 0.434 ms 0.412 ms 0.284 ms
2 10.100.100.1 2.185 ms 1.672 ms 2.139 ms
3 *10.0.0.2 3.390 ms (ICMP type:3, code:3, Destination port unreachable)
R2 的 IPSec 会话信息
Router#show crypto session
Crypto session current status
Interface: Tunnel0
Session status: UP-ACTIVE
Peer: 100.1.1.1 port 500
Session ID: 0
IKEv1 SA: local 100.2.2.1/500 remote 100.1.1.1/500 Active
IPSEC FLOW: permit ip 0.0.0.0/0.0.0.0 0.0.0.0/0.0.0.0
Active SAs: 2, origin: crypto map
R2 的 OSPF 邻居信息
Router#show ip ospf neighbor
Neighbor ID Pri State Dead Time Address Interface
100.1.1.1 0 FULL/ - 00:00:33 10.100.100.1 Tunnel0
R2 的 OSPF 路由表
Router#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
Gateway of last resort is 100.2.2.2 to network 0.0.0.0
10.0.0.0/8 is variably subnetted, 5 subnets, 3 masks
O 10.0.0.0/24 [110/1010] via 10.100.100.1, 00:04:44, Tunnel0
在 R2 的外网接口抓包
可以看出,两地的路由器可以通过 Tunnel 口建立 OSPF 邻居,且相互学习了彼此内网的路由条目。两地内网主机已经可以通过加密的方式互访,并且公网连接不受 VPN 的影响。验证通过。