1.VPN技术简介
VPN(Virtual Private Network,虚拟私有网络)是指在公用网络上建立一个私有的、专用的虚拟通信网络,广泛应用于企业网络中分支机构和出差员工连接公司总部网络的场景。
VPN分类
根据建设单位不同分类 ,这种分类根据VPN网络端点设备(关键设备)由运营商提供,还是由企业自己提供来划分。
- 租用运营商VPN专线搭建企业VPN网络。如下图所示,主要指租用运营商MPLS(Multiprotocol Label Switching,多协议标签交换)VPN专线。

- 用户自建企业VPN网络。如下图所示,目前最常用的就是基于Internet建立企业VPN网络,具体技术包括GRE、L2TP、IPSec、DSVPN、SSL VPN等。这种方案企业只需要支付设备购买费用和上网费用,没有VPN专线租用费用;另外企业在网络控制方面享有更多的主动权、更方便企业进行网络调整。

根据组网方式不同分类
- 远程访问VPN(Access VPN)。如下图所示,适用于出差员工VPN拨号接入的场景。员工可以在任何能够接入Internet的地方,通过远程拨号接入企业内网,从而访问内网资源。

- 局域网到局域网的VPN(site-to-site VPN)。如下图所示,适用于公司两个异地机构的局域网互连。

根据应用对象不同分类
- Access VPN(远程访问)。面向出差员工,允许出差员工跨越公用网络远程接入公司内部网络。
- Intranet VPN(企业内部虚拟专网)。Intranet VPN通过公用网络进行企业内部各个网络的互连。
- Extranet VPN(扩展的企业内部虚拟专网)。Extranet VPN利用VPN将企业网延伸至合作伙伴处,使不同企业间通过 Internet来构筑VPN。Intranet VPN和Extranet VPN的不同点主要在于访问公司总部网络资源的权限有区别。
如下图所示,不同的应用对象如分支机构、合作伙伴和出差员工会通过不同类型的VPN接入公司总部。

VPN的关键技术
①隧道技术
隧道技术是VPN的基本技术,类似于点到点连接技术。如下图所示,VPN网关1收到原始报文后,将报文“封装”,然后通过Internet传输到VPN网关2。VPN网关2再对报文进行“解封装”,最终得到原始报文。

“封装/解封装”过程本身就可以为原始报文提供安全防护功能,所以被封装的报文在Internet上传输时所经过的逻辑路径被称为“隧道”。
②身份认证技术
身份认证技术主要用于移动办公用户远程接入的情况。总部的VPN网关对用户的身份进行认证,确保接入内部网络的用户是合法用户,而非恶意用户。
不同的VPN技术能提供的用户身份认证方法不同,如下所示。
- GRE:不支持针对用户的身份认证技术。
- L2TP:依赖PPP提供的认证(如CHAP、PAP、EAP)。对接入用户进行认证时,可以使用本地认证方式也可以使用第三方RADIUS服务器来认证。认证通过以后会给用户分配内部的IP地址,通过此IP地址对用户进行授权和管理。
- IPSec:使用IKEv2时,支持对用户进行EAP认证。认证时可以使用本地认证方式也可以使用第三方RADIUS服务器来认证。认证通过以后会给用户分配内部的IP地址,通过此IP地址对用户进行授权和管理。
- DSVPN:不支持针对用户的身份认证技术。
- SSL VPN:对接入用户进行认证时,支持本地认证、证书认证和服务器认证。另外,接入用户也可以对SSL VPN服务器进行身份认证,确认SSL VPN服务器的合法性。
③加密技术 加密就是把明文变成密文的过程,如下图所示,这样即便黑客截获了报文也无法知道其真实含义。加密对象有数据报文和协议报文之分,能够实现协议报文和数据报文都加密的协议安全系数更高。

- GRE和L2TP协议本身不提供加密技术,所以通常结合IPSec协议一起使用,依赖IPSec的加密技术。
- IPSec:支持对数据报文和协议报文进行加密。
- DSVPN:配置IPSec安全框架后,支持对数据报文和协议报文进行加密。
- SSL VPN:支持对数据报文和协议报文加密。
④数据验证技术
数据验证技术就是对报文的真伪进行检查,丢弃伪造的、被篡改的报文。它采用一种称为“摘要”的技术,如下图所示(图中只给出了验证的过程,通常情况下验证和加密会一起使用)。“摘要”技术主要采用HASH函数将一段 长的报文通过函数变换,映射为一段短的报文。在收发两端都对报文进行验证,只有摘要一致的报文才被接收。

- GRE:本身只提供简单的校验和验证和关键字验证,但可结合IPSec协议一起使用,使用IPSec的数据验证技术。
- L2TP:本身不提供数据验证技术,但可结合IPSec协议一起使用,使用IPSec的数据验证技术。
- IPSec:支持对数据进行完整性验证和数据源验证。
- DSVPN:配置IPSec全框架后,支持对数据进行完整性验证和数据源验证。
- SSL VPN:支持对数据进行完整性验证和数据源验证。

