GRE、MGRE 详解-程序员宅基地

技术标签: 网络  运维  服务器  

目录

一、GRE---通用路由封装

1.1 GRE概念

1.2 GRE报文格式

1.3 GRE报文封装与解封装

1.3.1报文封装

1.3.2报文解封装

1.4案例配置

1.5keepalive机制  

二、MGRE---多点通用路由封装

2.1 MGRE基本概念

2.2 NFRP协议

2.2.1NHRP映射表

2.2.2 NHRP动态表项建立步骤

2.3 Normal方式、Shortcut方式

2.3.1 Normal方式(非Shortcut方式)

2.3.2 Shortcut方式

参考连接:


一、GRE---通用路由封装

 三层隧道技术,并且是属于点到点的隧道

1.1 GRE概念

  • 全称:GRE(Generic Routing Encapsulation):通用路由封装协议。
  • 功能:定义了在一种网络层协议上封装另一种协议(或同一种协议)。
  • 举例:对某些网络层协议(如IP和IPX)的数据报进行封装,使这些被封装的数据报能够在另一个网络层协议(如IP)中传输。
  • 所在层次:GRE是VPN(Virtual Private Network)的第三层隧道协议,即在协议层之间采用了一种被称之为Tunnel(隧道)的技术。

 Tunnel是一个虚拟的点对点的连接,在实际中可以看成仅支持点对点连接的虚拟接口,这个接口提供了一条通路使封装的数据报能够在这个通路上传输,并且在一个Tunnel的两端分别对数据报进行封装及解封 。

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

1.2 GRE报文格式

1.3 GRE报文封装与解封装

1.3.1报文封装

  • Router A连接Group 1的接口收到X协议报文后,首先交由X协议处理;
  • X协议检查报文头中的目的地址域来确定如何路由此包;
  • 若报文的目的地址要经过Tunnel才能到达,则设备将此报文发给相应的Tunnel接口;
  • Tunnel接口收到此报文后进行GRE封装,在封装IP报文头后,设备根据此IP包的目的地址及路由表对报文进行转发,从相应的网络接口发送出去。

1.3.2报文解封装

  • Router B从Tunnel接口收到IP报文,检查目的地址;
  • 如果发现目的地是本路由器,则Router B剥掉此报文的IP报头,交给GRE协议处理(进行检验密钥、检查校验和及报文的序列号等);
  • GRE协议完成相应的处理后,剥掉GRE报头,再交由X协议对此数据报进行后续的转发处理。
  •  随着报文的封装、解封装,会导致有效数据传输效率降低, 从而导致设备对GRE数据转发速率降低。

1.4案例配置

在AR1 上的配置,AR3上的配置与之相似 

[r1]interface Tunnel 0/0/0  ---创建一个虚拟隧道接口
[r1-Tunnel0/0/0]ip address 192.168.3.1 24  --配置虚拟接口IP
[r1-Tunnel0/0/0]tunnel-protocol gre   ---定义隧道所使用的协议
[r1-Tunnel0/0/0]source 12.0.0.1   ---定义封装中的源地址信息
[r1-Tunnel0/0/0]destination 23.0.0.3  ---定义封装中的目的地址信息

添加私网路由信息,将其导入到隧道接口  

[r1]ip route-static 192.168.2.0 24 192.168.3.3
[r3]ip route-static 192.168.1.0 24 192.168.3.1

1.5keepalive机制  

keepalive机制是用来检测隧道对端是否可达。
当某端开启该机制后,会周期性发送keepalive报文,对端收到后会回复keepalive报文。当一定次数未收到回复报文,则认为该隧道不可用。(默认3次,每一次发送时间间隔为5秒)

配置命令

[r1-Tunnel0/0/0]keepalive 
[r1-Tunnel0/0/0]keepalive period 10 retry-times 5
	period:设置发送周期
	retry-times:重传次数

二、MGRE---多点通用路由封装

2.1 MGRE基本概念

  • MGRE:点到多点的GRE隧道,它是对传统的点到点GRE隧道的一种扩展。
  • MGRE与GRE只在构建隧道方式上有所差异,但其报文的封装方式和原理与GRE隧道完全一致。
  • 根据建立机制的不同,可将MGRE隧道分为静态隧道和动态隧道两种:

静态隧道:建立在Hub与Spoke之间,无论是否有流量经过,改隧道一直存在。
动态隧道:建立在spoke与spoke之间,当spoke与spoke之间有流量经过时,隧道会自动被创建;当一定周期没有流量经过时,隧道将自动拆除

2.2 NFRP协议

NHRP全称下一条解析协议,自动学习隧道地址和物理地址(公网地址)的对应关系

解决了MGRE总部与使用动态IP的分支建立隧道、分支与分支建立隧道的问题

使用NHRP协议帮助建立MGRE隧道

2.2.1NHRP映射表

将Tunnel口的地址与公网IP地址做映射,将其映射关系保存在NHRP映射表中,实现点到多点建立GRE隧道

NHRP映射表分为静态映射和动态映射

