博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

通用路由封装协议——GRE

Posted on 2019-03-04 14:22  skytwen  阅读(15260)  评论(0编辑  收藏  举报

一、GRE简介

        通用路由封装协议GRE(Generic Routing Encapsulation)可以对某些网络层协议(如IPX、ATM、IPv6、AppleTalk等)的数据报文进行封装,使这些被封装的数据报文能够在另一个网络层协议(如IPv4)中传输。GRE提供了将一种协议的报文封装在另一种协议报文中的机制,是一种三层隧道封装技术,使报文可以通过GRE隧道透明的传输,解决异种网络的传输问题。

        GRE实现机制简单,对隧道两端的设备负担小。GRE隧道可以通过IPv4网络连通多种网络协议的本地网络,有效利用了原有的网络架构,降低成本。GRE隧道扩展了跳数受限网络协议的工作范围,支持企业灵活设计网络拓扑。GRE隧道可以封装组播数据,和IPSec结合使用时可以保证语音、视频等组播业务的安全。GRE隧道支持使能MPLS LDP,使用GRE隧道承载MPLS LDP报文,建立LDP LSP,实现MPLS骨干网的互通。GRE隧道将不连续的子网连接起来,用于组建VPN,实现企业总部和分支间安全的连接。

二、GRE实现过程

        报文在GRE隧道中传输包括封装和解封装两个过程。

          

        如上图所示,如果X协议报文从Ingress PE向Egress PE传输,则封装在Ingress PE上完成,而解封装在Egress PE上进行。封装后的数据报文在网络中传输的路径,称为GRE隧道。

        1、封装

        Ingress PE从连接X协议的接口接收到X协议报文后,首先交由X协议处理。X协议根据报文头中的目的地址在路由表或转发表中查找出接口,确定如何转发此报文。如果发现出接口是GRE Tunnel接口,则对报文进行GRE封装,即添加GRE头。根据骨干网传输协议为IP,给报文加上IP头。IP头的源地址就是隧道源地址,目的地址就是隧道目的地址。根据该IP头的目的地址(即隧道目的地址),在骨干网路由表中查找相应的出接口并发送报文。之后,封装后的报文将在该骨干网中传输。

        2、解封装

        解封装过程和封装过程相反。Egress PE从GRE Tunnel接口收到该报文,分析IP头发现报文的目的地址为本设备,则Egress PE去掉IP头后交给GRE协议处理。GRE协议剥掉GRE报头,获取X协议,再交由X协议对此数据报文进行后续的转发处理。

        3、GRE报文格式

          

  GRE封装后的报文结构如上图所示。

  1)乘客协议(Passenger Protocol):

  封装前的报文称为净荷,封装前的报文协议称为乘客协议。

  2)封装协议(Encapsulation Protocol):

  GRE Header是由封装协议完成并填充的,封装协议也称为运载协议(Carrier Protocol)。

  3)传输协议(Transport Protocol或者Delivery Protocol):

  负责对封装后的报文进行转发的协议称为传输协议。

  GRE头的各字段解释如下表所示

GRE头的各字段解释

GRE头 字段解释
C

  校验和验证位

  该位置1,表示GRE头插入了校验和(Checksum)字段

  该位置0,表示GRE头不包含校验和字段

K

  关键字位。

  该位置1,表示GRE头插入了关键字(Key)字段

  该位置0,表示GRE头不包含关键字字段

Recursion

  表示GRE报文被封装的层数。完成一次GRE封装后将该字段加1.如果封装层数大于3,则丢弃该报文。该字段的作用是防止报文被无限次的封装。

  RFC1701规定该字段默认值为0。RFC2784规定当发送和接收端该字段不一致时不会引起异常,且接收端必须忽略该字段。

  设备实现时该字段仅在加封装报文时用作标记隧道嵌套层数,GRE解封装报文时不感知该字段,不会影响报文的处理。

Flags   预留字段。当前必须置为0
Version   版本字段。必须置为0
Protocol Type   标识乘客协议的协议类型。常见的乘客协议为IPv4协议,协议代码为0x0800
Checksum   对GRE头及其负载的校验和字段。
Key

  关键字字段,隧道接收端用于对收到的报文进行验证。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  因为目前实现的GRE头不包含源路由字段,所以Bit 1、Bit 3和Bit 4都置为0

