BGPv4特性探究-7@NLRI_v4 with Next Hop_v6-RFC8950及6VPE/6PE方案-RFC4659/RFC4798
个人认为,理解报文就理解了协议。通过报文中的字段可以理解协议在交互过程中相关传递的信息,更加便于理解协议。

- 关于BGP version4相关内容,可参考2006年发布的RFC4271-A Border Gateway Protocol 4;
- 关于BGP Route-Reflect相关内容,可参考2006年发布的RFC4456-BGP Route Reflection:An Alternative to Full Mesh Internal BGP;
- 关于BGP Confederations相关内容,可参考2007年发布的RFC5065-Autonomous System Confederations for BGP;
- 关于BGP可通告Capability相关内容,可参考2009年发布的RFC5492-Capabilities Advertisement with BGP-4;
- 关于4字节AS Number相关内容,可参考2012年发布的RFC6793-BGP Support for Four-Octet Autonomous System Number Space;
自动换行
其他相关资料:
- 关于BGP的Capability Codes详细参数,可参考IANA发布的Capability Codes;
- 关于BGP的其他参数字段的详细内容,可参考IANA发布的Border Gateway Protocol (BGP) Parameters;
- 关于BGP的AFI相关参数,可参考IANA发布的Address Family Numbers;
- 关于BGP的SAFI相关参数,可参考IANA发布的Subsequent Address Family Identifiers (SAFI) Parameters;
- 关于BGP Extended Community Sub-Types,可参考IANA发布的Border Gateway Protocol Extended Communities;
- 关于常用TCP/UDP知名端口的定义,可参考IANA发布的Service Name and Transport Protocol Port Number Registry。
- 关于特殊IPv6地址空间的分类,可参考IANA发布的IANA IPv6 Special-Purpose Address Registry。
- 关于普通BGP MPLS/LDP L3VPN的基本原理,可参考《博客-BGP MPLS/LDP-3层虚拟专用网络原理介绍+报文分析+配置示例》。
......
Border Gateway Protocol自1989年定义以来已经历过4个版本:1989年RFC1105的Version1,1990年RFC1163的Version2,1991年RFC1267的Version3,1994年RFC1654的Version4。而V4又历经了几次迭代,到目前比较全面完整的是2006年发布的RFC4271。
本文档旨在介绍相关原理,对于不同设备及厂家的实现上不做深究。有意者建议阅读相关资料。个人能力有限,如有疑问欢迎留言指导~
目录
1.相关术语和概念
BGP(Border Gateway Protocol,边界网关协议) 是一个 AS(Autonomous System,自治系统) 间的路由协议。BGP 的主要功能是与其他 BGP 系统交换网络可达性信息。
为便于介绍,在此先介绍一些关于BGP的相关术语:
Autonomous System自治系统
单个路由协议管理下的一组路由器,使用内部网关协议(IGP)和通用度量来确定如何在AS内路由数据包。如果一个AS内运行了多个IGP协议,对于其他AS来说也认为其执行了内部一致的路由规则。
三张处理表/库
1@--Adj-RIB-In:邻居入方向的路由信息表/库。用于描述对等体向自己传输的完整路由信息。该路由表未进行入方向的路由策略。
2@--Adj-RIB-Out:邻居出方向的路由信息表/库。用于描述自己向对等体描述的路由信息,或者放置于Update消息报文中的路由信息。该路由表已进行出方向的路由策略。
3@--Loc-RIB:放置已被本地BGP以便进行选择的路由。该路由表已进行入方向的路由策略。
因此有如下的路由处理过程:
简单来说Adj-RIB-In和Adj-RIB-Out是放置于Update报文中的路由信息。
NLRI
Network Layer Reachability Information,网络层可达信息。放置于Update报文中,主要描述了路由信息或路由的相关属性。
IBGP/EBGP
Internal和External BGP,简单来说为相同AS的对等体关系为IBGP邻居,相反为EBGP。
相关概念:
1@:BGP 使用 TCP 的 179 端口进行相关协议报文的发送和监听。
2@:在建立了完整的 BGP 对等体关系后,BGP 只发送增量更新。而非周期性泛洪或刷新路由表。
因此 BGP 为了使路由有正确的结果需要 TCP 周期保活或使用Route-Refrsh路由刷新。
BGP 提供了如下三种机制进行路由更改:
1@:发送withdraw类型的Update报文,将该路由进行撤销
2@:发送具有相同NLRI的Update报文,进行更新。通过此种方式可以更改路由的属性。
3@:中断BGP连接。
关于 BGP 基本原理的相关内容,可参考博客-BGPv4-原理介绍+报文分析+配置示例。
2.配置示例
2.1.基本原理
2.1.1.私网NLRI_v6 with Next Hop_v4也即6VPE方案-RFC4659
在《RFC4659-BGP-MPLS IP VPN Extension for IPv6 VPN》中新提出了一种在 IPv4 网络中为 IPv6 私网孤岛实现网络通信的方案。其主要利用《RFC8277-Using BGP to Bind MPLS Labels to Address Prefixes》中定义的 <AFI 2 = IPv6,SAFI 128 = MPLS-labeled VPN address> 型 NLRI 来实现路由传递。
与 BGP/MPLS-VPN 中 VPNv4 路由的分发方式类似,BGP 可以将 VPNv6 路由从 IPv6 VPN 站点分发到所有其他 IPv6 VPN 站点 PE 路由器。相似的,PE 使用VPN Routing and Forwarding tables(VRF,VPN路由和转发表) 来单独维护每个 IPv6 VPN 的可达性信息和转发信息。
除了通过 MPLS Label Switched Paths(标签交换路径,LSP) 运行外,也允许通过其他隧道技术支持 IPv6 VPN 服务。通过 IPv4 骨干网和 IPv6 骨干网支持 IPv6 VPN 服务的这两种情况下,支持的 IPv6 VPN 服务是相同的。
在《博客-BGP MPLS/LDP-3层虚拟专用网络原理介绍+报文分析+配置示例》中详细介绍了通过 IPv4 骨干网搭建 BGP/MPLS-VPN 方案的基本原理。感兴趣者可查看相关资料。
VPN-IPv6地址族:
1@:VPN-IPv6 地址由 8 字节 Route Distinguisher 和 16 字节 IPv6 地址组成。Route Distinguisher 用于区分相同 IPv6 地址前缀的不同路由。这允许运营商将多个不同路由安装到同一系统,并允许使用策略来决定哪些数据包使用哪个路由。
2@:VPN-IPv6 地址与 IPv6 地址属于不同地址族,不具备可比性。但是,当数据包的目的地址在 VRF 中与 VPN-IPv6 路由匹配时,实际上只有 IPv6 部分相匹配。
3@:PE 路由器通过 MP-BGP 交换 IPv6 VPN 中 IPv6 前缀的可达性信息,从而宣布自己为 BGP Next Hop。
4@:当使用 IPv4 Transport 进行 IPv6 VPN 流量传输时,向邻居通告 VPN-IPv6 地址的 Next Hop 字段的 8 字节 Route Distinguisher 应置为 0:0,16 字节 IPv6 地址应填充 IPv4-mapped IPv6 地址。
在《RFC4291-IP Version 6 Addressing Architecture》中定义了 IPv4-mapped IPv6 地址。这是一种由 IPv4 地址映射而来特殊的 IPv6 地址,取值 ::ffff:0:0/96。具体的映射规则为,将 IPv4 地址直接填充到 ::ffff:0:0/96 前缀的最后 32bits 中。
自动换行
此处展示了向邻居通告的 VPNv6 路由携带的 Next Hop 字段示例。
5@:使用与 BGP/MPLS-VPNv4 BGP Path Attributes Code 16 = EXTENDED COMMUNITIES 中类似的 Route Target 进行路由控制。
6@:在 BGP Open 消息中使用 Capability Type 1 = Multiprotocol extensions capability 并标识 <AFI 2 = IPv6,SAFI 128 = MPLS-labeled VPN address> 地址族进行邻居能力的协商。
自动换行
控制面及转发面行为:
1@:当收到的 VPNv6 路由中 Next Hop 字段使用 IPv4-mapped IPv6 地址时,接收者 PE 应使用 IPv4 Tunnel 进行流量转发或人为显式定义的使用 IPv6 Tunnel 进行流量转发。如果当收到的 VPNv6 路由中 Next Hop 字段没有使用 IPv4-mapped IPv6 地址时,则必须使用 IPv6 Tunnel 进行流量转发。。
2@:当收到的 VPNv6 路由时,应当将其 携带的 Label 与 Next Hop 进行绑定。
3@:IPv6 孤岛进行通信时,入口 PE 在 VRF 中查找到对应的下一跳时,将数据包封装一个与下一跳关联的栈底 BGP Label。这一 Label 用于识别对应的出口节点 PE。
4@:当使用 MPLS LSPs 作为公网 tunneling 时,使用 MPLS LSP 完成隧道时,入口 PE 路由器必须直接在标记的 IPv6 VPN 数据包的 Label 栈上再次压入 LSP tunnel Label。此 Label 对应于从入口 PE 路由器开始到出口 PE 路由器结束的 LSP。
5@:跨域场景下的 6VPE 方案与 《RFC4364-BGP/MPLS IP Virtual Private Networks》中的跨域方案类似。感兴趣者可参考《博客-BGP MPLS/LDP-3层虚拟专用网络原理介绍+报文分析+配置示例》或其他资料。
此处仅介绍部分基本原理,《RFC4659-BGP-MPLS IP VPN Extension for IPv6 VPN》中定义的其他方案原理可查阅相关资料。
2.1.2.公网NLRI_v6 with Next Hop_v4也即6PE方案-RFC4798
在《RFC4798-Advertising IPv4 NLRI with an IPv6 Next Hop》中新提出了一种在 IPv4 网络中为 IPv6 公网孤岛实现网络通信的方案。其主要利用《RFC8277-Using BGP to Bind MPLS Labels to Address Prefixes》中定义的 <AFI 2 = IPv6,SAFI 4 = NLRI with MPLS Labels> 型 NLRI 来实现路由传递。
不同于前文所述的 6VPE 方案可以使用 RSVP、IPsec 等多种隧道,6PE 方案仅能使用 IPv4 MPLS 云作为骨干网,PE 节点必须同时支持 IPv4/v6 双栈。另外再此种情况下,也不再涉及 VPN 等概念。
此方案要求:
1@:控制面要求
- 使用 IPv4 地址建立的 MP-BGP session 来传递 IPv6 前缀。
- 并将 BGP Next Hop 设置为 IPv4-mapped IPv6 地址。
- 使用《RFC8277-Using BGP to Bind MPLS Labels to Address Prefixes》中定义的 <AFI 2 = IPv6,SAFI 4 = NLRI with MPLS Labels> 型 NLRI 来传递 IPv6 前缀,并携带对应的 Label。
在《RFC4291-IP Version 6 Addressing Architecture》中定义了 IPv4-mapped IPv6 地址。这是一种由 IPv4 地址映射而来特殊的 IPv6 地址,取值 ::ffff:0:0/96。具体的映射规则为,将 IPv4 地址直接填充到 ::ffff:0:0/96 前缀的最后 32bits 中。
自动换行
此处展示了向邻居通告的 IPv6-LU 路由携带的 Next Hop 字段示例。同时 NLRI 携带为 IPv6 路由分配的公网 Label = 48123。
2@:入口 6PE 路由器必须在指向出口 6PE 路由器的 IPv4-signaled LSP 上传输 IPv6 数据包。出口 6PE 路由器由上述定义的 IPv4-mapped IPv6 地址来标识。
此时,入口 6PE 在收到 IPv6 数据包时必须直接封装 Label 而不添加 IPv4 包头。外层 Label 必须对应由 入口 6PE 路由器指向出口 6PE 路由器的 IPv4-signaled LSP。
3@:《RFC8200-IPv6 Specification》中认为 IPv6 链路必须具有最小 1280 字节的 MTU。因此在 MPLS 网络上传输 IPv6 数据包时必须将 MTU 设置为 1280 + 特定必要的封装长度。
4@:跨域场景下的 6PE 方案与 《RFC4364-BGP/MPLS IP Virtual Private Networks》中的跨域方案类似。感兴趣者可参考《博客-BGP MPLS/LDP-3层虚拟专用网络原理介绍+报文分析+配置示例》或其他资料。
2.1.3.NLRI_v4 with Next Hop_v6-RFC8950
在《RFC8950-Advertising IPv4 NLRI with an IPv6 Next Hop》中定义了一种在 IPv6 网络上传递 IPv4 NLRI 或 VPN-IPv4 NLRI 的新方案,用于在 IPv6 网络上为 IPv4 孤岛提供通讯服务。
目前《RFC4364-BGP/MPLS IP Virtual Private Networks》中定义了 <AFI 1 = IPv4,SAFI 1 = NLRI used for unicast>、<AFI 1 = IPv4,SAFI 2 = NLRI used for multicast>、<AFI 1 = IPv4,SAFI 4 = with MPLS Labels> 型 NLRI。《RFC4760-Multiprotocol Extensions for BGP-4》中定义了 <AFI 1 = IPv4,SAFI 128 = MPLS-labeled VPN address> 型 NLRI。《RFC6513-Multicast in MPLS/BGP IP VPNs》中定义了 <AFI 1 = IPv4,SAFI 129 = Multicast for BGP/MPLS IP VPN> 型 NLRI。但相比于前文介绍的 6VPE 和 6PE 方案,其重点区别在于如何将 IPv6 地址映射为这些 IPv4 NLRI 中的 BGP Next Hop。
为了实现上述功能,《RFC8950-Advertising IPv4 NLRI with an IPv6 Next Hop》中定义
1@:BGP Speaker 应当与 peer 在 Open 消息中进行 Capability Codes 5 = Extended Next Hop Encoding 能力的协商。
这一 Capability Codes 5 = Extended Next Hop Encoding 能力允许 BGP 携带的 NLRI 的 Prefix 地址族与 Next Hop 的地址族不一致。例如,<NLRI AFI 1 = IPv4,NLRI SAFI 1 = Unicast> 但 Next Hop AFI 2 = IPv6。需要说明的是,这种能力不得进行已有常用 NLRI 和 Next Hop 的组合。例如,不得用于 <NLRI AFI 1 = IPv4,NLRI SAFI 1 = NLRI used for unicast> 但 Next Hop AFI 1 = IPv4 的组合。
此处,仅定义支持 <NLRI AFI 1,NLRI SAFI 1/2/4/128/129> 与 Next Hop AFI 2 = IPv6 的组合。
2@:在 BGP 完成 Capability Codes 5 = Extended Next Hop Encoding 能力协商之后,可以传递经扩展 IPv4 地址族的 AFI/SAFI 定义。
1@:《RFC2545-Use of BGP-4 Multiprotocol Extensions for IPv6 Inter-Domain Routing》中描述了 BGP4+ 如何进行 IPv6 可达性信息的传递。其中认为 BGP Path Attributes Code 14 = MP_REACH_NLRI 属性中携带的 Length of Next Hop Network Address 字段应取值为 16 字节或 32 字节。
- 当取值为 16 字节长时表示 Next Hop Network Address 应填充 IPv6 global address。
- 当取值为 32 字节长时表示 Next Hop Network Address 应在填充 IPv6 global address 后额外填充 link-local address。
2@:因此,此时经扩展 IPv4 地址族的 AFI/SAFI 定义 Length of Next Hop Network Address 取值 16 字节或 32 字节。主要适用于 <NLRI AFI 1,NLRI SAFI 1/2/4> 与 Next Hop AFI 2 = IPv6 的组合。
3@:同时,对于传递 VPNv4 路由的 AFI/SAFI 定义 Length of Next Hop Network Address 取值 24 字节或 48 字节。主要适用于 <NLRI AFI 1,NLRI SAFI 128/129> 与 Next Hop AFI 2 = IPv6 的组合。这是由于 VPN 路由的 Next Hop 字段需要额外填充 8 字节的 Route Distinguisher。但此处的 Route Distinguisher 应取值为 0:0。
3@:除上述控制面行为做相应更改外,其他行为与《博客-BGP MPLS/LDP-3层虚拟专用网络原理介绍+报文分析+配置示例》描述的原理相同,感兴趣者可参考相关资料。
2.2.编码格式
2.2.1.MP_REACH_NLRI
此处所介绍的方案都使用《RFC4760-Multiprotocol Extensions for BGP-4》中所定义的 MP_REACH_NLRI 进行路由信息传递。
BGP Path Attributes Code 14 = MP_REACH_NLRI:携带一组可到达的目标以及用于转发到这些目标的 Next Hop 信息。