静态表项

手工配置,用于MGRE静态隧道的建立

在Spoke-分部上手工配置Hub的Tunnel地址和公网地址

动态表项

动态表项建立主要依靠主动注册和动态查询两步来实现,用于MGRE动态隧道的建立

2.2.2 NHRP动态表项建立步骤

步骤一:主动注册——解决了总部与分支动态IP建立MGRE隧道的问题

  • Spoke与Hub建立静态表项之后,会发送主动注册消息到Hub
  • Hub然后发送注册应答消息回应,使得Hub得到Spoke的Tunnel地址和公网地址的映射关系(之后Spoke会定时发送主动注册消息来保持与总部的隧道关系)

步骤二:动态查询——解决了分支与分支建立MGRE隧道的问题

使得Spoke之间互相获得对方的公网IP与Tunnel接口的映射关系,解决了分支与分支建立MGRE隧道的问题。

动态查询有两种实现方式,通过Normal方式、Shortcut方式任意一种来就可以实现

2.3 Normal方式、Shortcut方式

2.3.1 Normal方式(非Shortcut方式)

  • 要Spoke之间都有对方Tunnel口的路由(静态、OSPF都可以),通过Tunnel地址为索引查找出Spoke对应的公网IP地址
  • 要注意在使用OSPF时网络类型必须为广播方式,此种方式推荐使用OSPF

spoke_A与spoke_B之间建立动态MGRE隧道过程如下:

  1. A要和B私网之间进行通信时,首先查找自己的路由表,发现下一跳地址为1.1.1.2(Spoke2 Tunnet接口)。然后根据下一跳查找自己的NHRP映射表,发现里面没有对应表项,A会默认将该报文直接发给Hub,同时出发NHRP地址解析请求(NHRP请求中包含A的tunnel接口和公网接口地址,还有需要解析的B的tunnel地址)。
  2. Hub在接收到请求和业务报文后,会通过自己与B之间的隧道将其转发给B。
  3. B接收到A的NHRP请求后,将A的对应关系加载到自己的NHRP映射表中。同时,B也生成NHRP的应答直接返回给A。
  4. A收到B的应答后,将应答信息加载到本地NHRP映射表中,然后A和B之间动态建立MGRE隧道。

隧道建立后,A和B之间的通信会有A直接发给B,不会再经过中间Hub的中转。

2.3.2 Shortcut方式

  • Spoke只需要有去Hub的路由(静态或OSPF),不需要有去其它分支的路由,通过Hub来得到其它Spoke的公网IP与Tunnel的对应关系
  • 要注意在使用OSPF时网络类型必须为P2MP方式,不过此种方式更推荐使用静态路由

spoke_A与spoke_B之间建立动态MGRE隧道过程如下:

  1. A要和B私网之间进行通信时,首先根据目的地址查找自己的NHRP映射表,发现里面没有对应表项;所以,A会接着查找路由表,发现了目标地址对应的下一跳为Hub的地址,于是将此业务报文发送给Hub(通过静态隧道转发)
  2. Hub在收到A的报文后,将报文转发给B。
  3. 如果Hub在 转发过程中,发现接收此报文的接口和发送此报文的Tunnet接口在同一网段,Hub就会向A发送重定向的消息(携带Hub的Tunnel地址和公网地址、以及需要解析的数据报文的目的地址192.168.2.0)Hub通知A发送的NHRP请求(请求B的公网地址),要求A和B之间建立隧道直接通信,后续报文也不需要经过Hub中转。
  4. 4A向Hub发送NHRP请求(包含了A的私网网段和A的公网接口地址,以及B的私网网段),由于shortcut方式下采用的是路由聚合方案,因此A 无法学习到B的tunnel地址,只能通过B的私网地址来获取B的公网接口地址。
  5. B接收到A的NHRP请求后,将A的对应关系(A的私网地址和公网接口地址)加载到自己的NHRP映射表中。同时,B也生成NHRP的应答返回给A。
  6. A收到B的应答后,将应答信息加载到本地NHRP映射表中(B的私网地址和公网接口地址),然后A和B之间动态建立MGRE隧道。
  7. 隧道建立后,A和B之间的通信会有A直接发给B,不会再经过中间Hub的中转。

      以非shortcut方式进行DSVPN组网时,分支站点可以自主发现NHRP映射表中存在关系缺少的现象,从而主动向hub节点申请通讯对端的映射关系。而在shortcut组网环境下,分支站点无法自主发现,需要hub节点通过重定向报文参与到分支之间的隧道建立过程

参考连接:

防火墙——动态智能隧道DSVPN讲解_nhrp协议-程序员宅基地

HCIE笔记-第十天_nhrp-程序员宅基地

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_74227828/article/details/137024321

智能推荐

while循环&CPU占用率高问题深入分析与解决方案_main函数使用while(1)循环cpu占用99-程序员宅基地

