作者:【吴业亮】
博客:https://wuyeliang.blog.csdn.net/
定义
通用路由封装协议GRE(Generic Routing Encapsulation)可以对某些网络层协议(如IPX、IPv6、AppleTalk等)的数据报文进行封装,使这些被封装的数据报文能够在另一个网络层协议(如IPv4)中传输。
GRE提供了将一种协议的报文封装在另一种协议报文中的机制,是一种三层隧道封装技术,使报文可以通过GRE隧道透明的传输,解决异种网络的传输问题。
优势
1、GRE实现机制简单,对隧道两端的设备负担小。
2、GRE隧道可以通过IPv4网络连通多种网络协议的本地网络,有效利用了原有的网络架构,降低成本。
3、GRE隧道扩展了跳数受限网络协议的工作范围,支持企业灵活设计网络拓扑。
4、GRE隧道将不连续的子网连接起来,用于组建VPN,实现企业总部和分支间安全的连接。
封装与解封装
封装
1.网络设备从连接X协议的接口接收到X协议报文后,首先交由X协议处理。
2.X协议根据报文头中的目的地址在路由表或转发表中查找出接口,确定如何转发此报文。如果发现出接口是GRE Tunnel接口,则对报文进行GRE封装,即添加GRE头。
3.根据骨干网传输协议为IP,给报文加上IP头。IP头的源地址就是隧道源地址,目的地址就是隧道目的地址。
4.根据该IP头的目的地址(即隧道目的地址),在骨干网路由表中查找相应的出接口并发送报文。之后,封装后的报文将在该骨干网中传输。
解封装
1.网络设备从GRE Tunnel接口收到该报文,分析IP头发现报文的目的地址为本设备,则网络设备去掉IP头后交给GRE协议处理。
2.GRE协议剥掉GRE报头,获取X协议,再交由X协议对此数据报文进行后续的转发处理。
报文格式
GRE封装后的报文结构。
•乘客协议(Passenger Protocol):封装前的报文称为净荷,封装前的报文协议称为乘客协议。
•封装协议(Encapsulation Protocol):GRE Header是由封装协议完成并填充的,封装协议也称为运载协议(Carrier Protocol)。
•传输协议(Transport Protocol或者Delivery Protocol):负责对封装后的报文进行转发的协议称为传输协议。
1、C
校验和验证位。
•该位置1,表示GRE头插入了校验和(Checksum)字段。
•该位置0,表示GRE头不包含校验和字段。
2、K
关键字位。
•该位置1,表示GRE头插入了关键字(Key)字段。
•该位置0,表示GRE头不包含关键字字段。
3、Recursion
表示GRE报文被封装的层数。完成一次GRE封装后将该字段加1。如果封装层数大于3,则丢弃该报文。该字段的作用是防止报文被无限次的封装。
4、Flags
预留字段。当前必须置为0。
5、Version
版本字段。必须置为0。
6、Protocol Type
标识乘客协议的协议类型。常见的乘客协议为IPv4协议,协议代码为0800。
7、Checksum
对GRE头及其负载的校验和字段。
8、Key
关键字字段,隧道接收端用于对收到的报文进行验证。
GRE的Keepalive检测
由于GRE协议并不具备检测链路状态的功能,如果对端接口不可达,隧道并不能及时关闭该Tunnel连接,这样会造成源端会不断的向对端转发数据,而对端却因隧道不通接收不到报文,由此就会形成数据空洞。
GRE的Keepalive检测功能可以检测隧道状态,即检测隧道对端是否可达。如果对端不可达,隧道连接就会及时关闭,避免因对端不可达而造成的数据丢失,有效防止数据空洞,保证数据传输的可靠性。
Keepalive检测功能的实现过程如下:
1.当GRE隧道的源端使能Keepalive检测功能后,就创建一个定时器,周期地发送Keepalive探测报文,同时通过计数器进行不可达计数。每发送一个探测报文,不可达计数加1。
2.对端每收到一个探测报文,就给源端发送一个回应报文。
3.如果源端的计数器值未达到预先设置的值就收到回应报文,就表明对端可达。如果源端的计数器值到达预先设置的值——重试次数(Retry Times)时,还没收到回送报文,就认为对端不可达。此时,源端将关闭隧道连接。但是源端口仍会继续发送Keepalive报文,若对端Up,则源端口也会Up,建立隧道链接。
使用场景举例
1、现在有两个实验室,每个实验室只有一个IP地址(2.2.2.1/30)和对端实验室(3.3.3.2/30)是通的
2、两个实验室的网络经过了多层网络,跳了很多跳(图中示例一个网络设备)。管理员对中间的网络设备无权限修改
需求:
每个实验室有多台服务器,用的是172.16.100.0/24和192.168.8.0/24网段,现需要实现两个实验室的服务器网络互通
注意:
华为5700系列设备仅S5700HI、S5710EI和S5710HI设备支持GRE特性。
操作步骤
1.配置各物理接口的IP地址
配置SwitchA。
system-view
[HUAWEI] sysname SwitchA
[SwitchA] vlan batch 2 8
[SwitchA] interface gigabitethernet 0/0/1
[SwitchA-GigabitEthernet0/0/1] port link-type trunk
[SwitchA-GigabitEthernet0/0/1] port trunk allow-pass vlan 2
[SwitchA-GigabitEthernet0/0/1] quit
[SwitchA] interface gigabitethernet 0/0/2
[SwitchA-GigabitEthernet0/0/2] port link-type access
[SwitchA-GigabitEthernet0/0/2] port default vlan 8
[SwitchA-GigabitEthernet0/0/2] quit
[SwitchA] interface vlanif 2
[SwitchA-Vlanif10] ip address 2.2.2.1 30
[SwitchA-Vlanif10] quit
[SwitchA] interface vlanif 8
[SwitchA-Vlanif8] ip address 192.168.8.1 24
[SwitchA-Vlanif8] quit
# 配置SwitchB。
system-view
[HUAWEI] sysname SwitchB
[SwitchB] vlan batch 2 3
[SwitchB] interface gigabitethernet 0/0/1
[SwitchB-GigabitEthernet0/0/1] port link-type trunk
[SwitchB-GigabitEthernet0/0/1] port trunk allow-pass vlan 2
[SwitchB-GigabitEthernet0/0/1] quit
[SwitchB] interface gigabitethernet 0/0/2
[SwitchB-GigabitEthernet0/0/2] port link-type trunk
[SwitchB-GigabitEthernet0/0/2] port trunk allow-pass vlan 3
[SwitchB-GigabitEthernet0/0/2] quit
[SwitchB] interface vlanif 2
[SwitchB-Vlanif10] ip address 2.2.2.2 30
[SwitchB-Vlanif10] quit
[SwitchB] interface vlanif 3
[SwitchB-Vlanif20] ip address 3.3.3.1 30
[SwitchB-Vlanif20] quit
# 配置SwitchC。
system-view
[HUAWEI] sysname SwitchC
[SwitchC] vlan batch 3 100
[SwitchC] interface gigabitethernet 0/0/1
[SwitchC-GigabitEthernet0/0/1] port link-type trunk
[SwitchC-GigabitEthernet0/0/1] port trunk allow-pass vlan 3
[SwitchC-GigabitEthernet0/0/1] quit
[SwitchC] interface gigabitethernet 0/0/2
[SwitchC-GigabitEthernet0/0/2] port link-type access
[SwitchC-GigabitEthernet0/0/2] port default vlan 100
[SwitchC-GigabitEthernet0/0/2] quit
[SwitchC] interface vlanif 3
[SwitchC-Vlanif20] ip address 3.3.3.2 30
[SwitchC-Vlanif20] quit
[SwitchC] interface vlanif 100
[SwitchC-Vlanif8] ip address 172.16.100.1 24
[SwitchC-Vlanif8] quit
2.配置设备间使用OSPF路由
配置SwitchA。
[SwitchA] ospf 1
[SwitchA-ospf-1] area 0
[SwitchA-ospf-1-area-0.0.0.0] network 2.2.2.0 0.0.0.255
[SwitchA-ospf-1-area-0.0.0.0] quit
[SwitchA-ospf-1] quit
配置SwitchB。
[SwitchB] ospf 1
[SwitchB-ospf-1] area 0
[SwitchB-ospf-1-area-0.0.0.0] network 2.2.2.0 0.0.0.255
[SwitchB-ospf-1-area-0.0.0.0] network 3.3.3.0 0.0.0.255
[SwitchB-ospf-1-area-0.0.0.0] quit
[SwitchB-ospf-1] quit
配置SwitchC。
[SwitchC] ospf 1
[SwitchC-ospf-1] area 0
[SwitchC-ospf-1-area-0.0.0.0] network 3.3.3.0 0.0.0.255
[SwitchC-ospf-1-area-0.0.0.0] quit
[SwitchC-ospf-1] quit
配置完成后,在SwitchA和SwitchC上执行display ip routing-table命令,可以看到它们能够学到去往对端接口网段地址的OSPF路由。
3.配置Tunnel接口
配置SwitchA。
[SwitchA] interface tunnel 1
[SwitchA-Tunnel1] tunnel-protocol gre
[SwitchA-Tunnel1] ip address 4.4.4.1 255.255.255.0
[SwitchA-Tunnel1] source 2.2.2.1
[SwitchA-Tunnel1] destination 3.3.3.2
[SwitchA-Tunnel1] quit
# 配置SwitchC。
[SwitchC] interface tunnel 1
[SwitchC-Tunnel1] tunnel-protocol gre
[SwitchC-Tunnel1] ip address 4.4.4.2 255.255.255.0
[SwitchC-Tunnel1] source 3.3.3.2
[SwitchC-Tunnel1] destination 2.2.2.1
[SwitchC-Tunnel1] quit
4.配置静态路由
# 配置SwitchA。
[SwitchA] ip route-static 172.16.100.0 255.255.255.0 tunnel 1
# 配置SwitchC。
[SwitchC] ip route-static 192.168.8.0 255.255.255.0 tunnel 1
配置完成后,在SwitchA和SwitchC上执行display ip routing-table命令,可以看到去往对端用户侧网段的静态路由出接口为Tunnel接口。
PC1和PC2可以相互Ping通。