Address Family Identifier与 Subsequent Address Family Identifier结合使用:结合使用于标识 Next Hop 中携带的地址必须属于的网络层协议集、 Next Hop 的地址的编码方式以及随后的 NLRI 的定义。 如果允许下 Next Hop 来自多个网络层协议,则 Next Hop 的编码必须提供一种确定其网络层协议的方法。
SAFI:
1-63: Standards Action;
64-127: First Come First Served;
128-240: Some recognized assignments below, others Reserved;
241-254: Reserved for Private Use.
Length of Next Hop Network Address:描述了下一跳地址长。
Network Address of Next Hop:下一跳信息。
Network Layer Reachability Information (NLRI):可变长度字段,它列出了此属性中通告的可行路由的 NLRI。
6VPE 方案下向邻居通告的 VPNv6 路由的 MP_REACH_NLRI 字段示例。
自动换行
6PE 方案下向邻居通告的 IPv6-LU 路由的 MP_REACH_NLRI 字段示例。
2.2.2.Extended Next Hop Encoding Capability
为了通告 NLRI_v4 with Next Hop_v6,《RFC8950-Advertising IPv4 NLRI with an IPv6 Next Hop》中定义了 Capability Codes 5 = Extended Next Hop Encoding 能力以便在 Open 消息中进行协商。

