看招MTU!!!——高端路由器GRE组网中需要注意的问题

现网中大型企业IDC出口使用GRE隧道连接全国各个分支节点的组网应用越来越广泛,下面就我司高端路由器(CR16000/SR8800/SR8800-X)在该组网下的GRE应用MTU问题进行介绍。

一、高端路由器GRE隧道使用场景及故障现象

使用场景:如下图所示,高端路由器作为IDC出口设备,通过GRE隧道经过传输设备连接对端分支节点设备。

故障现象:从IDC内部设备ping对端设备地址,小包通,大包不通(大于1500字节),从出口路由器SR8800/CR16000 ping对端设备地址大包小包都正常。

二、问题分析过程

1GRE报文封装

由于本端出口路由器与对端设备通过GRE互联,因此设备在将报文转发出去时需要封装GRE头,其中GRE头内层封装原始报文的IP与以太头部,GRE头外部封装了GRE隧道源地址的IP与以太头部,如下图所示:

2GRE转发过程

IP报文到达出口设备时,查找路由表发现需要通过GRE隧道转发至对端设备,此时设备将报文送至GRE Tunnel接口,Tunnel接口在报文前封装上GRE头,再封装上外层IPv4头,IPv4头中的源地址为隧道的源端地址,目的地址为隧道的目的端地址。封装后的报文通过GRE隧道到达对端设备时,由于报文目的地址为本地地址,对端设备进行GRE报文解封装,去掉GRE头部后,再进行IPv4转发。

这个转发过程是正常报文的转发过程,如果需要转发的报文为大包(大于传输设备的MTU),则需要将报文进行分片,才能正常的转发至对端设备。这里就有所区别,首先我司高端路由器都为硬件转发设备,转发时无法对报文进行分片处理,这就带来一个问题,我们分两种情况进行介绍。

3、故障分析

当一个大包到达出口路由器时,路由器会将报文完整的转发出去,报文将不能正常转发。

1)如果此时传输设备的接口MTU小于报文长度大小并且传输设备不支持对报文进行分片的话,该报文将会被传输丢弃,导致转发不通。

2)如果此时传输设备的接口MTU小于报文长度大小,但是传输设备支持对报文进行分片,这时,传输设备对报文进行分片处理,分片的原理如下图:

需要分片的报文外层IP头的分片标记位置位:

报文将会被分片成以下两部分:

这样的分片报文到达对端设备后,需要重新组合成分片前的报文,才能进行正常的GRE终结以及下一步转发。当设备收到这样的分片报文后,同样会查看外层IP,发现目的IP地址是本身,则进行报文的解封装操作,但是在这个过程中,报文的第二部分解封装IP头后发现并没有IP头中的协议号47的GRE头部,认为报文出错,从而丢弃,使报文无法重组,剩下的第一部分成功解封装的报文载荷部分也丢失部分内容,无法通过校验,从而设备会丢弃该报文。如下图所示:该报文为分片后第2部分报文,IP头中协议号为47即GRE,但是并不存在GRE头。

三、解决方案

1、调整传输设备MTU值,使之大于报文大小,这个方法是最简单直接的解决方案,但是需要协调运营商来调整传输设备的MTU值。

2、在无法调整传输设备MTU值的情况下,可以通过在出口路由器之前进行分片,让报文分片在封装GRE头之前,使报文到达对端后能够正常重组。如下图所示,报文首先将进入防火墙设备进行分片,再进行下一步转发

分片后的报文为:

这样的分片报文转发至出口路由器后进行GRE转发,到达对端设备的报文将会是:

这样,两个分片的报文都具有GRE头,就能够进行正常的解封装IP和GRE操作,以及报文重组。

感谢您对本刊物的关注,如果您在阅读时有何感想,请点击反馈。
本期文章