返回首页

当前通讯!在IP或通用路由封装(GRE)中封装MPLS

来源:阿里云


【资料图】

RFC4023:EncapsulatingMPLSinIPorGenericRoutingEncapsulation(GRE),March2005

本备忘录的状态

本文档为Internet社区指定了Internet标准跟踪协议,并请求讨论和改进建议。本协议的标准化状态和现状请参考当前版本的《互联网官方协议标准》(STD1)。本备忘录的分发不受限制。

版权声明

版权所有(C)互联网协会(2005)。

梗概

MPLS的各种应用程序使用具有多个条目的标签堆栈。在某些情况下,可以用基于IP的封装替换堆栈的顶部标签,从而使应用程序能够在其核心路由器中未启用MPLS的网络上运行。本文档规定了两种基于IP的封装:MPLS-in-IP和MPLS-in-GRE(GenericRoutingEncapsulation,通用路由封装)。这些中的每一个都适用于某些情况。

1、动机

在MPLS的许多应用中,通过MPLS骨干网的数据包携带具有多个标签的标签堆栈。如[RFC3031-MPLS:多协议标签交换架构]的3.15节所述,每个标签代表一个标签交换路径(LabelSwitchedPath,LSP)。对于每个LSP,有一个标签交换路由器(LabelSwitchingRouter,LSR)是“LSP入口”,还有一个LSR是“LSP出口”。如果LSRA和B分别是与数据包顶部标签对应的LSP的入口和出口,则A和B是与数据包的第二个标签(即紧接在顶部标签下方的标签)对应的LSP上的相邻LSR.

顶部标签的目的(或其中一个目的)是将数据包从A传送到B,以便B可以根据第二个标签进一步处理数据包。从这个意义上说,顶部标签用作数据包其余部分的封装标头。在某些情况下,其他类型的封装头可以在不损失功能的情况下替换顶部标签。例如,IP标头或通用路由封装(GRE)标头可以替换顶部标签。由于封装的数据包仍然是MPLS数据包,因此结果是MPLS-in-IP或MPLS-in-GRE封装。

通过这些封装,LSP上相邻的两个LSR可能被IP网络分隔开,即使该IP网络不提供MPLS。

要使用这些封装中的任何一种,封装LSR必须知道

-解封装LSR的IP地址,以及

-解封装的LSR实际上支持特定的封装。

该知识可以通过手动配置或通过某种发现协议传送到封装LSR。特别地,如果隧道被用于支持特定应用程序并且该应用程序具有设置或发现协议,则该应用程序的协议可以传达该知识。传达这些知识的方式超出了本文档的范围。

2、需求说明

在本文档中,关键词“必须”、“不得”、“必需”、“应该”、“不应”、“应该”、“不应该”、“推荐”、“可以”和“可选”将按照[RFC2119-在RFC中用于表示需求级别的关键词]中的描述进行解释。

3、IP封装

MPLS-in-IP消息具有以下格式:

IPHeader/IP头

该字段包含分别在[RFC791-网络协议-INTERNETPROTOCOL]或[RFC2460]中定义的IPv4或IPv6数据报头。源地址和目的地址分别设置为封装和解封装LSR的地址。

MPLSLabelStack/MPLS标签栈

该字段包含[RFC3032]中定义的MPLS标签栈。

MessageBody/消息正文

该字段包含一个MPLS消息体。

IPv4ProtocolNumber字段或IPv6NextHeader字段设置为137,表示MPLS单播报文。(本规范不支持将MPLS-in-IP封装用于MPLS组播数据包。)

IP报头之后是MPLS数据包,如[RFC3032]中所述。这种封装导致MPLS数据包通过“IP隧道”发送。当隧道的接收端点收到一个数据包时,它通过去除IP头来解封装MPLS数据包。然后将数据包作为接收到的MPLS数据包进行处理,其“传入标签”[RFC3031]是解封装数据包的最顶部标签。

4、GRE中的封装

MPLS-in-GRE封装将MPLS数据包封装在GRE[RFC2784]中。然后,数据包由IP标头(IPv4或IPv6)、GRE标头和MPLS标签堆栈组成,如[RFC3032-MPLS标签栈编码]中所述。GRE报头中的协议类型字段必须设置为MPLS单播(0x8847)或组播(0x8848)的Ethertype值。

