适用场景:
如图所求,一个企业接入互联网往往会使用一台防火墙,而VPN设备可能在这台防火墙身后,这样一来VPN流量就需要穿越防火墙,这可能会导致一些问题。
防火墙基本原理:
防火墙是分区域的,一般分为内网区域(Inside Zone)、外网区域(Outside Zone)和DMZ区域(DMZ Zone),然后进行策略管控。通常内网区域可以访问DMZ和外网区域,而外网区域不能主动访问内网和DMZ区域,需要手动放行策略。
目前市面上几乎所有防火墙的防火墙都是基于状态化包过滤的防火墙,即当一个会话中的数据包穿越防火墙再次返回的时候,防火墙是基于它的会话来进行放行的,只要有Outbound流量的会话就放行,并不会查看ACL。意思就是当一个内网的流量从内网接入进入防火墙,会产生一个会话,防火墙记录这个会话,然后数据包从外网接口转发出去,当这个数据包请求的信息再回来的时候防火墙不需要查看ACL,只要查看它的会话表,发现这个包是刚才发出去包的响应,就予以放行。
VPN流量穿越问题:
我们知道IPSec VPN的协商流量(即IKE的流量)是UDP500,而真实IPSec VPN流量通常是封装在ESP当中的,这就需要防火墙对这两种流量进行放行和检测。而防火墙(以思科ASA为例)默认是不检测ESP流量的,因此,当北京的路由器首先发起的VPN的时候,IKE顺利建立,但VPN真实流量无法通过,因为ESP的数据包有去无回;当上海的路由器首先发起VPN的时候,IKE也不能建立,因为防火墙没有放行。
实验
下面通过实验来说明上述问题并进行解决:
拓扑图如下:
实验介绍:
R1和ASA模拟北京总部的设备,R2模拟互联网的路由器,R3模拟上海分站的路由器。ASA是一台防火墙接入互联网,R1和R3建立一个站点到站点的IPSec VPN。R1的VPN流量会穿越ASA才能与R3建立VPN连接。其中11.1.1.0/24、12.1.1.0/24和23.1.1.0/24都是公网IP地址,1.1.1.0/24和3.3.3.0/24分别是R1和R3站点身后的网络。
R1基本配置:
interface FastEthernet0/0
ip address 11.1.1.1 255.255.255.0
no shutdown
!
interface Loopback0
ip address 1.1.1.1 255.255.255.0
!
ip route 0.0.0.0 0.0.0.0 11.1.1.2
ASA基本配置:
interface GigabitEthernet0
nameif inside
security-level 100
ip address 11.1.1.2 255.255.255.0
no shutdown
!
interface GigabitEthernet1
nameif outside
security-level 0
ip address 12.1.1.1 255.255.255.0
no shutdown
!
route outside 0.0.0.0 0.0.0.0 12.1.1.2 1
route inside 1.1.1.0 255.255.255.0 11.1.1.1 1
!
access-list vpn-acl extended permit icmp any any //建立一个放行ICMP的ACL
access-group vpn-acl in interface outside
R2基本配置:
interface FastEthernet1/0
ip address 12.1.1.2 255.255.255.0
no shutdown
!
interface FastEthernet2/0
ip address 23.1.1.2 255.255.255.0
no shutdown
!
ip route 11.1.1.0 255.255.255.0 12.1.1.1
R3基本配置:
interface FastEthernet2/0
ip address 23.1.1.3 255.255.255.0
no shutdown
!
interface Loopback0
ip address 3.3.3.3 255.255.255.0
!
ip route 0.0.0.0 0.0.0.0 23.1.1.2
R1VPN配置:
crypto isakmp policy 10
authentication pre-share
crypto isakmp key cisco address 23.1.1.3
!
crypto ipsec transform-set trans esp-des esp-md5-hmac
!
crypto map cisco 10 ipsec-isakmp
set peer 23.1.1.3
set transform-set trans
match address 100
!
access-list 100 permit ip 1.1.1.0 0.0.0.255 3.3.3.0 0.0.0.255
!
interface FastEthernet0/0
ip address 11.1.1.1 255.255.255.0
crypto map cisco
R3VPN配置:
crypto isakmp policy 10
authentication pre-share
crypto isakmp key cisco address 11.1.1.1
!
!
crypto ipsec transform-set trans esp-des esp-md5-hmac
!
crypto map cisco 10 ipsec-isakmp
set peer 11.1.1.1
set transform-set trans
match address 100
!
access-list 100 permit ip 3.3.3.0 0.0.0.255 1.1.1.0 0.0.0.255
!
interface FastEthernet2/0
ip address 23.1.1.3 255.255.255.0
crypto map cisco
分别在R1和R3上使用下面命令,使telnet不需密码就可以登录,用来进行测试:
R1(config)#line vty 0 4
R1(config-line)#no login
测试:
在R1上使用1.1.1.1去ping3.3.3.3
R1#ping 3.3.3.3 source 1.1.1.1
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 3.3.3.3, timeout is 2 seconds:
Packet sent with a source address of 1.1.1.1
.....
Success rate is 0 percent (0/5)
发现无法ping通R3的3.3.3.3,查看第一阶段的SA,SA已经建立成功。
R1#show crypto isakmp sa
IPv4 Crypto ISAKMP SA
dst src state conn-id slot status
23.1.1.3 11.1.1.1 QM_IDLE 1001 0 ACTIVE
查看第二阶段的SA,也建立成功。(输出太多,不再此展示)
查看加解密,发现只有加密没有解密,说明VPN流量有去无回。
R1#show crypto engine connections active
Crypto Engine Connections
ID Interface Type Algorithm Encrypt Decrypt IP-Address
1 Fa0/0 IPsec DES+MD5 0 0 11.1.1.1
2 Fa0/0 IPsec DES+MD5 9 0 11.1.1.1
1001 Fa0/0 IKE SHA+DES 0 0 11.1.1.1
原因分析:
这是由于IPSec封装的是ESP的包,而ASA默认不对ESP的包进行状态化检测,并且在外接口的入方向也没有放行ESP的流量,因此导致VPN不通。
解决办法:在ASA上放行R1和R3之间的ESP流量
ciscoasa(config)# access-list vpn-acl permit esp any any
再次进行测试
R1#ping 3.3.3.3 source 1.1.1.1
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 3.3.3.3, 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 = 88/104/116 ms
到此,实验完成。
现在看起来已经没问题了,但如果在清除和SA之后,使用R3来触发VPN流量,则还是会遇到问题,因为第一阶段IKE使用的UDP500的端口,而防火墙并没有放行由外向内的UDP500的流量,因此,如果想要R3也能触发VPN流量,需要在ASA上再添放行UDP500的流量。
总结:
在部署VPN的时候,要注意防火墙对IPSec VPN流量的放行(包括IKE协商用到的UDP500,真实的数据ESP流量、可能会封装成的NAT-T,即UDP4500流量),如果是其他类型的VPN,如PPTP、L2TP等,注意放行相关的端口。
VPN端口总结如下:
IKE:源和目标都是UDP500
IPSec VPN流量:ESP(IP协议号是51)/ AH(IP协议号是50)
GRE:GRE流量(IP协议号是47)
PPTP:控制通道是TCP1723,实际数据是GRE
L2TP:不加密的L2TP是UDP的1701端口,加密后同IPSec一样。
SSL:TCP 443