文章浏览阅读3.8k次,点赞9次,收藏28次。直接上一个工作中碰到的问题,另外一个系统开启多线程调用我这边的接口,然后我这边会开启多线程批量查询第三方接口并且返回给调用方。使用的是两三年前别人遗留下来的方法,放到线上后发现确实是可以正常取到结果,但是一旦调用,CPU占用就直接100%(部署环境是win server服务器)。因此查看了下相关的老代码并使用JProfiler查看发现是在某个while循环的时候有问题。具体项目代码就不贴了,类似于下面这段代码。​​​​​​while(flag) {//your code;}这里的flag._main函数使用while(1)循环cpu占用99

【无标题】jetbrains idea shift f6不生效_idea shift +f6快捷键不生效-程序员宅基地

文章浏览阅读347次。idea shift f6 快捷键无效_idea shift +f6快捷键不生效

node.js学习笔记之Node中的核心模块_node模块中有很多核心模块,以下不属于核心模块,使用时需下载的是-程序员宅基地

文章浏览阅读135次。Ecmacript 中没有DOM 和 BOM核心模块Node为JavaScript提供了很多服务器级别,这些API绝大多数都被包装到了一个具名和核心模块中了,例如文件操作的 fs 核心模块 ,http服务构建的http 模块 path 路径操作模块 os 操作系统信息模块// 用来获取机器信息的var os = require('os')// 用来操作路径的var path = require('path')// 获取当前机器的 CPU 信息console.log(os.cpus._node模块中有很多核心模块,以下不属于核心模块,使用时需下载的是

数学建模【SPSS 下载-安装、方差分析与回归分析的SPSS实现(软件概述、方差分析、回归分析)】_化工数学模型数据回归软件-程序员宅基地

文章浏览阅读10w+次,点赞435次,收藏3.4k次。SPSS 22 下载安装过程7.6 方差分析与回归分析的SPSS实现7.6.1 SPSS软件概述1 SPSS版本与安装2 SPSS界面3 SPSS特点4 SPSS数据7.6.2 SPSS与方差分析1 单因素方差分析2 双因素方差分析7.6.3 SPSS与回归分析SPSS回归分析过程牙膏价格问题的回归分析_化工数学模型数据回归软件

利用hutool实现邮件发送功能_hutool发送邮件-程序员宅基地

文章浏览阅读7.5k次。如何利用hutool工具包实现邮件发送功能呢?1、首先引入hutool依赖<dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>5.7.19</version></dependency>2、编写邮件发送工具类package com.pc.c..._hutool发送邮件

docker安装elasticsearch,elasticsearch-head,kibana,ik分词器_docker安装kibana连接elasticsearch并且elasticsearch有密码-程序员宅基地

文章浏览阅读867次,点赞2次,收藏2次。docker安装elasticsearch,elasticsearch-head,kibana,ik分词器安装方式基本有两种,一种是pull的方式,一种是Dockerfile的方式,由于pull的方式pull下来后还需配置许多东西且不便于复用,个人比较喜欢使用Dockerfile的方式所有docker支持的镜像基本都在https://hub.docker.com/docker的官网上能找到合..._docker安装kibana连接elasticsearch并且elasticsearch有密码

随便推点

Python 攻克移动开发失败!_beeware-程序员宅基地

文章浏览阅读1.3w次,点赞57次,收藏92次。整理 | 郑丽媛出品 | CSDN(ID:CSDNnews)近年来,随着机器学习的兴起,有一门编程语言逐渐变得火热——Python。得益于其针对机器学习提供了大量开源框架和第三方模块,内置..._beeware

Swift4.0_Timer 的基本使用_swift timer 暂停-程序员宅基地

文章浏览阅读7.9k次。//// ViewController.swift// Day_10_Timer//// Created by dongqiangfei on 2018/10/15.// Copyright 2018年 飞飞. All rights reserved.//import UIKitclass ViewController: UIViewController { ..._swift timer 暂停

元素三大等待-程序员宅基地

文章浏览阅读986次,点赞2次,收藏2次。1.硬性等待让当前线程暂停执行,应用场景:代码执行速度太快了,但是UI元素没有立马加载出来,造成两者不同步,这时候就可以让代码等待一下,再去执行找元素的动作线程休眠,强制等待 Thread.sleep(long mills)package com.example.demo;import org.junit.jupiter.api.Test;import org.openqa.selenium.By;import org.openqa.selenium.firefox.Firefox.._元素三大等待

Java软件工程师职位分析_java岗位分析-程序员宅基地

文章浏览阅读3k次,点赞4次,收藏14次。Java软件工程师职位分析_java岗位分析

Java:Unreachable code的解决方法_java unreachable code-程序员宅基地

文章浏览阅读2k次。Java:Unreachable code的解决方法_java unreachable code

标签data-*自定义属性值和根据data属性值查找对应标签_如何根据data-*属性获取对应的标签对象-程序员宅基地

文章浏览阅读1w次。1、html中设置标签data-*的值 标题 11111 222222、点击获取当前标签的data-url的值$('dd').on('click', function() { var urlVal = $(this).data('ur_如何根据data-*属性获取对应的标签对象

推荐文章

热门文章

相关标签