这种封装导致MPLS数据包通过“GRE隧道”发送。当隧道的接收端点收到数据包时,它会通过删除IP和GRE标头来解封装MPLS数据包。然后将数据包作为接收到的MPLS数据包进行处理,其“传入标签”[RFC3031]是解封装数据包的最顶部标签。

某些过程对于MPLS-in-IP和MPLS-in-GRE封装都是通用的。在下文中,其地址出现在封装IP标头的IP源地址字段中的封装器称为“隧道头”。解封装器的地址出现在解封装IP标头的IP目标地址字段中,称为“隧道尾”。

如果正在使用IPv6(对于MPLS-in-IPv6或MPLS-in-GRE-in-IPv6),[RFC2473]的程序通常适用。

5.1、防止分片和重新组装

如果MPLS-in-IP或MPLS-in-GRE数据包被分片(由于“普通”IP分片),隧道尾部将必须在包含的MPLS数据包被解封装之前重新组装它。当隧道尾部是路由器时,这可能是不可取的;隧道尾部可能没有能力或资源以必要的性能水平进行重组。

是否允许隧道数据包的分片必须在隧道头配置。默认值必须是数据包不被分片。只有在知道隧道尾部可以充分执行重组功能时才会更改默认值。

本节其余部分规定的程序仅适用于不分片的数据包。

显然,如果不将数据包分片,则隧道头在封装数据包之前不得将其分片。

如果使用IPv4,则隧道必须设置DF位。这可以防止隧道中的中间节点执行分片。(如果使用IPv6,中间节点在任何情况下都不会执行分片。)

隧道头应该执行路径MTU发现([RFC1191-你了解MTU和TCPMSS不?]forIPv4,或[RFC1981]forIPv6)。

隧道头必须为每个隧道维护一个“隧道MTU”;这是(a)管理配置值和(b)发现的路径MTU值减去封装开销中的最小值。

如果隧道头接收到一个大小超过隧道MTU的MPLS数据包进行封装,则该数据包必须被丢弃。但是,静默丢弃此类数据包可能会导致严重的操作问题;数据包的发起者会注意到他的数据没有通过,但他可能没有意识到大数据包正在导致数据包丢失。因此,他可以继续发送被丢弃的数据包。路径MTU发现可以提供帮助(如果隧道头发回ICMP错误),但在隧道头处通常没有足够的可用信息来正确识别始发发送者。为了尽量减少问题,建议在实践中将MTU设计得足够大以避免分片。

在某些情况下,隧道头接收用于封装的IP数据包,它首先封装在MPLS中,然后封装在MPLS-in-IP或MPLS-in-GRE中。如果IP数据包的源可以从隧道头到达,并且如果在MPLS中封装数据包的结果将是一个大小超过隧道MTU的数据包,那么隧道头应该使用的值在外面进行分片和PMTU发现隧道是隧道MTU值减去MPLS封装的大小。(也就是说,隧道MTU值减去MPLS封装的大小就是要在ICMP消息中报告的MTU。)该数据包将不得不被丢弃,但隧道头应将丢弃的数据包的IP源发送到[RFC1191]或[RFC1981]中指定的正确ICMP错误消息。

5.2、TTL或跳数限制

隧道头可以将MPLS标签栈中的TTL放入封装IPv4头的TTL字段或封装IPv6头的HopLimit字段中。隧道尾部可以将来自封装IPv4报头的TTL或来自封装IPv6报头的HopLimit放入MPLS报头的TTL字段中,但前提是这不会增加MPLS报头中的TTL值。

是否进行此类修改以及如何进行修改的细节将取决于隧道尾部和隧道头部的配置。

5.3、差异化服务

本文档中指定的过程使LSP能够通过IP或GRE隧道发送。[RFC2983]详细说明了在存在IP-in-IP隧道的情况下必须应用的许多考虑因素和程序,以正确支持差异化服务架构。这些注意事项和程序也适用于存在MPLS-in-IP或MPLS-in-GRE隧道的情况。

