当前位置:文档之家› GRE隧道技术

GRE隧道技术

Keywords 关键词:VPN GRE 隧道PDSN WAPGWAbstract 摘要:在传统的VPN组网场合中,GRE隧道技术得到了广泛的应用。

本文介绍了GRE基本原理以及GRE的应用等,可供使用GRE技术的人员参考。

List of abbreviations 缩略语清单:一、概述在传统的VPN 组网场合中,GRE 隧道技术得到了广泛的应用。

本文介绍了GRE 基本原理以及GRE 的应用等,可供使用GRE 技术的人员参考。

二、VPN 简介VPN(Virtual Private Network,虚拟专用网)是一种基于公共数据网的服务,它依靠ISP (Internet Service Provider)和NSP(Network Service Provider),在公共网络中建立虚拟专用通信网络。

VPN 可以极大地降低用户的费用,并且提供比传统专线方式更强的安全性和可靠性。

1. 隧道技术在VPN 中广泛使用了各种各样的隧道技术,有二层隧道技术,也有三层隧道技术。

那么,什么是隧道呢?隧道是一种封装技术,它利用一种网络协议来传输另一种网络协议,即利用一种网络传输协议,将其他协议产生的数据报文封装在它自己的报文中,然后在网络中传输。

实际上隧道可以看作一个虚拟的点到点连接。

例如,GRE 隧道仅支持点到点的业务接入。

隧道技术简单地说就是:原始报文在A 地进行封装,到达B 地后把封装去掉,还原成原始报文,这样就形成了一条由A 到B 的通信隧道。

隧道技术就是指包括数据封装、传输和解封装在内的全过程。

隧道是通过隧道协议实现的,隧道协议规定了隧道的建立,维护和删除规则,以及怎样将原始数据封装在隧道中进行传输。

2. 隧道协议分类隧道协议可分为:(1)第二层隧道协议,如PPTP、L2TP(2)第三层隧道协议,如GRE、IPsec三、GRE 简介GRE(Generic Routing Encapsulation,通用路由封装协议)是由Cisco 和Net Smiths 公司于1994 年提交给IETF,标号为RFC 1701、RFC 1702。

2000 年,Cisco 等公司又对GRE 协议进行了修订,称为GRE V2,标号为RFC 2784。

GRE 是对某些网络层协议(如:IP,IPX,AppleTalk 等)的数据报文进行封装,使这些被封装的数据报文能够在另一个网络层协议(如IP)中传输。

这是GRE 最初的定义,最新的GRE 封装规范,已经可以封装二层数据帧了,如PPP 帧、MPLS 等。

在RFC2784 中,GRE 的定义是“X over Y”,X 和Y 可以是任意的协议。

GRE 真的变成了“通用路由封装” 了。

GRE 协议实际上是一种封装协议,它提供了将一种协议的报文封装在另一种协议报文中的机制,使报文能够在异种网络中传输。

异种报文传输的通道称为tunnel(隧道)。

GRE 隧道不能配置二层信息,但可以配置IP 地址。

GRE 利用为隧道指定的实际物理接口完成转发,转发过程如下:(1)所有发往远端VPN 的原始报文,首先被发送到隧道源端(2)原始报文在隧道源端进行GRE 封装,填写隧道建立时确定的隧道源地址和目的地址,然后再通过公共IP 网络转发到远端VPN 网络四、GRE 的封装过程无论是何种隧道协议,其数据包格式都是由乘客协议、封装协议和运输协议3 部分组成的。

例如,以GRE 为例,GRE 协议栈如下:图1 GRE协议栈原始IP 报头净荷1. GRE 的封装过程图 2 说明了 GRE 的封装过程:原始IP 报文新IP 报头GRE 头原始IP 报头 净荷GRE 封装后的IP 报文图2 GRE 的封装过程图 2 中的原始数据包,可以是 IP 报文。

当然,GRE 也可以封装其它的协议报文,如 IPX 报文、PPP 、MPLS 等。

总结起来,GRE 的封装过程如下:当报文需要经由隧道接口处理时,IP 层的输出函数 调用 tunnel 接口的输出函数进行加封装处理。

加封装处理结束后,再进行 IP 转发。

GRE 隧道对端的解封装过程如下:当 IP 层接收到 GRE 报文,检查到外层 IP 报文头部 中的协议号是 47 时,那么,IP 层输入入口函数会根据协议开关表,直接调用 GRE 的解封 装处理函数,对 GRE 解封装。

解封装完成后,再将原始数据报文送入 IP 输入队列中,以便 进行进一步的传输。

为了对 GRE 报文有一个更好的理解,我们重点学习 GRE 报文头部的格式。

五、GRE 报文头部格式实际上,GRE 报文头部没有一个统一的格式,每个厂家具体实现的GRE 头部格式会有所差别。

但基本上都是以RFC1701 定义的GRE 头部格式为基础的。

1. RFC1701 定义的GRE 报文头部根据RFC1701,GRE 数据报文的头部有下面的格式:0 5 8 13 16 31图3 RFC1701定义的GRE报文头部格式下面,我们对GRE 报文头部进行详细的说明。

(1)C、R、K、S、s:GRE 报文头部的最前5 位,是一些标志位。

其含义如下:表1 GRE报文头部的最前5位的含义(2)Recur:bits 5-7。

