GRE详解

GRE定义:

通用路由封装协议GRE(Generic Routing Encapsulation)可以对某些网络层协议(如IPX、ATM、IPv6、AppleTalk等)的数据报文进行封装,使这些被封装的数据报文能够在另一个网络层协议(如IPv4)中传输。

GRE提供了将一种协议的报文封装在另一种协议报文中的机制,是一种三层隧道封装技术,使报文可以通过GRE隧道透明的传输,解决异种网络的传输问题。

GRE的优点

•GRE实现机制简单,对隧道两端的设备负担小。

•GRE隧道可以通过IPv4网络连通多种网络协议的本地网络,有效利用了原有的网络架构,降低成本。

•GRE隧道扩展了跳数受限网络协议的工作范围,支持企业灵活设计网络拓扑。

•GRE隧道可以封装组播数据,和IPSec结合使用时可以保证语音、视频等组播业务的安全。

•GRE隧道支持使能MPLS LDP,使用GRE隧道承载MPLS LDP报文,建立LDP LSP,实现MPLS骨干网的互通。

•GRE隧道将不连续的子网连接起来,用于组建VPN,实现企业总部和分支间安全的连接。

基本原理

实现过程

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

通过GRE隧道实现X协议互通组网图

go gre隧道代码编写 gre隧道作用_安全

•封装

1.Ingress PE从连接X协议网络的接口接收到X协议报文后,首先交由X协议处理。

2.X协议根据报文头中的目的地址在路由表或转发表中查找出接口,确定如何转发此报文。如果发现出接口是GRE Tunnel接口,则对报文进行GRE封装,即添加GRE头。

3.根据骨干网传输协议为IP,给报文加上IP头。IP头的源地址就是隧道源地址,目的地址就是隧道目的地址。

4.根据该IP头的目的地址(即隧道目的地址),在骨干网路由表中查找相应的出接口并发送报文。之后,封装后的报文将在该骨干网中传输。

•解封装

解封装过程和封装过程相反。

1.Egress PE从GRE Tunnel接口收到该报文,分析IP头发现报文的目的地址为本设备,则Egress PE去掉IP头后交给GRE协议处理。

2.GRE协议剥掉GRE报头,获取X协议报文,再交由X协议对此数据报文进行后续的转发处理。

报文格式

GRE封装后的报文格式如图2所示。
•乘客协议(Passenger Protocol):封装前的报文称为净荷,封装前的报文协议称为乘客协议。

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

•传输协议(Transport Protocol或者Delivery Protocol):负责对封装后的报文进行转发的协议称为传输协议。

go gre隧道代码编写 gre隧道作用_恰饭_02

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

表1 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协议,协议代码为0800。

Ethernet over GRE协议的协议代码为0x6558。

Checksum

对GRE头及其负载的校验和字段。

Key

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

GRE的安全机制

GRE本身提供两种基本的安全机制:

•校验和验证

•识别关键字

GRE的安全机制

校验和验证

校验和验证是指对封装的报文进行端到端校验。

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

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

识别关键字

识别关键字(Key)验证是指对Tunnel接口进行校验。通过这种弱安全机制,可以防止错误识别、接收其它地方来的报文。

RFC1701中规定:若GRE报文头中的K位为1,则在GRE头中插入一个四字节长关键字字段,收发双方将进行识别关键字的验证。

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

GRE的keepalive检测

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

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

Keepalive检测功能的实现过程如下:
1.当GRE隧道的源端使能Keepalive检测功能后,就创建一个定时器,周期地发送Keepalive探测报文,同时通过计数器进行不可达计数。每发送一个探测报文,不可达计数加1。

2.对端每收到一个探测报文,就给源端发送一个回应报文。

3.如果源端的计数器值未达到预先设置的值就收到回应报文,就表明对端可达。如果源端的计数器值到达预先设置的值——重试次数(Retry Times)时,还没收到回送报文,就认为对端不可达。此时,源端将关闭隧道连接。但是源端口仍会继续发送Keepalive报文,若对端Up,则源端口也会Up,建立隧道链接。

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

Ethernet over GRE

通用路由封装协议GRE(Generic Routing Encapsulation)提供了将一种协议报文封装在另一种协议报文中的机制,使报文能够在异种网络中传输,这种在异种网络中传输报文的通道称为隧道(Tunnel)。

目前,GRE隧道可以通过两种隧道接口建立:
•GRE隧道接口

GRE隧道接口是为实现报文的封装而提供的一种点对点类型的逻辑接口,包含源地址、目的地址和隧道接口IP地址。

•mGRE隧道接口

mGRE隧道接口是为实现DSVPN而提供的一种点到多点类型的逻辑接口,包含源地址、目的地址和隧道接口IP地址。

与GRE隧道接口手工指定目的地址不同,mGRE隧道接口的目的地址来自于NHRP地址解析协议,一个mGRE隧道接口上,可以存在多条GRE隧道,有多个GRE对端。

如图1所示,分支与总部的网络都是以太网络,分支与总部之间通过IP骨干网相连,如果用户希望分支与总部之间能够互通,可以部署Ethernet over GRE功能,实现以太报文通过GRE隧道进行透传。

go gre隧道代码编写 gre隧道作用_go gre隧道代码编写_03

Ethernet over GRE是将以太网协议的报文通过GRE封装后,在另一个网络层协议(如IPv4)的网络中传输,具体工作原理如下:

1.在设备LAN侧的物理以太网接口GE2/0/0上绑定二层VE接口VE0/0/2,在设备WAN侧的Tunnel接口Tunnel0/0/1上绑定二层VE接口VE0/0/1。

2.Router_1的LAN侧物理以太网接口GE2/0/0收到分支网络的以太报文,以太报文中携带了VLAN Tag信息。

3.GE2/0/0收到的以太报文转发到VE0/0/2后,在VE0/0/2上进行入接口VLAN处理,然后在设备内基于MAC和VLAN进行二层转发,找到出接口VE0/0/1。

4.以太报文在VE0/0/1上进行出接口VLAN处理后,将转发到VE0/0/1绑定的Tunnel0/0/1接口,经过GRE封装(协议代码为0x6558)后,进行后续的GRE转发处理。

5.Router_2的Tunnel0/0/1接口上对收到的报文进行GRE解封装,检查到协议代码为0x6558后,将以太报文转发给入接口VE0/0/1。

6.在VE0/0/1上进行入接口VLAN处理后,二层转发给VE0/0/2进行出接口VLAN处理。

7.以太报文中携带新的VLAN Tag信息从出接口GE2/0/0发往总部网络。下面我们举个配置GRE的例子

配置GRE通过OSPF实现IPv4协议互通示例

组网拓扑

go gre隧道代码编写 gre隧道作用_go gre隧道代码编写_04


配置思路

要实现PC1和PC2通过公网互通。需要在RouterA和RouterC之间使用GRE隧道直连,其中Tunnel接口和与私网相连接口上使用OSPF路由,PC1和PC2就可以互相通信了。为了能够检测隧道链路状态,还可以在GRE隧道两端的Tunnel接口上使能Keepalive功能。

配置GRE通过OSPF实现IPv4协议互通的思路如下:

1.在设备之间运行IGP协议实现设备互通,这里使用OSPF路由协议且进程1。

2.与PC相连的设备之间建立GRE隧道,并使能Keepalive功能,并配置与PC相连的网段运行IGP协议,这里使用OSPF进程2,和OSPF1进行隔离,使PC1和PC2之间的流量通过GRE隧道传输,实现PC1和PC2互通。

操作步骤

  1. Router-A配置文件
interface GigabitEthernet0/0/0                        
 ip address 20.1.1.1 255.255.255.0                 给接口g0/0/0配IP地址  
interface GigabitEthernet0/0/1
 ip address 10.1.1.2 255.255.255.0                 给接口g0/0/配IP地址
interface Tunnel0/0/1
 ip address 10.3.1.1 255.255.255.0                 配置Tunnel接口
 tunnel-protocol gre
 source 20.1.1.1
 destination 30.1.1.2
#
ospf 1                                             配置设备间使用OSPF路由
 area 0.0.0.0 
  network 20.1.1.0 0.0.0.255 
#
ip route-static 10.2.1.0 255.255.255.0 Tunnel0/0/1              配置要走Tunnel的静态路由

2.Router-B配置文件

interface GigabitEthernet0/0/0 
 ip address 20.1.1.2 255.255.255.0                                      给接口0/0/0配置IP地址
#
interface GigabitEthernet0/0/1
 ip address 30.1.1.1 255.255.255.0                                      给接口0/0/1配置IP地址
#

ospf 1                                                                   配置设备间使用OSPF路由   
 area 0.0.0.0 
  network 20.1.1.0 0.0.0.255 
  network 30.1.1.0 0.0.0.255

Router-C配置文件

interface GigabitEthernet0/0/0                             给接口g0/0/0配置IP地址
 ip address 30.1.1.2 255.255.255.0 
#
interface GigabitEthernet0/0/1                             给接口g0/0/配置IP地址
 ip address 10.2.1.2 255.255.255.0 
#
interface Tunnel0/0/1                                      配置Tunnel接口
 ip address 10.3.1.2 255.255.255.0 
 tunnel-protocol gre
 source 30.1.1.2
 destination 20.1.1.1
#
ospf 1                                                     配置设备间使用OSPF路由
 area 0.0.0.0 
  network 30.1.1.0 0.0.0.255 
#
ip route-static 10.1.1.0 255.255.255.0 Tunnel0/0/1         配置要走Tunnel的静态路由

验证结果

[Router-A]display tunnel-info all
 * -> Allocated VC Token
Tunnel ID           Type                 Destination           Token
----------------------------------------------------------------------
0x2                 gre                   30.1.1.2               2       
[Router-A]ping 10.3.1.2
  PING 10.3.1.2: 56  data bytes, press CTRL_C to break
    Reply from 10.3.1.2: bytes=56 Sequence=1 ttl=255 time=30 ms
    Reply from 10.3.1.2: bytes=56 Sequence=2 ttl=255 time=40 ms
    Reply from 10.3.1.2: bytes=56 Sequence=3 ttl=255 time=30 ms
    Reply from 10.3.1.2: bytes=56 Sequence=4 ttl=255 time=30 ms
    Reply from 10.3.1.2: bytes=56 Sequence=5 ttl=255 time=40 ms

  --- 10.3.1.2 ping statistics ---
    5 packet(s) transmitted
    5 packet(s) received
    0.00% packet loss
    round-trip min/avg/max = 30/34/40 ms

go gre隧道代码编写 gre隧道作用_恰饭_05


GRE Tunnel建立成功,流量可正常转发,实验结束。