因此,当隧道头将要发送MPLS数据包到MPLS-in-IP或MPLS-in-GRE隧道时,封装IPv4或IPv6头的DS字段的设置可以(至少部分地)由MPLS数据包的“行为聚合”。[RFC3270]中规定了确定MPLS数据包行为聚合的过程。

类似地,在隧道尾部,封装的IPv4或IPv6头的DS字段可以用来确定封装的MPLS数据包的行为聚合。[RFC3270]规定了行为聚合和数据包的后续处置之间的关系。

6、适用性

MPLS-in-IP封装效率更高,在其他条件相同的情况下,它通常被认为是更可取的。但是,在某些情况下可以使用MPLS-in-GRE封装:

-两台路由器在GRE隧道上“相邻”,该隧道由于某种原因存在,超出了本文档的范围,并且这两个路由器必须通过该相邻发送MPLS数据包。由于通过此邻接发送的所有数据包都必须具有GRE封装,因此MPLS-in-GRE封装比替代方案更有效,即MPLS-in-IP封装然后封装在GRE中。

-实施考虑可能决定MPLS-in-GRE的使用。例如,某些硬件设备可能只能处理其快速路径中的GRE封装。

7、IANA考虑

IANA已为MPLS-in-IP封装分配了IP协议编号137,如第3节所述。以后不需要IANA采取任何行动。MPLS-in-GRE封装不需要任何IANA操作。

8、安全考虑

使用IP或GRE隧道时面临的主要安全问题是,隧道的接收端点可能会收到看似来自隧道的数据包,但实际上并未由隧道的传输端点放入隧道。(指定的封装本身并不能使解封装器对封装器进行身份验证。)

第二个问题是数据包在进入隧道和离开的时间之间有可能被改变。(指定的封装本身并不能向解封装器保证数据包的完整性。)

第三个问题是当数据包通过隧道传输时,数据包的内容可能会被看到。(规范封装不确保隐私。)这些问题在实践中的重要性取决于其流量通过隧道发送的应用程序的安全要求。例如,如果生成数据包的应用程序不需要隐私,则隧道数据包缺乏隐私并不是一个重要问题。

由于使用所描述的封装机制的不同应用程序具有不同的潜在安全要求、部署场景和性能考虑因素,因此本规范将IPsec支持定义为OPTIONAL。如果实现了IPsec,基本实现要求在8.1节中描述。如果未实施IPsec,则可能必须实施和部署其他机制。这些将在第8.2节中讨论。

8.1、使用IPsec保护隧道

如果使用IPsec保护MPLS-in-IP或MPLS-in-GRE隧道,所有这些安全问题都可以避免。如果实施了IPsec,则本节中定义的实施要求适用。

当使用IPsec时,隧道头和隧道尾应被视为安全关联的端点。为此,隧道头的单个IP地址将用作源IP地址,隧道尾的单个IP地址将用作目的IP地址。每个节点知道另一个节点的正确地址的方式超出了本文档的范围。如果使用控制协议来建立隧道(例如,将另一个隧道的IP地址通知一个隧道端点),则控制协议必须具有身份验证机制,并且必须在建立隧道时使用此机制。如果隧道是自动建立的,例如由BGP分发的信息,那么使用BGP的基于MD5的认证机制是令人满意的。

MPLS-in-IP或MPLS-in-GRE封装的数据包应被视为起源于隧道头,目的地为隧道尾;因此应该使用IPsec传输模式。

当隧道头使用IPsec传输模式来保护MPLS-in-IP数据包时,MPLS-in-IP数据包的IP报头将成为结果数据包的外部IP报头。后面跟着一个IPsec标头,后面跟着MPLS标签栈。IPsec标头必须使用第3节中指定的IP协议编号将负载类型设置为MPLS。如果IPsec传输模式应用于MPLS-in-GRE数据包,则GRE标头跟在IPsec标头之后。

在隧道尾部,IPsec出站处理恢复包含的MPLS-in-IP/GRE数据包。然后隧道尾部剥离封装的IP/GRE标头以恢复MPLS数据包,然后根据其标签堆栈转发该数据包。

标签: MPLS