四、GRE的安全机制

  GRE本身提供两种基本的安全机制:校验和验证,识别关键字。

  1)校验和验证

  校验和验证是指对封装的报文进行端到端校验。若GRE报文头中的C位标识位置1,则校验和位有效。发送方将根据GRE头及Payload信息计算校验和,并将包含校验和的报文发送给对端。接收方对接收到的报文计算校验和,并与报文中的校验和比较,如果一致则对报文进一步处理,否则丢弃。

  隧道两端可以根据实际应用的需要决定配置校验和或禁止校验和。如果本端配置了校验和而对端没有配置,则本端将不会对接收到的报文进行校验和检查,但对发送的报文计算校验和;相反,如果本端没有配置校验和而对端已配置,则本端将对从对端发来的报文进行校验和检查,但对发送的报文不计算校验和。

  2)识别关键字

  识别关键字(Key)验证是指对Tunnel接口进行校验。通过这种弱安全机制,可以防止错误识别、接收其它地方来的报文。RFC1701中规定:若GRE报文头中的K位为1,则在GRE头中插入一个四字节长关键字字段,收发双方将进行识别关键字的验证。

  关键字的作用是标志隧道中的流量,属于同一流量的报文使用相同的关键字。在报文解封装时,GRE将基于关键字来识别属于相同流量的数据报文。只有Tunnel两端设置的识别关键字完全一致时才能通过验证,否则将报文丢弃。这里的“完全一致”是指两端都不设置识别关键字,或者两端都设置相同的关键字。

五、GRE的Keepalive检测

  由于GRE协议并不具备检测链路状态的功能,如果对端接口不可达,隧道并不能及时关闭该Tunnel连接,这样会造成源端会不断的向对端转发数据,而对端却因隧道不通接收不到报文,由此就会形成数据空洞。

  GRE的Keepalive检测功能可以检测隧道状态,即检测隧道对端是否可达。如果对端不可达,隧道连接就会及时关闭,避免因对端不可达而造成的数据丢失,有效防止数据空洞,保证数据传输的可靠性。Keeppalive检测功能的实现过程如下:

  • 当GRE隧道的源端使能Keepalive检测功能后,就创建一个定时器,周期地发送Keepalive探测报文,同时通过计数器进行不可达计数。每发送一个探测报文,不可达计数加1
  • 对端每收到一个探测报文,就给源端发送一个回应报文
  • 如果源端的计数器值未达到预先设置的值就收到回应报文,就表明对端可达。如果源端的计数器值到达预先设置的值——重试次数(Retry Times)时,还没收到回送报文,就认为对端不可达。此时,源端将关闭隧道连接。但是源端口仍会继续发送Keepalive报文,若对端Up,则源端口也会Up,建立隧道链接

  对于设备实现的GRE Keepalive检测功能,只要在隧道一端配置Keepalive,该端就具备Keepalive功能,而不要求隧道对端也具备该功能。隧道对端收到报文,如果是Keepalive探测报文,无论是否配置Keepalive,都会给源端发送一个回应报文。

