来自H3C
缩略语清单List of abbreviations:
Abbreviations 缩略语 |
Full spelling 英文全名 |
Chinese explanation 中文解释 |
VPN |
Virtual Private Network |
虚拟专用网 |
NAT |
Network Address Translation |
网络地址转换 |
GRE |
Generic Routing Encapsulation |
通用路由封装 |
L2TP |
Layer 2 Tunneling Protocol |
二层隧道协议 |
IPsec |
IP Security |
Internet 协议安全 |
SSL |
Secure Sockets Layer |
安全套接层 |
HTTPS |
Hypertext Transfer Protocol Secure |
加密的超文本传输协议 |
IKE |
Internet Key Exchange |
因特网密钥交换 |
|
1 概述
VPN(Virtual Private Network,虚拟专用网)是一种基于公共数据网的服务,它依靠ISP(Internet Service Provider)和NSP(Network Service Provider),在公共网络中建立虚拟专用通信网络。VPN可以极大地降低用户的费用,并且提供比传统专线方式更强的安全性。
在VPN中广泛使用了各种各样的隧道技术,有二层隧道技术,也有三层隧道技术。常用隧道协议包括:L2TP、GRE、IPsec、SSL VPN等。那么,什么是隧道呢?
隧道是一种封装技术,它利用一种网络协议来传输另一种网络协议,即利用一种网络传输协议,将其他协议产生的数据报文封装在它自己的报文中,然后在网络中传输。实际上隧道可以看作一个虚拟的点到点连接。
隧道技术简单地说就是:原始报文在A地进行封装,到达B地后把封装去掉,还原成原始报文,这样就形成了一条由A到B的通信隧道。隧道技术就是指包括数据封装、传输和解封装在内的全过程。
NAT(本文如无特殊说明,NAT包括端口转换PAT情况)主要用于解决IPv4地址紧缺问题,在目前网络中NAT应用非常广泛,特别是在企业网出口网关大都使用了NAT技术解决公网地址不足的问题。
如图1所示,当企业分支机构处于一个园区或者小运营商范围内,企业分支出口的IP地址很可能不是公网地址。这样在园区出口或者小运营商出口处,会有NAT的存在,所以总部与分支建立的VPN隧道必须能够支持NAT穿越。
图1 VPN穿越NAT的应用组网
随着VPN技术得到广泛的应用,一些NAT技术与VPN技术存在不兼容的问题出现在我们面前。使NAT与VPN共存成为一个VPN实施中需要重点考虑的因素。本文主要介绍NAT与各种VPN共存可能引起的问题以及如何解决这些问题的方法。这里的VPN包括IPsec、GRE、L2TP、SSL VPN等常用传统VPN。由于NAT技术在转发报文的时候会修改报文的网络层地址和传输层端口,所以在分析传统VPN与NAT是否可以共存时,首先需要分析该VPN隧道的封装方式,看有没有传输层的端口,其次要分析VPN隧道的协商过程中是否要使用报文的IP地址。
2 IPsec与NAT
2.1 IPsec简介
因为在Internet 早期,安全的需求非常少,在IP 协议设计之初并没有考虑安全性,因此标准的IP 协议是不安全的。随着Internet 上的商业发展,安全问题日益突出,必须建立新的安全协议标准来满足这种需求,IPsec(IP Security)协议应运而生。
IPsec在三个方面保证了网络数据包的安全:机密性、完整性、认证性。机密性就是保证数据包的原始内容不被看到;完整性即保证数据包的内容不会被修改;认证性保证数据来自被信任的客户端。因此不可避免地会使用多种加密算法来修改数据包的内容。修改后的数据包有2种主要的封装形式: AH (Authentication Header) 和ESP (Encapsulating SecurityPayload)。 AH在IP数据包中插入了一个包头,其中包含对整个数据包内容的校验值。AH只用于对IP 数据包的认证,而并不对数据包认证作任何修改。ESP用户加密整个数据包内容,同时也可以对数据包进行认证。AH和ESP 可以同时使用也可以分开使用。
IPsec 在传输数据的时候有2 种不同的模式:传输模式和隧道模式。传输模式主要用于主机到主机之间的直接通信;而隧道模式主要用于主机到网关或网关到网关之间。传输模式和隧道模式主要在数据包封装时有所不同。在传输模式中,只有IP包的传输层部分被修改(认证或者加密)。而在隧道模式中,整个数据包包括IP头都被加密或认证。
在传输和隧道模式下的数据封装形式如图2所示,图中DATA为原IP报文数据。
图2 IPsec VPN数据封装形式
2.2 IPsec与NAT 的矛盾
在多数情况下NAT 的处理对用户使用是完全透明的,但是当希望使用IPsec 技术组建VPN 网络时,NAT 却带来了很大的麻烦。IPsec协议的主要目标之一是保护IP数据包的完整性,这意味着IPsec会禁止任何对数据包的修改。但是NAT 处理过程是需要修改IP 数据包的IP 头数据、传输层报文头数据甚至传输数据的内容(如FTP 应用),才能够正常工作。所以一旦经过IPsec 处理的IP 包穿过NAT设备时,包内容被NAT 设备所改动,修改后的数据包到达目的主机后其解密或完整性认证处理就会失败,于是这个报文被认为是非法数据而被丢弃。这就是组建VPN 网关最常见的“IPsec 与NAT 协调工作”的问题。那么在什么时候我们会遇到这个问题呢?如果我们的VPN 设备在NAT设备的后面,如果我们在外地上网需要通过VPN客户端访问公司内网,如果我们没有独立的公网地址,只能通过服务商接入Internet 等等,都会遇到这个问题。
无论传输模式还是隧道模式,AH都会认证整个数据包。不同于ESP 的是,AH还会认证位于AH头之前的IP 头。当NAT 设备修改了IP 头之后,IPsec 就会认为这是对数据包完整性的破坏,从而丢弃数据包。因此AH 是绝对不可能和NAT 在一起工作的。
我们再来看看使用ESP时的情况。ESP在传输模式时会保护TCP/UDP头,但是并不保护IP 头,因此修改IP 地址并不会破坏整个数据包的完整性。但是如果数据包是TCP/UDP数据包,NAT设备就需要修改数据包的校验值,而这个校验值是被ESP 所保护的,这样却会导致完整性校验失败。所以最终可能和NAT一起工作的只能是隧道模式下的ESP。
IKE和NAT工作时也同样存在着冲突。在IKE中第一阶段和第二阶段协商中会使用IP地址作为ID负载的内容。IKE报文穿越NAT后由于地址的改变会导致出现不一致的问题。IKE使用的源端口与目的端口号都是500。如果存在地址端口转换的情况,IKE报文的源端口将被改变,这样如果响应者判断源端口不是500,可能会存在协商问题。因此如果存在NAPT网关,要支持NAT穿越,必须支持非500端口发起的IKE报文,并且能够正确回应到这个非500端口。
2.3 IPsec和NAT求同存异
现在有许多的解决方案来解决NAT 和IPsec 共存问题,这里我们主要讨论一种最主要的解决方法:NAT-T和NAT穿越。NAT-T设计简单,不需要改动已有的设备或者协议,只需要边界设备支持即可。这个技术的基本思路是在IPsec 封装好的数据包外再进行一次UDP 的数据封装。这样,当此数据包穿过NAT 网关时,被修改的只是最外层的IP/UDP 数据,而对其内部真正的IPsec 数据没有进行改动;在目的主机处再把外层的IP/UDP 封装去掉,就可以获得完整的IPsec 数据包。NAT-T在实际运作时,第一步是判断通信的双方是否支持NAT-T,这主要通过IKE协商时彼此发送的第一个数据包来判断。在判断双方均支持NAT-T后,进入到第二步,判断双方通信路径上是否存在NAT设备,这一步通常被称为NAT发现。NAT发现的原理实际上就是判断通信双发的IP 地址或者端口是否发生了改变。当发现NAT 设备以后,NAT-T 双方开始协商所采用的数据包封装方式,至此完成协商过程。
在NAT发现步骤中感知到NAT设备存在的情况下,除了对数据包进行ESP 处理外,还需要额外的进行一些其他的处理和封装。即对IPsec 通信数据采用UDP 和IKE端口的包头进行封装,因此这种封装后的数据包实际上和正常的IKE 协商数据包有相同的包头(IP 头和UDP头),从而避免防火墙对IPsec 通信数据和IKE协商数据使用不同的安全策略。NAT-T 后数据包的封装格式如图3、图4所示。
图3 UDP封装传输模式的IPsec对报文的封装
图4 UDP封装隧道模式的IPsec对报文的封装
通过在IP 头后,ESP 包头之前插入一个UDP 包头来完成NAT-T 的UDP 封装。这样的数据包在经过NAT 设备时就会被认为是一个正常的UDP数据包,从而完成NAPT转换,数据包到达VPN网关时也不会校验设备。显然,NAT-T加大了数据包的长度和负载,大约为每个数据包增加了20Byte的长度。这增加了设备处理的时间和负担。但是对应NAT-T的实现简单和安全而言,这是非常值得的,因此NAT-T实际上已成为VPN设备的必备功能。一些IKE报文敏感的NAT网关会对IKE进行特殊处理,针对该问题,采用了新的UDP端口号4500。这样支持NAT-T的设备不仅监听UDP 500,同时监听UDP 4500端口。
3 L2TP与NAT
3.1 L2TP简介
L2TP(Layer 2 Tunnel Protocol)称为二层隧道协议,是为在用户和企业的服务器之间透明传输PPP报文而设置的隧道协议,L2TP最大的优势在于充分利用了PPP协议的优势,提供了认证、地址分配等功能,非常适合远程用户或者分支机构通过Internet连接企业总部的私网。从某个角度来讲,L2TP实际上是一种PPPoIP的应用,就像PPPoE、PPPoA、PPPoFR一样,都是一些网络应用想利用PPP的一些特性,弥补本网络自身的不足。
为了支持L2TP这种PPPoIP的应用,各厂家在实现引进了虚接口去处理。一般都使用VT口作为一个配置管理的载体,VT如何具体去实现,各厂家在实现上有些细微的差别。
L2TP中定义了3个角色,CLIENT、LAC、LNS。LAC与LNS间是一个IP网络,LAC与CLIENT之间一般是一个PPP链路(常用的是PPPoE、DDR方式的PPP等)。L2TP的目的是在CLINET与LNS之间建立一条跨LAC的PPP链路,LAC透明传输PPP包文(封装到IP包文,具体是UDP)到LNS。
在L2TP应用中,PPP链路建立过程是这样的,首先是CLINET与LAC间进行LCP协商,一般接着会进行验证,验证通过后,LAC开始将验证包文等后续包文透明传送到LNS,也就是相当于在LNS与CLINET之间接着进行验证与IPCP协商,IPCP协商通过后,PPP链路就建立了。
3.2 L2TP与NAT可以共存
先看一下RFC2661对L2TP隧道端口号的描述:
L2TP使用已注册UDP端口1701[RFC1700]。整个L2TP包,包含负载和L2TP报头,被放在UDP报文中发送出去。L2TP隧道的初始化者选择一个可用的源UDP端口(可能是1701或者不是)然后发送到期望的目的地址的1701端口。接收者找到系统的一个空闲的端口(可能是或者不是1701端口),然后发送它的回复到初始化连接者的UDP端口和地址,发送的源端口号是找到的这个空闲的端口号。一旦源和目的端口还有地址建立连接以后,他们必须在隧道生命周期中保持稳定。上面建议指出接受者使用随意的端口号(和初始化隧道所用数据包不同的目的端口号,比如1701)将使得L2TP在穿越一些NAT设备的时候会更加困难,实现者在选择源端口的时候应该考虑这些隐含的冲突。
从上面这段话中可以看出为了穿越NAT,接受者已经不能使用随意的源端口号,而是必须使用1701端口了。
再来看一下L2TP VPN的封装格式,如图5所示,其存在UDP传输层的端口号,报文支持进行NAT穿越。
图5 L2TP VPN封装格式
图6 L2TP VPN报文抓包
另外我们知道,L2TP实际上就是完成PPP Over IP的工作,L2TP首先需要建立L2TP Tunnel,然后在L2TP Tunnel上建立Incoming或者Outgoing Session,最后建立PPP Session,所有的L2TP需要承载的数据信息都是在PPP连接中进行传递的。
关于L2TP Tunnel、Session和PPP的关系如图7所示:
l L2TP Tunnel:用于建立L2TP控制连接,并且确定本地和远程的Tunnel ID,Tunnel ID是本地有效的。所有后续的L2TP报文都必须在建立了Tunnel以后在Tunnel中传输,建立L2TP控制连接需要完成检查Peer ID、检查Peer L2TP版本以及协商Peer的能力等过程。
l L2TP Session:可以是Incoming Session(由LAC发起)或者Outgoing Session(由LNS发起),L2TP Session的主要作用是协商Session ID(也是本地有效)、认证呼叫类型(Modem、ISDN)、认证呼叫信息(Calling Number、Called Number和Subaddress)等。
l PPP Session:LAC将Client的PPP信息通过L2TP Session透传给LNS,使Client和LNS之间建立一个PPP Session,透传的PPP信息包括LCP和NCP的所有参数,由LNS对Client进行认证以及地址的分配。
L2TP隧道协商过程中,没有使用到IP地址信息,可以说该协议是与NAT可以共存的。
4 GRE与NAT
4.1 GRE简介
GRE是对某些网络层协议(如:IP,IPX,AppleTalk等)的数据报文进行封装,使这些被封装的数据报文能够在另一个网络层协议(如IP)中传输,这是GRE最初的定义。最新的GRE封装规范,已经可以封装二层数据帧了,如PPP帧、MPLS等。在RFC2784中,GRE的定义是“X over Y”,X和Y可以是任意的协议。
GRE隧道不能配置二层信息,但可以配置IP地址。GRE利用为隧道指定的实际物理接口完成转发,转发过程如下:
(1)所有发往远端VPN的原始报文,首先被发送到隧道源端。
(2)原始报文在隧道源端进行GRE封装,填写隧道建立时确定的隧道源地址和目的地址,然后再通过公共IP网络转发到远端VPN网络。
4.2 GRE与NAT誓不两立
我们首先来看一下GRE隧道的封装格式:
图8 GRE封装的报文
对于GRE的封装,从图8的抓包我们能清楚的看到,它没有传输层端口,不能进行NAPT转换。如果使用静态的NAT穿越,即使用一对一的NAT方式,GRE是可以支持的,但是由于这里所说的NAT设备都是指运营商网络中的,企业用户无法进行控制。另外GRE隧道两端需也要静态指定对端的公网IP,如果穿越NAT,报文的原IP地址发生改变后,隧道将无法匹配。因此在某种意义上,我们可以说GRE和NAT誓不两立,无法共存。
如果说用户一定要使用GRE VPN,且中间链路存在NAT时,一般通过VPN嵌套的方式来实现,譬如在GRE的隧道之上嵌套一层IPsec VPN隧道,通过IPsec可以穿越NAT的特性来达到用户需求,这也是一类较为常见的解决方案。
5 SSL VPN与NAT
5.1 SSL VPN简介
SSL(Secure Sockets Layer,安全套接层)是一个安全协议,为基于TCP的应用层协议提供安全连接,如SSL可以为HTTP协议提供安全连接。SSL协议广泛应用于电子商务、网上银行等领域,为网络上数据的传输提供安全性保证。SSL VPN系统是一款采用SSL连接建立的安全VPN系统,为企业移动办公人员提供了便捷的远程接入服务。
SSL VPN的最大特色就是使用Web反向代理技术实现所谓的Web接入,使得用户可以只通过浏览器来访问内网资源。同时,为了适应已有的基于TCP/IP的应用程序,SSL VPN又提供了另外两种接入方式:端口转发和网络扩展。这样SSL VPN不但能做到对内部网络的全面访问,还能提供更安全、更方便的接入服务。
5.2 SSL VPN与NAT天然共存
SSL(Secure Socket Layer)安全套接层是一种运行在两台机器之间的安全通道协议;也可以运行在SSL代理和PC之间;其功能为保护传输数据(加密)和识别通信机器(认证);SSL提供的安全通道是透明的,几乎所有基于TCP的协议稍加改动就可以直接运行于SSL之上。
不管SSL VPN运行在哪种模式下,都是以HTTPS(以SSL为基础的HTTP)为基础的VPN,VPN建立的过程和普通的TCP连接没有太大的区别,协议对NAT不敏感。
另外SSL VPN封装后的报文,为TCP的报文,存在传输层的端口,NAT对其没有任何的影响。
图9 SSL VPN封装报文
6 总结
从上文中的分析,我们可以得出这样的结论,传统VPN中的SSL VPN和L2TP VPN与NAT天然可以共存,IPsec VPN在部分模式下可以与NAT共存,而GRE则无法穿越NAT网路。