2.GRE
通用路由封装协议GRE (Generic Routing Encapsulation)可以对某些网络层协议(如IPX、IPv6、AppleTalk等)的数据报文进行封装,使这些被封装的数据报文能够在另一个网络层协议(如IPv4)中传输。
GRE提供了将一种协议的报文封装在另一种协议报文中的机制,是一种三层隧道封装技术,使报文可以通过GRE隧道透明的传输,解决异种网络的传输问题。
GRE的封装/解封装
任何一种网络封装技术,其基本的构成要素都可以分为三个部分:乘客协议、封装协议、运输协议,为了便于理解封装技术,我们用邮政系统打个比方。
- 乘客协议
乘客协议就是我们写的信,信的语言可以是汉语、英语、法语等,具体的内容由写信人、读信人自己负责。
- 封装协议
封装协议可以理解为信封,可以是平信、挂号或者是EMS。不同的信封就对应于多种封装协议。
- 运输协议
运输协议就是信的运输方式,可以是陆运、海运或者空运。不同的运输方式就对应于多种运输协议。
GRE能够承载的协议包括IP协议和IPX协议,GRE所使用的运输协议是IP协议。

GRE报文封装

GRE的封装过程可以细分成两步,第一步是在私网的原始报文前面添加GRE头,第二步是在GRE头前面再加上新的IP头,新IP头中的IP地址为公网地址。加上新的IP头以后,就意味着这个私有网络的报文经过层层封装以后就可以在Internet上传输了。
在防火墙上,封装操作是通过一个逻辑接口来实现的,这个逻辑接口就是Tunnel接口。Tunnel即隧道,从名字就可以看出来这个逻辑接口就是为隧道而生。Tunnel接口上带有新IP头的源地址和目的地址信息,报文进入Tunnel接口后,防火墙就会为报文封装GRE头和新的IP头。
防火墙通过路由将报文送到Tunnel接口,支持如下两种路由:
- 静态路由
在GRE隧道两端的防火墙上配置去往对端私网网段的静态路由,下一跳设置为本端Tunnel接口的IP地址,出接口为本端Tunnel接口。
- 动态路由
在GRE隧道两端的防火墙上配置动态路由如OSPF,将私网网段和Tunnel接口的地址发布出去,两端防火墙都会学习到去往对端私网网段的路由,下一跳为对端 Tunnel接口的IP地址,出接口为本端Tunnel接口。
无论使用哪种路由,最终的目的都是在防火墙的路由表中生成去往对端私网网段的路由,通过这条路由来引导报文进入Tunnel接口进行封装。
下图给出了防火墙对私网报文进行加封装、解封装,以及转发的过程。

配置GRE基本参数

