BGP路由黑洞问题解决方案

激活了迭代隧道功能
缺省情况下,非标签公网BGP路由、静态路由只能迭代到出接口和下一跳,不会迭代到隧道。使用route recursive-loopup tunnel命令激活了迭代隧道功能后,会优先迭代到LSP隧道,如果没有LSP隧道,也可以迭代到出接口和下一跳
- 在route recursive-loopup tunnel命令中配置ip-prefix后,只有被IP前缀列表允许的非标签公网BGP路由或静态路由才能迭代到LSP隧道
- 如果在route recursive-loopup tunnel命令中不配置ip-prefix,则所有非标签公网BGP路由与静态路由都优先迭代LSP隧道
案例一


#
mpls lsr-id 1.1.1.1
mpls
#
mpls ldp
#
interface GigabitEthernet0/0/0
ip address 12.1.1.1 255.255.255.0
ospf enable 1 area 0.0.0.0
mpls
mpls ldp
#
interface GigabitEthernet0/0/1
ip address 192.168.1.1 255.255.255.0
#
interface LoopBack0
ip address 1.1.1.1 255.255.255.255
ospf enable 1 area 0.0.0.0
#
bgp 100
peer 4.4.4.4 as-number 100
peer 4.4.4.4 connect-interface LoopBack0
#
ipv4-family unicast
undo synchronization
network 192.168.1.0
peer 4.4.4.4 enable
#
ospf 1
area 0.0.0.0
#
ip ip-prefix 1 index 10 permit 192.168.2.0 24
#
route recursive-lookup tunnel ip-prefix 1
#
#
mpls lsr-id 2.2.2.2
mpls
#
mpls ldp
#
interface GigabitEthernet0/0/0
ip address 12.1.1.2 255.255.255.0
ospf enable 1 area 0.0.0.0
mpls
mpls ldp
#
interface GigabitEthernet0/0/1
ip address 23.1.1.2 255.255.255.0
ospf enable 1 area 0.0.0.0
mpls
mpls ldp
#
interface LoopBack0
ip address 2.2.2.2 255.255.255.255
ospf enable 1 area 0.0.0.0
#
ospf 1
area 0.0.0.0
#
#
mpls lsr-id 3.3.3.3
mpls
#
mpls ldp
#
interface GigabitEthernet0/0/0
ip address 23.1.1.3 255.255.255.0
ospf enable 1 area 0.0.0.0
mpls
mpls ldp
#
interface GigabitEthernet0/0/1
ip address 34.1.1.3 255.255.255.0
ospf enable 1 area 0.0.0.0
mpls
mpls ldp
#
interface LoopBack0
ip address 3.3.3.3 255.255.255.255
ospf enable 1 area 0.0.0.0
#
ospf 1
area 0.0.0.0
#
#
mpls lsr-id 4.4.4.4
mpls
#
mpls ldp
#
interface GigabitEthernet0/0/0
ip address 34.1.1.4 255.255.255.0
ospf enable 1 area 0.0.0.0
mpls
mpls ldp
#
interface GigabitEthernet0/0/1
ip address 192.168.2.1 255.255.255.0
#
interface LoopBack0
ip address 4.4.4.4 255.255.255.255
ospf enable 1 area 0.0.0.0
#
bgp 100
peer 1.1.1.1 as-number 100
peer 1.1.1.1 connect-interface LoopBack0
#
ipv4-family unicast
undo synchronization
network 192.168.2.0
peer 1.1.1.1 enable
#
ospf 1
area 0.0.0.0
#
ip ip-prefix 1 index 10 permit 192.168.1.0 24
#
route recursive-lookup tunnel ip-prefix 1
#
上游与下游

