1. Border Gateway Protocol(边界网关协议)特征
- 提供无环的路由信息交换「基于 IP 协议栈的 6 号协议,179 端口」
- BGP 是一个增强的距离矢量协议,扩展性强(因为是 TLV 类型所以支持多协议)
- 可靠的路由更新机制
- 丰富的 Metric 度量方式
- 从设计上避免了环路的发生
- IGP着重于发现和计算路由,而 BGP 着重于控制路由的传播和选择最优的路由
- BGP 工作在 AS 之间或 AS 内部
- AS(Autonomous System):由同一个技术管理机构管理、使用统一选路策略的一些路由器的集合
- 私有 AS 号:64512-65535
- AS(Autonomous System):由同一个技术管理机构管理、使用统一选路策略的一些路由器的集合
- BGP 分为 iBGP 和 eBGP
- iBGP(内部网关协议 internal Border Gateway Protocol):自身的 AS 号码与远端的 AS 号码相同
- eBGP(外部网关协议 External Border Gateway Protocol):自身的 AS 号码与远端的 AS 号码不同
- 传输路由的邻居关系建立在应用层,采用「TCP」进行传输路由协议和单播建立邻居关系
- 在 BGP 中 IGP 存在意义:利用 IGP 实现 TCP 可达,是 iBGP 的底层协议
- 在 BGP 中 iBGP 存在的意义:iBPG 用于承载 eBGP
- 周期发送 Keepalive 消息来检测 TCP 的连接[维护BGP]
- BGP Hello time 和 Hold Time 不一致不会影响邻居的建立
- 拥有自己的 BGP 表项,当 BGP 表项中优选后才会加入到全局路由表
- 不需要周期更新路由,路由采用增量更新和触发更新机制
- 有丰富的属性信息,用来进行路由选路和基于策略进行路由控制
- BGP 有很多防环原则(EBGP、EBGP、RR、Confederation、MPLS 等下的防环原则)
- 当目标路由和下一跳地址相同时,该路由在 BGP 中就无效(如果华为设备想通告自身 BGP 更新源地址需要在 eBGP 设备宣告)
- 支持 VLSM(可变长子网掩码)和 CIDR(无类域间路由)
- 支持 MD5 认证
- 适用的应用场景
- 适合大中型网络
- 适用于有多个 ISP 出口,根据目的网络来选择合适的 ISP 下一条
- 一般用来需要为路由进行流量控制策略和选路
- 不适用的应用场景
运行 BGP 的路由器称为 BGP Speake,BGP Speake 之间交互 5 种报文
1)Message Type
Open、Keepalive 和 Notification 报文用来建立和维护邻居关系;Update 和 Route-refresh 用来传递和更新路由信息
- Open:负责和 Peer 建立邻居关系
- Update:用来在 Peer 之间传递路由信息
- Notification:检测到 BGP Speaker 错误时发送的报文消息
- Keepalive:与 Peer 之间周期发送,用来为维护 TCP 连接
- Route-refresh:用来通知 Peer 自己支持路由刷新能力
2)BGP Message Header
BGP 报文头部最短 19Byte,最长 4096Byte
BGP Message Header 格式解析
- Marker:标记,用于检查 BGP Peer 的同步信息完整性和验证计算,如果没有验证为全 F
- Length:BGP 报文的总长度,包括报文头部
Type:类型表示 BGP 报文后所接的报文类型
Hold Time 用于协商 BGP Peer 间保持建立连接关系[发送 Keepalive 或 Update 等报文的时间间隔]。BGP 在收到 Peer 的 Open 报文后,对收到和发出的 Open 报文中 Hold Time 时间作比较,如果不一致,选择较小的时间作为协商结果
- Hold Time 的值可以 = 0 或 ≥ 3s。值 = 0 时,可以建立邻居关系,但不会周期发送 Keepalive 报文,但在刚建立邻居时会发送一个
- 默认的 Keepalive 每 60s 周期发送,Hold Time 时间为 180s[Keepalive 的 3 倍关系]
只有在能力协商中使能了支持路由刷新功能(Route Refresh Capability),路由器才能处理 Refresh 报文。缺省支持 IPv4 单播能力与路由刷新能力
① Open Message
Open Message 格式解析Version:版本,v4 或 v4+
- My Autonomous System:发送者的 AS 号,用来确定是建立 iBGP 还是 eBGP
- Hold Time:发送者的死亡时间,默认是 180s,可以设置为 0
- BGP Identifier:发送者的 Router ID,选取规则与 OSPF 一致
- Opt Parm Len:可选能力参数长度,值为 0,表示没有可选能力参数
- Optional Parameters:可选能力参数,每个能力阐述都是 TLV 结构
- AFI:地址簇标识,和 SAFI 配合确定网络层协议和 IP 地址间的关系
- SAFI:子地址簇标识,和 AFI 配合确定网络层协议和 IP 地址间的关系
② AFI 和 SAFI 编码
| AFI 编码 | AFI 说明 | SAFI 编码 | SAFI 说明 | BGP 能力支持说明 | | —- | —- | —- | —- | —- | | 1 | IPv4 地址簇 | 1 | 单播 | IPv4 单播 | | | | 2 | 组播 | IPv4 组播 | | | | 128 | VPN | IPv4 L3VPN | | 2 | IPv6 地址簇 | 1 | 单播 | IPv6 单播 | | | | 2 | 组播 | IPv6 组播 | | | | 128 | VPN | IPv6 L3VPN | | 196 | 二层 | 128 | VPN | L2VPN Kompella 方式 |
4)Update Message
Update Message 既有更新也有撤销,可以包含在一个报文中
- 一条 Update 报文可以发布多条具有相同路由信息的路由更新,也可以只用于路由撤销
Total Path Attribute(完全路径属性)包含了 Path Attributes(路径属性)和 Network Layer Reachability Information(网络可达信息 NLRI)
① Update Message
Update Message 格式解析gUnfeasible Routers Length:路由撤销的长度。值为 0 时,表示没有撤销的路由
- Withdrawn Routers:路由撤销列表,包含路由撤销的前缀信息和掩码
- Total Path Attribute Lengh:路由更新的路由长度和路由属性。值为 0 时,表示没有需要更新的路由
- Path Attributes:路径属性,需要更新的路径属性,一条 Update 报文可以发布多条具有相同路由信息的路由更新
- Network Layer Reachability Information(NLRI):路由更新的地址列表,包含路由更新的掩码和前缀信息
② 路径属性
按其类型号从小到大的顺序排序,填写更新的路由的所有属性,每一个属性单元起码包括属性类型、属性长度、属性值三部分,采用 TLV 格式
属性类型 | 属性值 |
---|---|
1:Origin | IGP EGP Incomplete |
2:As_path | AS_Set AS_Sequence AS_Confed_Set AS_Confed_Sequence |
3:Next_hop | 下一跳的 IP 地址 |
4:Multi_Exit_Disc(MED) | 用于判断流量进入 AS 时的最佳路径 |
5:Local_Pref | 用于判断流量离开 AS 时的最佳路径 |
6:Atomic_Aggregate | BGP Speaker 选择聚合后的路由,而非具体的路由 |
7:Aggregator | 发起聚合的路由器 ID 和 AS 号 |
8:Community | 团体属性 |
9:Originator_ID | 反射器发起者的 Router ID |
10:Cluster_List | 发射路由经过的反射器列表 |
14:MP_Reach_NLRI | 多协议可达 NLRI |
15:MP_Unreach_NLRI | 多协议不可达 NLRI |
16:Extended Communtities | 扩展团体属性 |
5)Notification Message
用于处理 BGP 进程中的各种错误
① Notification Message
Notification Message 格式解析
- Error Code:错误的类型
- Error Subcode:错误的细节编号
- Data:错误的数据内容
② 错误码和错误子码
| 错误码 | 错误子码 | | —- | —- | | 1:消息头错误(Message header error) | 1:连接未同步(connection not synchronized) | | | 2:错误的消息长度(error message length) | | | 3:错误的消息类型(error message type) | | 2:Open 消息错误(Open message error) | 1:不支持的版本号(unsupported version number) | | | 2:错误的对等 AS(error peer AS) | | | 3:错误的BGP标识符(error BGP identifier) | | | 4:不支持的可选参数(unsupported optional parameter) | | | 5:认证失败(authentication failed) | | | 6:不可接受的保持时间(unacceptable Holdtime) | | | 7:不支持的能力(unsupported capability) | | 3:Update 消息错误(Update message error) | 1:畸形属性列表(malformed attribute list) | | | 2:不可识别的公认属性(unrecognized well-known attribute) | | | 3:缺少公认属性(well-known attribute is missing) | | | 4:属性标志错误(attribute flags error) | | | 5:属性长度错误(attribute length error) | | | 6:无效 Origin 属性(invalid origin attribute) | | | 7:AS 路由环路(AS routing loop) | | | 8:无效 Next_Hop 属性(invalid Next-Hop attribute) | | | 9:可选属性错误(error optional attribute) | | | 10:无效网络字段(invalid network field) | | | 11:畸形 AS_Path(abnormal AS-Path) | | 4:Hold Timer 溢出(Hold timer expired) | 0:没有特别的错误子码定义(no special definition of the error subcode) | | 5:有限状态机错误(Finite state machine error) | 0:没有特别的错误子码定义(no special definition of the error subcode) | | 6:终止(Cease) | 1:前缀超过最大值(maximum number of prefixes reached) | | | 2:管理关闭(administrative shutdown) | | | 3:删除邻居(peer de-configured) | | | 4:管理重置(administrative reset) | | | 5:连接失败(connection rejected) | | | 6:其他配置改变(other configuration change) | | | 7:连接冲突(connection collision resolution) | | | 8:资源短缺(out of resources) | | | 9:BFD 断开连接(BFD session Down) |
6)Keepalive Message
Keepalive 报文用于维护 BGP 的 TCP 连接
- 默认的 Keepalive 每 60s 周期发送
- Keepalive 报文只有 BGP 报文头,没有具体内容,故其报文长度应固定为 19 个字节
7)Route-Refresh Message
报文用于动态的请求 BGP 路由发布者重新发布 Update 报文,进行路由更新
- 所有设备都能支持 Route-Refresh 能力情况下,如果 BGP 的入口路由策略发生了变化,本地 BGP 路由器会向 Peer 发布 Route-Refresh 消息,收到此消息的 Peer 会将路由信息重新发给本地 BGP
- 可以在不中断 BGP 连接的情况下,对 BGP 路由表进行动态刷新,并应用新的路由策略
Router-Refresh Message 格式解析
在 OpenSent 状态之前都是因为 TCP 连接无法建立连接导致的
- Idle(空闲)状态:BGP 总是以 Idle 状态为起始点,该状态拒绝所有入站连接[未建立任何状态]
- 如果发生差错,BGP 会将状态迁移到 Idle 并开启重连定时器,在定时器到期时重启 BGP(每次重连定时器都是之前的 2倍)
- 任何状态中收到 Notification 报文或 TCP 拆链通知等 Error 事件,BGP 都会迁移到 Idle 状态
- Connect(连接)状态:BGP 尝试建立 TCP Session[尝试建立 TCP Session]
- 如果 TCP 连接建立成功,BGP 会[向邻居发送 Open 报文]并迁移到 OpenSent 状态
- 如果 TCP 连接建立失败,BGP 会继续侦听邻居初始化的连接并开启重连定时器,迁移到 Active 状态。如果重连定时器超时,仍处于 Connect 状态,则重置重连定时器,并再次尝试与邻居建立 TCP 连接,状态停留在 Connect
- Active(激活)状态:BGP 会尝试与邻居初始化 TCP 连接[建立 TCP Session 失败]
- 如果 TCP 连接建立成功,BGP 会关闭重连定时器完成初始化过程,[向邻居发送 Open 报文]并迁移到 OpenSent 状态(默认 Hold Time 定时器设置为 180s)
- 如果重连定时器超时,BGP 会将状态迁移到 Connect。并重置重连定时器和初始化 TCP 连接后,继续侦听邻居的连接。如果邻居试图以非期望的 IP 建立 TCP 会话,则重置重连定时器并拒绝该连接,状态停留在 Active
- OpenSent(打开发送)状态:BGP 会一直等待侦听来自邻居的 Open 报文[建立 TCP Session 成功,并发送了 Open 报文]
- 接收到 Open 报文后,会检查该报文的每个字段,如果没有差错,则[发送 Keepalive 报文并设置 Keepalive 定时器],迁移到 OpenConfirm 状态(默认 Keepalive 定时器 60s)
- Open 报文会根据邻居的 AS 号,确定邻居连接的是 iBGP 还是 eBGP
- Open 报文会协商 Hold Time 时间,以便确定一个较小的 Hold Time 值。如果协商的 Hold Time 时间为 0,则不启动保持定时器和 Keepalive 定时器
- 如果接收到的 Open 报文,检查字段时发现存在差错,会发送 Notification 报文并迁移到 Idle 状态
- 如果收到断开 TCP 连接的请求,则关闭 BGP 连接并重置重连定时器,开始侦听邻居发起的新连接,并迁移到 Active 状态
- 接收到 Open 报文后,会检查该报文的每个字段,如果没有差错,则[发送 Keepalive 报文并设置 Keepalive 定时器],迁移到 OpenConfirm 状态(默认 Keepalive 定时器 60s)
- OpenConfirm(打开确认)状态:BGP 会一直侦听来自邻居的 Keepalive 或 Notification 报文[已经接收到了 Open 报文,并同意了所有路径能力属性]
- 如果[接收到 Keepalive 报文],则迁移到 Established 状态
- 如果接收到 Notification 报文或 TCP 拆链的请求,则迁移到 Idle 状态。如果 Hold Time 定时器到期、检测到存在差错或者发生终止事件,会向邻居发送一个 Notification 报文,关闭 BGP 连接并迁移到 Idle 状态
- Established(建立)状态:BGP 连接已经完全建立,Peer 之间可以互相交换 Update、Keepalive 和 Notification 报文[BGP 邻居关系建立成功,收到了邻居的 Keeplive 报文]
- BGP 的数据库中,路由条目必须是有效「表示方式
*****
」和可达的「表示方式**>**
」才会加入全局路由表。并且如果不是有效的和可达的,不会通告给邻居路由器 - BGP 可以跨设备建立 BGP 邻居,但需要 TCP 可达
- 通常情况下建立 eBGP 采用直连建立[eBGP 默认 TTL=1],iBGP 采用环回口建立[iBGP 默认 TTL=255]
- 如果 eBGP 采用环回口建立就需要开启多跳支持
- 如果 eBGP 达到其他 AS 有多条链路,则可以采用环回口建立(可以负载,不需要建立多个 eBGP 邻居)
- 使用默认路由建立 eBGP。如果是思科设备,邻居是无法 UP;华为设备邻居可以 UP,但是路由是无效的并且不是最优
- BGP的 Keepalive 每 60s 为周期发送,Hold Time 时间为 180s[Keepalive 的 3 倍关系]
- 如果 Hold Time 时间与 Peer 对等体不一致,不会影响邻居建立,会自动协商,选择较小的时间作为协商结果
- Hold Time 的值可为零(不发 Keepalive 报文,但在刚建立邻居时会发送一个)
- 如果某设备想产生 BGP 路由,那么这些路由必须以其他方式存在该设备上
- IGP 路由
- 静态
- 直连方式
- BPG 路由的来源方式不同,路由优先程度也不同[Network > 重分布]
- BGP 只会把自身最优的路由传递给邻居。如果去往同一目的有多条路径时,BGP 只会将最优的路由放入全局路由表(除非 IGP 没有该路由)
- BGP 从 eBGP 收到路由会传递给 iBGP 和 eBGP
- BGP 从 eBGP 收到的路由传递给 iBGP 默认不会更改下一跳属性,且只会传递一跳「避免环路的发生」。需要在传递该路由的设备上手工配置下一跳自我
- BGP 从 iBGP 收到的路由不会传递给其他 iBGP 邻居。iBGP 自身产生的路由只会传递给相邻一跳的 iBGP 邻居「TTL = 1」
- 类似水平分割原则,主要是为了「避免 iBGP 的环路产生」。但也造成了其他 BGP Speaker 路由条目不全的问题
- 解决水平分割的问题需要 iBGP 全互联( “ (N*N-1)/2 “ )
- 路由反射器(RR):打破水平分割,减少邻居关系
- 联邦:由多个私有 AS 组成,由一个公有 AS 管理
- 解决水平分割的问题需要 iBGP 全互联( “ (N*N-1)/2 “ )
- 类似水平分割原则,主要是为了「避免 iBGP 的环路产生」。但也造成了其他 BGP Speaker 路由条目不全的问题
- BGP 从 iBGP 获得的路由是否会传递到 eBGP 邻居,需要依据 IGP 和 iBGP 的同步来决定(没有同步可能会引发路由黑洞或路由无效)
- Cisco 默认开启同步,可以通过命令开启或关闭
- Huawei 默认关闭同步,所以华为设备 eBGP 从 iBGP 获得的路由会传递到 eBGP
- BGP 与 IGP 同步的概念:从 iBGP 获得的路由信息传递给它的 eBGP 邻居,需要该路由能通过 IGP 获得,否则不传递给 eBGP(针对 iBGP 同步 IGP)「控制层面正常,但数据平面(转发平面)不可达」
- 因为 BGP 是一种 Host to Host 的连接,可以在非直连设备上建立连接,如果中间路由器没有运行 BGP,就有可能出现路由黑洞
- 当运行 BGP 的设备把去往 iBGP 路由的下一跳地址做递归查询(查询路由表)后交给中间设备时,由于中间设备没有运行 BGP 协议,导致没有 BGP 的路由,则产生了路由黑洞
- 解决路由黑洞的方式
- 因为 BGP 是一种 Host to Host 的连接,可以在非直连设备上建立连接,如果中间路由器没有运行 BGP,就有可能出现路由黑洞
- 路由策略 Import 方向
- 对邻居传递过来的路由信息,「先放入 BGP 路由表中(Adj-RIB-in,未经处理的路由信息),在执行路由策略」,然后于自身 RIB 进行比较后放入全局路由表
- 路由策略 Export 方向
- AR1 和 AR3、AR2 和 AR3 都使用直连建立 eBGP。将 AR2 的 Loopback100 宣告进 BGP,观察 AR1 上 100 网段的路由下一跳
- BGP 在 MA 中采用直连接口建立 eBGP 连接,且都在同一网段。设备从 eBGP 收到传递过来的路由,再传递给其他 eBGP 时,如果在同一网段,不会修改下一跳属性地址。从而避免了次优路径的产生(BGP 的优化,类似于路由重定向和 OSPF 的 FA 地址)
- AR3 向 AR1 传递从 AR2 传递过来的 100 网段路由时,发现下一跳的地址都是在同一网段。此时 AR3 不会更改下一跳属性地址
- BGP 在 MA 中采用直连接口建立 eBGP 连接,且都在同一网段。设备从 eBGP 收到传递过来的路由,再传递给其他 eBGP 时,如果在同一网段,不会修改下一跳属性地址。从而避免了次优路径的产生(BGP 的优化,类似于路由重定向和 OSPF 的 FA 地址)
- AR1 和 AR3、AR2 和 AR3 都使用 Loopback0 建立 eBGP。将 AR2 上 Loopbaack100 宣告进 BGP,观察 AR1 上 100 网段的路由下一跳
- 如果 eBGP 之间采用 Loopback 接口建立的连接,设备从 eBGP 收到传递过来的路由,在传递给其他 eBGP 时,会修改下一跳属性地址
- AR3 向 AR1 传递从 AR2 传递过来的 100 网段路由时,由于是 Loopback 建立的邻居(不在同一网段),此时 AR3 会修改下一跳地址在传递给 AR1
- 如果 eBGP 之间采用 Loopback 接口建立的连接,设备从 eBGP 收到传递过来的路由,在传递给其他 eBGP 时,会修改下一跳属性地址
- AR1 与 AR3 用直连建立 iBGP,AR2 与 AR3 用直连建立 eBGP。将 AR2 上 Loopback100 宣告进 BGP,观察 AR1 上 100 网段的路由下一跳
- 设备从直连建立的 eBGP 收到传递过来的路由,由于跟 iBGP 是同一网段且直连建立的 iBGP 时,传递给 iBGP 时,不修改下一跳属性地址(BGP 的优化)
- AR3 从直连建立 eBGP 的 AR2 上收到传递过来的 100 网段路由,再传递给同一网段建立 iBGP 的 AR1 时,此时 AR2 不会修改下一跳属性地址
- 设备从直连建立的 eBGP 收到传递过来的路由,由于跟 iBGP 是同一网段且直连建立的 iBGP 时,传递给 iBGP 时,不修改下一跳属性地址(BGP 的优化)
- AR1 与 AR3 用 Loopback0 建立 iBGP,AR2 与 AR3 用 Loopback0 建立 eBGP。将 AR2 上 Loopback100 宣告进 BGP,观察 AR1 上 100 网段的路由下一跳
允许从 iBGP 邻居收到的路由传递给其他 iBGP 邻居,打破了 iBGP 防环原则。采用独有的「Cluster List」和「Originator ID」属性防止路由环路 适合在已经具备了 BGP 的环境使用,在 eBGP 设备或中间设备做为 RR
1)RR 角色
- 路由反射器(Route Reflector):RR 之间需要建立 iBGP
- 反射客户端(Reflect-Client):由 RR 指定,只需要与 RR 建立 iBGP 邻居
- 非反射客户端(None-Client):需要与 RR 建立 iBGP。与非客户端之间需要建立 iBGP,否则没有路由
- 路由反射簇(Cluster):由客户端组成的管理域
- 默认的 Cluster ID 为 Router ID,由 RR 创建
- 一个 Cluster 可以包含多个 RR
- 一个 Client 可以属于多个 Cluster
始发者(Originator):标识路由的始发设备,用来防止在 Cluster 之间产生环路,由 RR 标记该路由始发设备的 Router ID,其他设备不能更改
2)路由宣告原则
从 None-Client 收到的路由只会传递给 Reflect-Client
- 从 Reflect-Client 收到的路由会传递给所有的邻居(在有冗余的环境下,包含发起该路由的客户端本身,否则不通告)
从 eBGP 传递过来的路由会传递给所有的 Reflect-Client 和 None-Client
3)RR 的防环规则
当 BGP Speaker 收到带有 Originator_ID 的路由时,则反射时不修改直接传递;如果收到不带有 Originator_ID 的路由时,则反射时添加路由通告者的Router ID(保证唯一性);如果收到路由与自身 Router ID 相同,则丢弃该路由(与 AS-Path 防环原则相同)
- 由多个 Cluster ID 组成 Cluster List,每经过一个 RR 就会在原有 Cluster List 前加上 RR 自己的 Cluster ID。当 RR 收到一条路由时,会检查 Cluster List 是否包含自己的 Cluster ID,如果包含则丢弃该路由(与 AS-Path 防环原则相同)
8. 联邦
没有打破 iBGP 防环原则,依旧遵循 适合在新建 BGP 环境中使用
- 联邦 AS:对联邦外的 AS 号码(诸如 USA)
- 成员 AS:成员之间采用 eBGP 连接,但路由表中表现为
iBGP
- 成员的下一跳(不管是从 eBGP 还是 iBGP 传递过来的路由,都不会修改下一跳地址)、MED值、本地优先级会继承 | 比较 | 联邦 | 反射器 | | —- | —- | —- | | 多层次 | 支持,并且可以在成员 AS 中使用 RR | 支持 | | 策略控制 | 更灵活 | 支持 | | iBGP 迁移 | 较大的变更 | 较小变更,灵活性高 | | 能力支持 | 都必须支持联邦能力 | 只要某台设备支持 RR,但在多级 RR 中需要都支持 | | IGP 扩展 | 支持单一或分开的 IGP | 一般为单一的 IGP,多 IGP 不建议使用 | | 使用情况 | 较少,一般用在大型网络环境 | 适应绝大部分网络环境 | | AS 合并 | 可以把新的 AS 作为成员 AS 合并 | / |
9. 团体属性
- 团体属性不受 AS 的限制(Attributes),自身不可以影响选路
给 BGP 的路由条目打上标记(匹配条件),确保路由过滤和选择的连续性,默认不向邻居更新团体属性
1)应用方式
向邻居传递路由时使用
- 从邻居收取路由时使用
-
2)保留的团体属性
0x00000000 ~ 0x0000FFFF
-
3)公认团体属性
Internet:可以向任何 BGP 邻居发送该属性(默认)
- No_Export:不向 eBGP 传递该路由(RR 如果不配置,对收到携带团体属性的路由不会把团体属性传递给其他邻居)
- Local-AS/No_Export_Subconfed:不传递出本地 AS 或联邦成员 AS
-
4)私有/自定义团体属性
可以用于路由清洗、控制路由的路径
- 默认情况下对设备中 BGP 路由表的所有条目都会携带团体属性
- 前两个字节由 AS 来编码,后两个字节是 0~65535 的任意数值(AS 2字节、Number 2字节)
10. BGP 路径属性
1)路径属性类型
- 公认属性:所有 BGP 路由器都必须识别的属性(默认向邻居传递这类属性)
- 公认必遵(Well-known mandatory):必须存在于 Update 消息中,如果缺少这种属性,路由信息就会出错
- Origin(起源属性)
- AS-Path(路径属性)
- Next-Hop(下一跳属性)
- 公认任意(Well-known discretionary):不要求必须存在于 Update 消息中,可以根据具体情况来决定是否添加到 Update 消息中
- Local-Preference(本地优先属性)
- Atomic-Aggregate(原子聚合属性)
- 公认必遵(Well-known mandatory):必须存在于 Update 消息中,如果缺少这种属性,路由信息就会出错
可选属性:不需要都被 BGP 路由器所识别(默认不向邻居传递这类属性)
- 可选过渡(Optional transitive):接收该属性的路由器如果不识别这种属性,可以转发给邻居路由器,邻居路由器可能会识别并使用到这种属性
- Aggregate(聚合者属性)
- Community(团体属性)
- 可选非过渡(Optional non-transitive):接收该属性的路由器如果不识别这种属性,将丢弃这种属性,不会再转发给邻居路由器
- 可选过渡(Optional transitive):接收该属性的路由器如果不识别这种属性,可以转发给邻居路由器,邻居路由器可能会识别并使用到这种属性
起源代码中
**i > e > ?**
,默认情况下不会被任何路由器修改(e 表示通告 EGP 学到的路由)② AS_Path
用于选路和防环。当从其他 AS 收到的路由中包含自己的 AS 号不会接收
是 BGP 路由的传输路径中所经历的 AS 列表
- BGP 路由表中各个条目的 AS_Path 越短越优,一般在最优的 eBGP 设备部署(特殊场景下可以针对某台设备配置忽略该选路原则)
- 默认不会接收 AS_Path 属性中包含本 AS Number,从而避免产生环路
- 但在某些特并采用 eBGP 接入到 ISP,如果不能接收包含本 AS Number 的路由,Hub 和 Spoke 的路由就不可达。所以需要在 Hub 节点配置本地 AS 号重复次数,解决该问题)AS 被分割),需要接收包含本 AS Number 的路由(Hub 和 Spoke 都运行的相同 AS 次数,解决该问题)
- 当 BGP Speaker 传递自身引入的路由时,只有在传递到 eBGP 邻居,才会在 Update 消息中携带本地 AS Number 的 AS_Path 列表
当 BGP Speaker 传递从其他 BGP Speaker 学到的路由时,只有在传递到 eBGP 邻居,才会把本地 AS Number 添加在 AS_Path 列表最前面
③ Next_Hop
iBGP 向 iBGP 邻居传递路由时,自己的更新源地址就是下一跳地址
- eBGP 向 iBGP 邻居传递学到的路由时,不会改变路由信息的下一跳属性「解决方案:下一跳自我」
- eBGP 向 eBGP 邻居传递路由时,会把下一跳属性设置为本地与邻居建立关系的接口地址
在多点接入网络中,Cisco 会有类似 OSPF FA 地址类似的特性(重定向)
表示 BGP 路由条目的优先级,用来判断流量离开 AS 时的最佳路由[多出口使用,影响流量出本 AS]
- BGP 设备通过不同的 iBGP 邻居得到目的地址相同但下一跳不同的多条路由时,将优选 Local Pref 属性值较高的路由
[仅在 iBGP 邻居之间有效],可以被 RR 反射,不会通告给其他 AS。Loacl Perf 「值越高越优」,默认优先级为「100」
当明细路由被聚合后,用来通知其他 BGP 设备在聚合过程中丢失了一些路径属性,华为中默认继承 Community 和 Origin,只有 AS-Path 没有继承(需要通告 AS-Set 继承)
可能变化的属性(继承的属性)
- 是否发布明细路由和控制
- 默认情况下不会抑制明细路由,当采用
detail-suppressed
suppress-policy
origin-policy
可以控制明细路由的发布、抑制和指定哪些明细路由被聚合
- 默认情况下不会抑制明细路由,当采用
- AS-Path
- AS-Set(无序):会把来自不同 AS 的 AS 号码无序的排在聚合路由的 AS-List 里,标明聚合路由经过的 AS,从而避免环路的产生
- 如果聚合路由不是在始发设备的 AS 做的聚合,而由其他 AS 设备做聚合并且不携带 AS-Set 属性(聚合的路由中不包含始发 AS-Path),那么这条聚合路由在传递到原始 AS 时,会接收并计算路由,从而产生环路风险
- AS-Sequence(有序):每经过一个 AS 都会把经过的 AS 号码排在 AS-Path 前端
- AS-Set(无序):会把来自不同 AS 的 AS 号码无序的排在聚合路由的 AS-List 里,标明聚合路由经过的 AS,从而避免环路的产生
- Origin:当聚合路由的 Origin 属性不同时,在华为中聚合后标记为
?
,在Cisco 中标记为i
,会影响路由的选路。可以通过attribute-policy
修改起源属性或其他属性 - Community:不携带 Atomic-Aggregate 属性时,才会进行累加
- ….
⑥ Aggregator(聚合者)
- 是否发布明细路由和控制
标识聚合者的 Router ID,用来精确的找到聚合路由的源头。手工聚合的路由优先级高于自动聚合
⑦ Community(团体属性)
用于标识具有相同特征的 BGP 路由,类似于 VLAN Tag
- 团体属性由一系列4字节(0x00000000~0xFFFFFFFF)数值组成
公认团体属性
表示 BGP 路由的 Cost 值,用于判断流量进入 AS 时的最佳路由。如果是从 IGP 协议引入的路由,会继承 IGP 的 Cost 值
- 起源自 eBGP 设备本地的 MED 可以通告给所有的邻居,但对来自 iBGP 内的路由里的 MED 值只能通告给 iBGP,给其他 eBGP 不会携带 MED 值
- [对所有的 BGP 邻居都可以生效],但仅在相邻的两个 AS 之间传递
默认[MED 值只会比较来自同一起始 AS 的路由],MED 「值越小越优」,默认为「0」
RR 的防环机制。避免在有冗余 RR 的环境中,收到自己传递出去的路由,避免环路产生
当 BGP Speaker 收到带有 Originator_ID 的路由时,比较是否是自身的 Router ID,如果相同则丢弃该路由(与 AS-Path 防环原则相同)
⑩ Cluster-List(集群列表)
RR 的防环机制。在 RR 反射路由时将自己的 Cluster ID 组成 Cluster List
- 每经过一个 RR 就会在原有 Cluster List 前加上 RR 自己的 Cluster ID。当 RR 收到一条路由时,会检查 Cluster List 是否包含自己的 Cluster ID,如果包含则丢弃该路由(与 AS-Path 防环原则相同)
11. BGP 选路原则
如果路由的下一跳不可达,忽略此路由
- Preferred-Value/Weight 值越高的优先[仅本地有效,默认 = 0]
- Local-Preference 值越高的路由优先[仅 iBGP 和联邦成员 AS 传递,默认 = 100]
- ASNIL(本地产生的路由 > 从邻居学到的路由[本地手动聚合路由(可以聚合 Network 和 Import) > 本地自动聚合路由(只能聚合 Import) > Network > Import > 从邻居学到的路由])
- AIGP(可选非过渡属性,有AIGP的优于没有AIGP属性的;先比较AIGP属性,再比较IGP Cost之和)
- AS_Path 越短越优
- 比较 Origin 属性[IGP > EGP > Incomplete
**i > e > ?**
] - 选择 MED 值较小的路由[默认 = 0]
- eBGP 路由 > iBGP 路由 > Loacl Cross > Remote Cross
- BGP Next_Hop 中 IGP Metric 最小的路由
- ECMP 负载均衡[前面 8 条都比较不出来,AS-Path需要完全相同(联邦成员 AS 不可以)]
- 时间更久的 eBGP(Cisco 私有)
- Cluster_List 越短越优
- Router_ID/Originator ID 越小越优(经过 RR 反射的比较 Originator ID;不经过 RR 反射的比较 Router ID)
- 选择有较小 IP 地址邻居的路由
12. 正则表达式
AS-Path Filter:在同一个列表编号下,可以定义多条过滤策略(permit 或 deny)。在匹配过程中,这些规则之间是 “或” 的关系,只要路由信息通过其中一项规则,就认为通过由该列表编号标识的这组 AS-Path 过滤列表
- 可以用作过滤或命中后匹配其他工具使用
- AS-Path Filter 有风险,谨慎使用
- BGP 的正则表达式由 “符号” 和 “AS号码” 组成
| 符号 | 说明 |
| —- | —- |
|
^
| 匹配一个字符串的开始(^200
表示只匹配 AS-Path 的第一个值为200) | |$
| 匹配一个字符串的结束(例如:200$
表示只匹配 AS-Path 的最后一个值为200) | |.
| 匹配任何单个字符以及符号(包括空格) | |+
| 匹配前面的一个字符或一个序列,可以一次或多次出现 | |_
| 匹配一个符号(例如:逗号,
、括号()
、空格` 等) | |
*| 匹配前面的一个字符或一个序列,可以零次或多次出现 | |
()| 匹配变化的 AS 或一个独立的匹配,通常和
|一起使用 | |
|| 逻辑或 | |
[]| 匹配一个范围内的 AS,通常和
-一起使用 | |
-` | 连接符 |
1)正则表达式匹配示例
**^ ***
开始符号和结束符号的使用:**ip as-path-filter 1 permit **``**^12.*74$**
- 表示匹配 AS 号码 以 “ 12” 开始,并且 AS 号码 以 “74” 结束
- AS_Path(123 621 743 34512 2374)
- 表示匹配 AS 号码 以 “ 12” 开始,并且 AS 号码 以 “74” 结束
**|**
逻辑或的使用:**ip as-path-filter 1 permit **``**23|43**
- 表示匹配 AS 号码中带有 “23 或 43”
- AS_Path(123 621 743 34512 2374)
- 表示匹配 AS 号码中带有 “23 或 43”
**[]**
匹配范围的使用:**ip as-path-filter 1 permit **``**[1-3][47]**
- 表示匹配整个 AS-Path 中带有 “14、17、24、27、37“
- AS_Path(123 621 743 34512 2374)
- 表示匹配整个 AS-Path 中带有 “14、17、24、27、37“
**_**
匹配一个符号的使用:**ip as-path-filter 1 permit **``**_34512 170$**
- 表示匹配以 “AS 号码 34512 与 170 直接相连 “
- AS_Path(123 621 743 34512 170)
- 表示匹配以 “AS 号码 34512 与 170 直接相连 “
**.**
匹配一个符号或字符的使用:**ip as-path-filter 1 permit **``**[1-3].[47]**
- 表示匹配整个 AS-Path 中带有 “14、17、24、27、37 和所有中间带符号的相连“
13. 多协议 BGP(MP-BGP)
- 对 IPv4 组播网络的支持称为 MBGP(RPF 检测)
- 对 IPv6 单播网络的支持成为 BGP4+(只支持手动聚合)
- 不变更下一跳地址:可以强制对邻居使用不变更下一跳地址
next-hop-invariable
- 被动侦听: 由对端向本端发起主动建立 BGP 的 179 端口
listen-only
- AS 欺骗:华为VRP5设备只会保留虚假的AS,会影响路由选路。cisco会在原有AS前增加虚假AS
fake-as
- 移除私有AS:华为 VRP5 设备会把所有私有 AS 移除,导致 AS 变短,有可能会影响路由选路
public-as-only
- 自动聚合:于 RIP 类似自动汇总为主类路由,只会汇总起源为
?
的路由summary automatic
- 通过其他手段汇总:通告静态或 IGP 进行汇总后通告
aggregate
- 接收重复的 AS 号码:允许 BGP 接收重复 AS 号的路由,特殊环境使用
allow-as-loop
- 不同 AS 的 MED值比较:比较从任意 AS 收到的相同路由条目的 MED 值
compare-different-as-med
- BGP的默认路由:可以从其他路由协议引入默认路由或 Network,也可以针对邻居产生默认路由
default-route-advertise
- Null0 接口:可用于路由清洗(防止潜在的环路)
- BGP认证:针对的是 TCP 报文的认证,存在于 TCP 报文的可选项字段中,Option 19,只能使用 MD5 方式