GRE隧道的配置很简单,可以分为两个步骤。
①配置Tunnel接口
在FW_A上配置Tunnel接口的封装参数。
[FW_A] interface Tunnel 1
[FW_A-Tunnel1] ip address 10.1.1.1 24
[FW_A-Tunnel1] tunnel-protocol gre
[FW_A-Tunnel1] source 1.1.1.1
[FW_A-Tunnel1] destination 2.2.2.2
[FW_A-Tunnel1] quit
在FW_A上将Tunnel接口加入安全区域。Tunnel接口可以加入到任意一个安全区域中,把Tunnel接口加入到了DMZ区域。
[FW_A] firewall zone dmz
[FW_A-zone-dmz] add interface Tunnel 1
[FW_A-zone-dmz] quit
在FW_B上配置Tunnel接口的封装参数。
[FW_B] interface Tunnel 1
[FW_B-Tunnel1] ip address 10.1.1.2 24
[FW_B-Tunnel1] tunnel-protocol gre
[FW_B-Tunnel1] source 2.2.2.2
[FW_B-Tunnel1] destination 1.1.1.1
[FW_B-Tunnel1] quit
在FW_B上将Tunnel接口加入安全区域。同样,把Tunnel接口加入到了DMZ区域。
[FW_B] firewall zone dmz
[FW_B-zone-dmz] add interface Tunnel 1
[FW_B-zone-dmz] quit
②配置路由,把需要进行GRE封装的报文引导至Tunnel接口
防火墙支持静态路由和动态路由两种方式,两种方式可以任选其一。
(1)静态路由
在FW_A上配置静态路由,将去往总部私网的路由的下一跳设置为Tunnel接口。
[FW_A] ip route-static 192.168.2.0 24 Tunnel 1
在FW_B上配置静态路由,将去往分支机构私网的路由的下一跳设置为Tunnel接口。
[FW_B] ip route-static 192.168.1.0 24 Tunnel 1
(2)动态路由
在FW_A上配置OSPF,在OSPF中将分支机构的私网和Tunnel接口所在的网段发布出去。
[FW_A] ospf 1
[FW_A-ospf-1]area 0
[FW_A-ospf-1-area-0.0.0.0] network 192.168.1.0 0.0.0.255
[FW_A-ospf-1-area-0.0.0.0] network 10.1.1.0 0.0.0.255
在FW_B上配置OSPF,在OSPF中将总部的私网和Tunnel接口所在的网段发布出去。
[FW_B] ospf 1
[FW_B-ospf-1]area 0
[FW_B-ospf-1-area-0.0.0.0] network 192.168.2.0 0.0.0.255
[FW_B-ospf-1-area-0.0.0.0] network 10.1.1.0 0.0.0.255
配置完成后,FW_A和FW_B 上就会学习到去往对端私网网段的路由。
配置 GRE安全机制
①关键字验证
防火墙在为报文封装GRE头时,将GRE头中的Key位的值置1,并在GRE头中插入Key字段。两台防火墙在建立隧道时,通过Key字段的值来验证对端的身份,只有两端设置的Key字段的值完全一致时才能建立隧道。
配置关键字验证的步骤很简单,唯一需要注意的是, 隧道两端防火墙上 设置的 关键字必须相同。
在FW_A上设置关键字为12345:
[FW_A-Tunnel1] gre key 12345
在FW_B上设置关键字为12345:
[FW_B-Tunnel1] gre key 12345
②校验和验证
防火墙在为报文封装GRE头时,将GRE头中的Checksum位的值置1,然后根据报文的信息计算校验和,并将校验和填到Checksum字段中。当隧道对端收到该报文时,也会根据报文信息计算校验和,并与报文中携带的校验和进行比较,如果校验结果一致,则接受此报文;如果不一致,则丢弃此报文。
校验和验证功能是单向的,对端防火墙是否开启不影响本端的校验和验证功能。实际环境中,建议在隧道两端防火墙上同时开启。
在FW_A上开启校验和验证:
[FW_A-Tunnel1] gre checksum
在FW_B上开启校验和验证:
[FW_B-Tunnel1] gre checksum
③Keepalive
GRE隧道是一种无状态类型的隧道,所谓的无状态类型是指隧道本端并不维护与对端的状态。换句话说假如隧道对端出现故障,那隧道本端是感受不到的。为了解决这个问题,GRE隧道提供了Keepalive保活机制。
如下图所示,在FW_A上开启Keepalive功能后,FW_A会周期性的向FW_B发送探测报文,以检测隧道对端状态。如果FW_B可达,则FW_A会收到FW_B的回应报文,此时FW_A会保持隧道的正常状态;如果FW_A收不到FW_B的回应报文,说明FW_B不可达,则FW_A会将隧道关闭。这样就避免了因隧道对端不可达而造成的数据黑洞。

Keepalive 功能是单向的,对端是否开启Keepalive 功能不影响本端的Keepalive 功能。实际环境中,建议在隧道两端防火墙上同时开启。
在FW_A上开启Keepalive功能:
[FW_A-Tunuel1] keepalive
在FW_B上开启Keepalive功能:
[FW_B-Tunuel1] keepalive
3.L2TP VPN的诞生及演进
互联网发展初期,个人用户和企业用户大都通过电话线上网,企业分支机构和出差用户一般也通过“电话网络(学名PSTN/ISDN)”来接入总部网络,这种基于PSTN/ISDN的VPN称为VPDN(Virtual Private Dial Network),L2TP VPN是VPDN技术的一种。
基于PSTN/ISDN的L2TP VPN如下图所示,运营商在PSTN/ISDN和IP网络之间部署LAC(在VPDN里称为NAS,Network Access Server),集中为多个企业用户提供L2TP VPN专线服务,配套提供认证和计费功能。当分支机构和出差员工拨打L2TP VPN专用接入号时,接入Modem通过PPP协议与LAC建立PPP会话,同时启动认证和计 费。认证通过后LAC向LNS发起L2TP隧道和会话协商,企业总部的LNS出于安全考虑,再次认证接入用户身份,认证通过后分支机构和出差员工就可以访问总部网络了。

随着IP网络的普及,PSTN/ISDN网络逐渐退出数据通信领域。现今基于Internet的L2TP VPN常用场景如下图所示。分为两种L2TP VPN,一种是分支机构用户安装PPPoE Client,在以太网上触发PPPoE拨号,在PPPoE Client和LAC(PPPoE Server)之间建立PPPoE会话,LAC和LNS之间建立L2TP VPN,基于LAC拨号的L2TPVPN被称为NAS-Initiated VPN;另外一种是用户PC通过系统自带的L2TP Client或第三方L2TP Client软件直接拨号与LNS建立L2TP VPN,这种客户端直接拨号的L2TP VPN被称为Client-Initiated VPN。