标签的发布和管理
LDP会话建立后,LDP协议开始交换标签映射等消息用于建立LSP。RFC5036分别定义了标签发布方式、标签分配控制方式、标签保持方式来决定LSR如何发布和管理标签
| 术语 | 备注 |
|---|
| 标签发布方式 | DU、DOD |
| 标签分配控制方式 | Ordered、Independent |
| 标签保持方式 | Liberal、Conservative |
标签发布方式 Label Advertisement Mode,将标签给邻居的前提条件
| 类型 | 备注 |
|---|
| DU | Downstream Unsolicited,下游自主;LSR无需从上游获得标签请求消息即可进行标签分配与分发 |
| DoD | Distribution on Demand,下游按需;LSR必须从上游获得标签请求消息之后进行标签分配与分发 |
| PS | 华为和思科设备默认采用DU,因为在网络拓扑发生变化时,采用DU可以快速反应为新的拓扑分发标签,收敛时间相对于DoD较短 |


标签分配控制方式 Label Distribution Control Mode,为一条路由前缀分配标签的前提条件。标签由设备自动随机生成
| 类型 | 备注 |
|---|
| Independent | 独立,LSR可以主动分配标签,无需等待下游的标签 |
| Ordered | 有序,LSR只有收到下游的标签后,才能分配标签 |
| PS | 华为设备默认采用Ordered,这样是为了避免下游IP分组的标签未分配或收敛时间较长,上游的标签已分配,数据开始转发造成的数据丢失。思科默认采用Independent |


标签分配控制方式和标签发布方式的组合
| 标签分配控制方式 | 下游自主方式DU(Downstream Unsolicited) | 下游按需方式DoD(Distribution on Demand) |
|---|
| 独立标签分配控制方式(Independent) | DU+Independent:LSR(Transit)无需等待下游(Egress)的标签,就会直接向上游(Ingress)分发标签 | DoD+Independent:发送标签请求的LSR(Ingress)的直连下游(Transit)会直接回应标签,而不必等待来自最终下游(Egress)的标签 |
| 有序标签分配控制方式(Ordered) | DU+Ordered:LSR(Transit)只有收到下游(Egress)的标签映射消息,才会向上游(Ingress)分发标签 | DoD+Ordered:发送标签请求的LSR(Ingress)的直连下游(Transit)只有收到最终下游(Egress)的标签映射消息,才会向上游(Ingress)分发标签 |
标签保持方式 Label Retention Mode,如何保留从邻居接收到的标签
| 类型 | 备注 |
|---|
| Liberal | 自由;保留邻居所有的标签,无论邻居是否是自己的下一跳。优点:路由发生变化时能够快速建立新的LSP进行数据转发;缺点:消耗更多内存和标签空间 |
| Conservative | 保留;只保留来自下一跳邻居的标签。优点:节省内存和标签空间;缺点:路由发生变化时必须从新的下一跳那里获得标签然后才能够转发数据,收敛较慢;通常与DoD方式一起 |
| PS | 华为和思科默认采用Liberal |


目前设备支持组合方式
- DU+Ordered+Liberal,该方式为缺省方式
- DoD+Ordered+Conservative
- DU+Independent+Liberal
- DoD+Independent+Conservative
倒数第二跳弹出 PHP,Penultimate Hop Popping
- 在最后一跳节点,标签已经没有使用价值。这种情况下,在倒数第二跳节点处将标签弹出,减少最后一跳的负担

上图具体过程如下:
- RTC收到RTB发送的带标签1026的报文,查找LFID表,发现分配的出标签为隐式空标签3,于是执行弹出标签的动作,并将IP数据包转发给下游路由器RTD
- RTD收到RTC发送的IP报文,直接查找自己的FIB表,根据FIB表中的出接口进行IP数据的封装并转发

特别保留标签
| 标签 | 备注 |
|---|
| 标签3 | 隐式空标签,implicit-null,通知倒数第二跳路由器移除顶层标签;注意:标签3其实永远不会出现在MPLS报文的标签栈中 |
| 标签0 | 显式空标签,explicit-null,通知路由器直接弹出标签 |
| PS | 在实施QoS时,最后一跳必须携带EXP位,因此标签不能被弹出,需配置显示空标签,此时分配给特定路由的标签值为0并传递给LDP邻居 |