<NLRI AFI, NLRI SAFI, Nexthop AFI>:每个 <NLRI AFI, NLRI SAFI, Nexthop AFI> 的组合表示 <NLRI AFI/SAFI>的 NLRI 可以使用属于下一跳 AFI 网络层协议的下一跳地址进行通告。
目前仅允许协商 <NLRI AFI 1,NLRI SAFI 1/2/4/128/129> 与 Next Hop AFI 2 = IPv6 的组合。
2.3.配置示例
此处以下图为例简单介绍下 6PE 方案下原理的介绍,不做实际应用说明。

NE1和NE2:用于作为 PE 节点搭建 BGP/MPLS IPv4 Core 骨干网。此处省略 P 节点,但不影响其原理表达。
AR1和AR2:用于作为 CE 节点模拟客户网络。此处选用 eBGP 作为 CE-PE 之间的 IPv6 路由传递。
仅以 NE1 关键配置做示例展示。
sysname NE1
interface Ethernet1/0/0
undo shutdown
ip address 10.1.1.1 255.255.255.252
ospf network-type p2p
ospf enable 1 area 0.0.0.0
mpls
mpls ldp
#
bgp 100
router-id 1.1.1.1
peer 2.2.2.2 as-number 100
peer 2.2.2.2 connect-interface 1.1.1.1
peer 2001:DB8:: as-number 200
#
ipv4-family unicast
undo synchronization
undo peer 2.2.2.2 enable
#
ipv6-family unicast
undo synchronization
peer 2.2.2.2 enable
peer 2.2.2.2 label-route-capability
peer 2001:DB8:: enable
#
ospf 1 router-id 1.1.1.1
area 0.0.0.0
network 1.1.1.1 0.0.0.0
#
控制面路由传递:
1@:AR2 首先将自己的 IPv6 单播路由通过 CE-PE 协议 (eBGP) 通告给 NE2 设备。
2@:NE2 收到该路由后,将其转化为 IPv6 LU 路由借由 NE1<--->NE2 之间 IPv4 地址建立的 IPv6 邻居地址族通告给 NE1。
3@:NE1 收到该路由后,通过 IPv6 LU 路由中携带的公网 Label 来标识其迭代所需封装的内层 Label,通过 IPv6 LU 路由中携带的 IPv4-mapped IPv6 地址来判断如何封装外层 IPv4 MPLS/LDP LSP Label。
随后,NE1 将该路由转化为普通 IPv6 路由向 AR1 通告。
4@:AR1 收到该路由后经内部路由选择后,放入 IPv6 转发表。
display bgp ipv6 routing-table 用于展示收到的 BGP IPv6 LU 路由信息。
转发面数据传递:
1@:NE1 收到来自 AR1 的 IPv6 数据包后,查找路由下一跳为 IPv4-mapped IPv6 地址。随后封装与所匹配 IPv6 LU 路由的内层 Label。
2@:IPv4-mapped IPv6 地址与随之对应的 IPv4 MPLS/LDP LSP 关联,因此封装与该 LSP 关联的外层 Label 向 NE2 转发。
3@:NE2 收到的往往是经 POP 弹出的单层 Label,解封装发现其关联 IPv6 公网路由表。并将其向 AR2 转发。
BGP/MPLS IPv4 Core 骨干网所传递的业务报文示例。此处仅展示经 POP 后的单层报文示例。
自动换行
点击此处回到目录
更新
本文来自博客园,作者:m风行者,转载请注明原文链接:https://www.cnblogs.com/FengXingZhe008/p/18913249
简单来说Adj-RIB-In和Adj-RIB-Out是放置于Update报文中的路由信息。



浙公网安备 33010602011771号