六、GRE应用场景

  1)多协议本地网可以通过这GRE隧道传输

  

  如上图所示,Term1和Term2是运行IPv6的本地网,Term3和Term4是运行IP的本地网,不同地域的子网间需要通过公共的IP网络互通。通过在Router_1和Router_2之间采用GRE协议封装的隧道,Term1和Term2、Term3和Term4可以互不影响地进行通信。

  2)通过GRE扩大跳数受限的网络工作范围

  

  在上图中,网络运行IP协议,假设IP协议限制跳数为255。如果两台PC之间的跳数超过255,它们将无法通信。在网络中选取两台设备建立GRE隧道,可以隐藏设备之间的跳数,从而扩大网络的工作范围。

  例如,RIP路由的跳数为16时表示路由不可达。此时,可以在两台设备上建立GRE隧道实现逻辑直连,使经过GRE隧道的RIP路由跳数减至16以下,保证路由可达。

  3)GRE与IPSec结合,保护多播数据

  GRE可以封装多播数据并在GRE隧道中传输。

  

  如上图所示,GRE over IPSec隧道应用,对于多播数据需要在IPSec隧道中传输的情况,可以先建立GRE隧道,对多播数据进行GRE封装,再对封装后的报文进行IPSec加密,从而实现多播数据在IPSec隧道中的加密传输。

  4)通过GRE隧道组建L2VPN和L3VPN

  通常,MPLS VPN骨干网通常使用LSP作为公网隧道。如果骨干网的核心设备(P设备)不具备MPLS功能,而边缘设备(PE设备)具备MPLS功能,那么骨干网就不能使用LSP作为公网隧道。此时,骨干网可以使用GRE隧道替代LSP,从而在骨干网提供三层或二层VPN解决方案。

  LDP over GRE技术通过在GRE隧道接口上使能MPLS LDP,使用GRE隧道承载MPLS LDP报文,建立LDP LSP。

  

  如上图,企业在PE1和PE2之间部署L2VPN或者L3VPN业务,由于骨干网设备可能未启用或不支持MPLS,需要在PE1和PE2之间建立一条跨越GRE隧道的LDP LSP。

  

  如上图,骨干网P2设备支持MPLS,但P1设备不支持,此时可以通过在PE1和P2之间建立GRE隧道,从而建立一条跨越GRE隧道的LDP LSP。

  5)CE采用GRE隧道接入MPLS VPN

  基于MPLS骨干网的VPN服务可以给客户提供比传统IP VPN更优质的服务。因此,MPLS VPN技术是运营商选择的主流VPN技术。但是Internet是基于IP技术的,且基于IP技术的骨干网还是大量存在的。

  在MPLS VPN中,为了让用户端设备CE(Customer Edge)接入VPN中往往需要CE与MPLS骨干网的PE(Provider Edge)设备之间有直接的物理链路,即在同一个网络中。在这样的组网中,需要在PE上将VPN与PE到CE的物理接口进行关联。

  但实际组网中,并非所有的CE和PE都能用物理链路直接相连。例如,很多已经连接到Internet或基于IP技术的骨干网上的机构,其CE和PE设备之间地理位置上相距甚远,不可能直接接入到MPLS骨干网的PE设备上。这样就无法通过Internet或者是IP骨干网直接访问MPLS VPN内部的站点。

  

  为了让CE也能接入到MPLS VPN中,可以考虑在CE和PE之间创建“逻辑上的直连”。也就是说,可以在CE和PE间利用公共网络或某私有网络相连,并在CE与PE之间创建GRE隧道。这样,可以看成CE和PE直连。在PE上将VPN与PE-CE之间的接口进行关联时,就可以把GRE隧道当作一个物理接口,在这个接口上进行VPN关联。

  采用GRE隧道接入MPLS VPN时,GRE的实现模式可按以下三种情形来划分:

  5.1 穿过公网的GRE

  GRE隧道关联某个VPN实例,GRE隧道的源地址和目的地址为公网地址,不属于VPN实例。

  在这种组网中,CE和PE都需要有属于公网的接口,该接口需要使用公网IP地址。CE的公网路由表中需要有到PE的路由,PE公网路由表也需要有到CE的路由。

  

  5.2 穿越VPN的GRE

  GRE隧道关联某个VPN实例(例如VPN1),GRE隧道的源接口绑定了另一个VPN实例(例如VPN2),即GRE隧道需要穿越VPN2。

  与穿过公网的GRE相比,穿越VPN的GRE不同点在于CE不是通过公共网络与PE互连,而是通过另一个VPN(如VPN2)与PE互连。也就是说,CE上流向PE的私网数据的出接口及PE上返回该CE的私网数据流量的出接口都属于VPN2。

  

  例如上图中,PE1和PE2是一级运营商的MPLS骨干网边界设备。VPN2是属于二级运营商的一个VPN。CE1和CE2是属于用户的设备。为了在此网络环境中部署一个基于MPLS网络的VPN(如VPN1),可以在PE1和CE1之间搭建一个穿越VPN2的GRE,在逻辑上使CE1与PE1直连。

  5.3 私有网络的GRE

  GRE隧道关联某个VPN实例,而GRE隧道的源端口(或源地址)和目的地址也属于该VPN实例。

  在这种组网中,GRE隧道的源和目的地址都属于私有网络,在实际的应用中在私有网络里再创建一个隧道到PE,没有什么价值,因此不推荐使用。

  

  在上图中,不如直接使用R1作为CE设备。