BGP防环

本文详细介绍了BGP中的防环机制,包括AS内通过IBGP水平分割、路由反射器的CLUSTER_LIST和ORIGINATOR_ID,以及AS间通过AS_PATH防止环路。还讨论了如何处理接收本AS路由和特定场景下的环路问题,如引入路由和使用策略解决环路和路由黑洞。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

防环机制种类

(1)AS内防环:
① IBGP邻居之间通过IBGP的水平分割防止环路。
② 配置路由反射器之后,路由反射器通过CLUSTER_LIST防止环路;路由反射器的客户端通过ORIGINATOR_ID防止环路。
③ 在confederation 内部,confederation 成员AS间使用成员的AS号来防环。
(2)AS间防环:EBGP邻居通过AS_PATH防止环路。

BGP 路由经过 RR,会添加几种属性,如何避免环路

(1)cluster-list
在这里插入图片描述
cluster-list 就是路由沿途经反射器反射,RR默认就会将自己的cluster-id(默认为router-id)写进cluster-list,接收路由器,一旦发现cluster-list里面有跟自己cluster-id一样的,就会拒收路由,所以上图R1会拒收传回来的路由从而起到防环的作用。
(2)originator-id
在这里插入图片描述
路由器发现originator-id 跟自己router-id一致就不收,所以上图的情况r4会拒收自己发起的被RR反射回来的路由。

要接收带有本AS的路由时如何做,设计这种机制的原因

(1)可以使用peer allow-as-loop
(2)可以使用route-policy(apply as-path overwrite,覆盖as号)
(3)做聚合(不加as-set)
(4)可以使用peer fake-as
场景:
一个公司如果有两个站点,但是只申请了一个as号的时候。此时就需要做相应的操作,不然会因为AS-Path防环机制而导致一边学习不到路由

BGP存在的环路的场景说明

  • 第一种场景:

在这里插入图片描述
拓扑描述:
R1和R3之间没有直连链路,R1、R2、R3之间运行rip,R1和R3建立IBGP邻居关系,R1和R2建立EBGP邻居关系,R2和R3之间不建立邻居关系,在R3上宣告一条30.30.30.0/24的BGP路由
现象:
在R1和R2之间会有数据包环路
解释:
R3把这条路由通过IBGP传给R1,R1收到这条路由会把这条路由通过EBGP传给R2,所以,R1、R2、R3都是有这条路由。但是数据在传输的时候,当R1去访问30.30.30.0/24时下一跳指向R3,通过迭代,数据发给R2,R2查找自己路由表,发现下一跳指向R1,又把数据包扔回给R1,环路出现
解决方法:
在R1上传路由给R2时,下一跳不改变

  • 第二种场景:
    在这里插入图片描述
    拓扑描述:
    R2、R3、R4之间运行rip,R2和R4之间建立IBGP,R2和R1建立EBGP,R3上没有起BGP,为了保证网络可达性,在R4上将BGP引入到RIP(import-routebgp permit-ibgp)
    现象:
    R3和R4之间出现数据包环路
    解释:
    R1把1.1.1.0/24传给R2,R2将路由传给R4并将下一跳改为自己,R4上学到这条路由后,将此路由从BGP引入到RIP,R3通过RIP学到这条路由。当R4去访问1.1.1.0/24时,下一跳指向R2,通过迭代,把数据扔给R3,R3关于1.1.1.0/24路由,是通过R4学到的,下一跳指向R4,又把数据包扔回给R4,环路出现
    解决方法:
    1.在R2上做引入。或者不将BGP引入rip。
    2.通过其他方法解决路由黑洞(mpls、隧道)
### BGP防环机制原理与实现 #### 路由黑洞的原因 BGP协议允许非直连邻居建立连接,这种特性可能导致在一个自治系统(AS)内部存在不运行BGP协议的路由器。这些路由器无法处理通过BGP传播的数据流量,从而引发路由黑洞问题[^1]。 #### 防环机制概述 BGP设计了一系列防环机制以确保网络中不会形成路由路。以下是主要的防环机制及其工作原理: --- #### 1. **路径属性记录** BGP利用`AS_PATH`路径属性来止EBGP和IBGP之间的循。每条BGP路由都携带一个`AS_PATH`列表,该列表记录了此路由经过的所有AS编号。当BGP接收到一条路由时,会检查其`AS_PATH`字段: - 如果发现当前AS编号已经存在于`AS_PATH`中,则认为这条路由形成了路并丢弃它。 - 这种方法有效阻止了跨AS间的路由路[^4]。 --- #### 2. **水平分割(Split Horizon)** 对于EBGP而言,BGP默认实施水平分割策略。具体表现为: - 当某台路由器从某个EBGP邻居接收了一条路由后,不会再将这条路由通告回给这个EBGP邻居。 - 此规则避免了EBGP邻居之间的潜在路[^3]。 --- #### 3. **IBGP全网状互联或反射器设置** 在IBGP境中,默认情况下,路由器不会将其从IBGP邻居学到的路由再广播给其他IBGP邻居。为解决这一限制,通常采用以下两种方式之一: - **IBGP全网状互联**:所有IBGP路由器两两互连,虽然消除了路风险,但扩展性较差。 - **路由反射器(Route Reflector, RR)**:引入RR集中管理IBGP路由分发。然而,在同一集群内的多个RR可能带来新的路隐患,为此需统一设定`Cluster_ID`参数以规避此类问题[^4]。 --- #### 4. **同步机制** 为了避免因IGP收敛速度慢于BGP而导致的短暂路由黑洞现象,BGP提供了同步功能。启用同步后,只有当BGP路由对应的前缀也存在于本地IGP路由表中时,才会向外部EBGP邻居宣告该路由。这种方式间接减少了数据平面不可达的风险[^2]。 尽管现代网络架构下已较少依赖严格意义上的同步机制,但在特定场景仍具有重要意义。 --- #### 5. **Next_Hop 属性验证** 无论是在EBGP还是IBGP通信过程中,BGP都会关注下一跳地址的有效性。如果检测到下一跳不可达,则忽略相应路由更新消息。这是另一层保障措施用于范错误配置引起的转发失败情况发生。 --- ```python # 示例代码展示如何检查 AS_PATH 中是否存在重复 AS 编号 def check_as_path(as_path_list, current_as): """ 检查 AS_PATH 列表中是否有当前 AS 的编号 :param as_path_list: list 类型,表示 AS_PATH 属性的内容 :param current_as: int 类型,表示当前 AS 的编号 :return: bool 类型,True 表示有路,False 表示无路 """ if current_as in as_path_list: return True return False ``` ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值