Recur 域是记录允许的封装次数的计数器。

GRE 提供了一种特定的机制来防止递归封装。

如果路由器想对经过GRE 封装的数据包作进一步封装,应在封装前检查这个域。

如果Recur 域为非0,那么数据包还可以进行封装,新的GRE 报头中的Recur 域取值将减1;否则,如果Recur 域的值已经是0 了,那么这个包不可以再进行封装(3)Flags:bits 8-12。

在RFC1701 中没有定义(4)Ver:bits 13-15。

版本号。

在RFC1701 中,Ver 必须为0(5)Protocol Type:2 byte。

Protocol Type 指出GRE 报文净荷的协议类型。

RFC1701 定义的常见值如下:0x0800:IP0x8137:Novell IPX(6)Offset:2 byte。

Offset 域指出Routing 域到净荷的字节偏移(7)Checksum:2 byte。

Checksum 包括GRE 头部和净荷的IP 校验和。

当Checksum Present 位为1 时,Checksum 域有效(8)Key:4 byte。

Key 域用来标识隧道内部单个的业务流。

属于同一个业务流的数据报文使用同一个Key 值来封装,隧道的拆封点根据Key 域的值识别属于某个业务流的数据报文。

当Key Present 位为1 时,KEY 域有效(9)Sequence Number:4 byte。

Sequence Number 域用来维持GRE 隧道内数据报文的顺序。

当Sequence Number Present 位为1 时,Sequence Number 域有效(10)Routing:4 byte。

Routing 域是可选的,当Routing Present 位为1 时,Routing 域有效(11)Payload:净荷。

GRE 所封装的协议报文以上介绍的GRE 头部格式,是在最早的RFC1701 中定义的。

GRE 最新RFC 文档是:RFC2784。

2. RFC2784 定义的GRE 报文头部RFC2784 规定的GRE 头部格式如下:0 1 14 16 31图4 RFC2784定义的GRE报文头部格式可见,RFC2784 定义的GRE 报文头部格式,比RFC1701 定义的更加简单,更加通用。

我们把RFC1701 定义的GRE 头部的前几个标志位置为0,相应地,GRE 头部中的Key、Sequence Number 等域就没有了,于是就变成了RFC2784 定义的GRE 通用头部格式。

3. 其它厂家规定的GRE 报文头部由于GRE 已经发展为可以封装任意协议了,协议本身变得比较复杂。

GRE 协议在实际应用中,一般是和其它协议一起结合使用。

不同厂家定义的GRE 头部格式,和RPC1701、RFC2784 规定的格式又有着细微的不同,可以说是扩展的GRE。

例如,微软等公司定义的封装PPP 帧的GRE 头部,是在RFC1701 的基础上定义的。

只要保证封装方和解封装方采用相同的GRE 规范,甚至是厂家自己定义的私有GRE 头部格式(比如在标准GRE 头部中加入“A”标志位等),一般在应用时不会出现问题,只是不同厂家设备的互联互通性差一点而已。

所以,GRE 头部没有一个统一的封装格式,不同的GRE 头部,与RFC1701、RFC2784 定义会有所差别。

这也是我们在和不同厂家设备进行GRE 隧道对接时,需要考虑的GRE 头部格式不一致的问题。

所以,在实际应用GRE 时,请参考相关厂家的GRE 文档。

六、普通GRE 隧道配置GRE 作为一种通用的封装技术,本身涉及到很多方面的知识,比较复杂。

但普通GRE 隧道的配置比较简单,如果我们对RFC1701 规定的GRE 头部格式比较熟悉,那么,对配置命令也很好理解。

1.创建Tunnel 接口创建一个隧道(Tunnel)接口很简单,只要指定好Tunnel 接口的编号就可以了。

例如,在PDSN 上创建一个Tunnel 1/0/1,如下:R outer#conf t// 进入全局配置模式Router(config)#interface Tunnel 0 // 创建Tunnel 接口2. 配置Tunnel 接口的网络地址Tunnel 接口的网络地址可以不是公网地址,可以配置为私网IP 地址。

但隧道两端的网络地址应该在同一网段。

假设我们我们配置T unnel 接口的网络地址为:192.168.0.2,掩码:255.255.255.0。

配置命令行如下:R outer(config-if)#ip add 192.168.0.2 255.255.255.0// 配置Tunnel 接口的网络地址3. 配置Tunnel 接口的源端地址和目的端地址在创建Tunnel 接口后,还需要指定隧道的源端地址和目的端地址,一个包含这些都是真实的公网IP 地址,前者是发出GRE 报文的接口IP 地址,后者是接收GRE 报文的接口IP 地址。

在这里,我们要明白,为什么要配置Tunnel 接口的源端地址和目的端地址呢?我们知道,最终的GRE 报文还要加上一个含有公网IP 地址的IP 头部,配置的Tunnel 接口的源端地址和目的端地址就是用于运输协议----IP 协议给GER 报文加上新的公网IP 头部。

Router(config-if)#tun source源端IP 地址// 配置Tunnel 接口的源端地址Router(config-if)# tun destination 目的端IP 地址// 配置Tunnel 接口的目的端地址 Router(config-if)#no shutdown // 开启端口4. 配置Tunnel 的路由在源端路由器和目的端路由器上,都必须存在经过Tunnel 转发的路由。

相关主题