BGP基础
AS概念,64512-65534为私有AS号,其余公有AS号
BGP 的主要特点是路由的传递,而非路由的学习,只要两个路由器之间 TCP 可达,就可建立 BGP 的邻居关系
TCP 端口:179
BGP 对等体关系:AS 内部(IBGP),AS 之间(EBGP)
通常分为物理接口IP地址和Loop Back地址,物理地址之间(常用于EBGP)和LoopBack地址之间(常用于IBGP)建立邻居关系更好
BGP 报文类型
Open 报文:协商 BGP 参数,建立对等体关系
Update 报文:交换路由信息,发送 BGP 路由更新
Keeppalive 报文:保持邻居关系,维持 BGP 对等体关系
Notification 报文:差错报告,中止对等体关系
Route-Refresh 报文:用于在改变路由策略后请求对等体重新发送路由信息
BGP 的状态
1. Idle:是 BGP 的初始状态,在 Idle 状态下,BGP 拒绝邻居发送的连接请求,也不会向邻居发送 TCP syn,只有 32s 后才会向邻居发送 TCP syn,并且将邻居转为 connect 状态
卡在 Idle 状态的原因:本地没有去往邻居的路由
**2.**Connect :BGP 启动连接重传定时器,等待 TCP 完成连接
如果 TCP 连接成功,那么 BGP 向对等体发送 Open 报文,并转至 OpenSent 状态
如果 TCP 连接失败,那么 BGP 转至 Active 状态
如果 TCP syn 没有收到邻居的响应,将会卡在 Connect 状态,总是尝试与 BGP 邻居建立 TCP 连接
常见卡在 Connect 状态的原因:
-
邻居没有启用 BGP 协议
-
沿途路径存在流量过滤将 TCP syn 拒绝了
-
EBGP 邻居建立没有配置多跳
**3.**Active:TCP 连接没建立成功,反复尝试 TCP 连接
如果 TCP 连接成功,BGP 向对等体发送 Open 报文,关闭连接重传定时器,并转至 OpenSent 状态
如果 TCP 连接失败,BGP 停留在在 Active 状态
**4.**Open Sent:TCP 连接已经建立成功,开始发送 Open 包,Open 包携带参数协商对等体的建立
**5.**OpenConfirm:参数、能力特性协商成功,自己发送 Keepalive 包,等待对方的 Keepalive 包
6. Established:已经收到对方的 Keepalive 包,双方能力特性经协商发现一致,开始使用 Update 通告路由信息
BGP 邻居关系的建立

EGBP:不同 AS 号之间的邻居关系,一般使用 物理接口建立 邻居关系
IBGP:相同 AS 号之间的邻居关系,一般使用 loopback 接口建立邻居关系,因为更加稳定
默认建立 EBGP 邻居关系的时候,发送报文的 TTL = 1
默认建立 IBGP 邻居关系的时候,发送报文的 TTL = 255
BGP 路由的产生方式
- 通过 network 的方式,将本地路由表中的路由发布出去
- 通过 import-route 的方式,将其他协议的路由引入到 BGP 协议中
- 通过手动聚合的方式,产生一条聚合路由(汇总)
- 通过自动聚合的方式,产生一条聚合路由
BGP 本身不计算路由,只是路由的搬运工
BGP 的路由通告原则
BGP 只会将有效路由中最优的 BGP 路由通告给邻居
- 自身产生的 BGP 路由通告给所有的 BGP 邻居
- 从 IBGP 邻居收到的路由,不会传递给 IBGP(目的是为了防环),但可以传递给 EBGP
- 从 EBGP 邻居收到的路由,会传递给 IBGP 和 EBGP
BGP 的防环原则:
AS 内的防环使用 IBGP 水平分割机制(只传一跳),即从 IBGP 邻居收到的路由不会传递给另一个 IBGP
AS 之间的防环:利用了 BGP 的路由属性,即 BGP 将路由发送给 EBGP 邻居的时候会将自身的 AS 号添加到 AS-Path 列表中,并且规定从 EBGP 邻居收到的路由如果携带自身 AS 号,则拒绝接收该路由
BGP 下一跳属性的特点:
- 自身产生的路由发送给所有 BGP 邻居的时候,下一跳自动修改
- 从 EBGP 邻居接收的路由发送给 IBGP 邻居的时候,下一跳不会自动给修改
- 从 EBGP 邻居接收的路由发送给 EBGP 邻居的时候,下一跳自动修改
- 从 IBGP 邻居接收的路由发送给 EBGP 邻居的时候,下一跳自动修改
- 从 IBGP 邻居接收的路由不存在发送给 IBGP 邻居的情况(防环)
修改下一跳:[AR2-bgp]peer 4.4.4.4 next-hop-local 针对邻居配置下一跳
配置地方:在 AS 的边界设备上,针对本 AS 内的 IBGP 邻居配置
自动修改,指的是将路由传递给该邻居的时候,下一跳修改为自身与该其建立邻居关系的接口 IP
BGP 的配置过程
1、通过物理地址建立EBGP邻居很简单。本身物理地址可达。
Huawei\]bgp 100 \[Huawei-bgp\]peer 10.0.0.2 as-number 200 2、通过loopBack建立EBGP邻居一定要注意Loop Back地址可以访问。还要声明用的loopback本地接口, 还要修改EBGP的TTL值至少是2(EBGP的TTL值默认为1)。 \[Huawei\]bgp 100 \[Huawei-bgp\]peer 2.2.2.2 as-number 200 \[Huawei-bgp\]peer 2.2.2.2 connect-interface LoopBack 0 \[Huawei-bgp\]peer 2.2.2.2 ebgp-max-hop 2 3、通过物理地址建立IBGP邻居很简单。本身物理地址可达。 \[Huawei\]bgp 100 \[Huawei-bgp\]peer 10.0.0.2 as-number 100 4、通过loopBack建立IBGP邻居一定要注意Loop Back地址可以访问。还要声明用的loopback本地接口。 Huawei\]bgp 100 \[Huawei-bgp\]peer 2.2.2.2 as-number 100 \[Huawei-bgp\]peer 2.2.2.2 connect-interface LoopBack 0 \[Huawei-bgp\]peer 2.2.2.2 next-hop-local //修改下一跳 5、BGP的发布:network和import-route ,区别是network只能一条一条发布,import-route可以多条发布。 \[Huawei\]bgp 100 \[Huawei-bgp\]network 192.168.1.1 32 ## 路由黑洞 BGP 支持跨跳建立邻居关系,虽然在控制平面上形成了邻居关系,但有可能中间跨过的设备没有配置 BGP 协议,导致在传输层面无法实现传输,此成为路由黑洞 ## BGP 的路径属性类型 公认必遵:公认:所有路由器都能识别的属性;必遵:所有路由器传递路由的时候必须携带 公认任意:任意:传递BGP路由的时候可以携带也可以不携带 可选过渡:传递BGP路由的时候如果携带了某个属性,传递给另外的路由器,该路由器不能识别该属性,它也可以把这条BGP路由传递给下一个路由器 可选非过渡:传递BGP路由的时候如果携带了某个属性,传递给另外的路由器,该路由器不能识别该属性,它不能把这条BGP路由传递给下一个路由器 **Local-prefe** **:(本地优先级)** 公认任意属性 只在一个 AS 内部进行传递,不会传递给 EBGP 邻居 用于 BGP 路由的路径选择(默认 100,越大越优先) 应用在 AS 内存在多个出口的时候选择一个出口访问外部网络 EBGP 路由不携带本地优先级属性,对于不携带本地优先级属性的 BGP 路由,设备将会认为这个 BGP 路由的本地优先级为默认本地优先级(默认本地优先级为 100) 修改方式: 1. 针对接受或者发送给 BGP 邻居的路由进行修改(route-policy) EBGP 邻居之间 out 方向不可以修改 EBGP 邻居之间 in 方向可以修改 IBGP 邻居之间可以在 in/out 方向进行修改 2. 改默认的本地优先级 \[AR2-bgp\] default local-preference //修改默认的本地优先级 关键点:在只会对没有本地优先级属性的路由生效 哪些 BGP 路由没有本地优先级: 自身产生的:network 和 import-route 指定变成的 BGP 路由没有本地优先级 邻居传递的:EBGP 邻居传递的路由默认没有本地优先级 3. 优选本都生成的路由: 手动聚合 \> 自动聚合 \> network \> import-route \> 邻居传递的 当下一跳等于 127.0.0.1 或者 0.0.0.0 的时候,路由即为本地产生的 4. AS-path 公认必遵属性 用于 AS-path 之间的防环属性 用于 BGP 路由的路径选择 路径选择:当存在去往同一个目的地的多条 BGP 路由时,比较两条路由的 AS-path 属性,越短越优先 AS-path 修改方式:AS-path 在任何 BGP 邻居之间的 in/out 方向都可以进行修改 Apply as-path 100 100 additive //在原有的 as-path 列表中添加新的 as 号 Apply as-path 100 100 overwrite //使用新的 as-path 覆盖原有的 as-path Apply as-path none overwrite //清除原有的 as-path 5. Next-Hop:下一跳属性原则 (1)来源于EBGP的路由通告给EBGP邻居会自动更新源地址。 (2)来源于EBGP的路由通告给IBGP邻居不会自动更新源地址,导致路由不可用,需要手动更新源地址。\[Huawei-bgp\]peer 10.0.0.4 next-hop-local (3)来源于EBGP的路由和对等体之间是共享型的网络,则路由的下一跳保持不变。 6. Origin(起源属性) 公认必遵属性 描述了这条路由是如何成为 BGP 路由的 用于 BGP 路径选择 取值:i:表明该路由是通过 network 的方式变成的 BGP 路由 ?:表明该路由是通过 import-route 方式变成 BGP 路由 e:表明从 EGP 协议学习到的路由 选路规则:I \> e \> ? 7. MED 也叫 BGP 的 cost 值,或者叫做 BGP 的度量值,主要影响邻居 AS 的选路 可选非过渡属性(不会传递给邻居) 用于 BGP 路由的路径选择,越小越优先 如果报文中不携带 MED 值,默认 MED 值为 0 华为 MED 通告原则: 自身始发的路由,MED 会通告为 IBGP 和 EBGP 邻居 从 IBGP 邻居接受的路由,传递给 EBGP 邻居的时候,不携带 MED 从 EBGP 邻居接受的路由,传递给 IBGP 邻居的时候,携带 MED 从 EBGP 邻居接受的路由,传递给 EBGP 邻居的时候,不携带 MED MED 的修改方式: 在所有的 BGP 邻居之间 in/out 方向均可修改 MED 选路方式: 默认情况下,只有当了两条 BGP 路由 as-path 列表中,最左边的 AS 号相同的时候,才会进行 MED 的比较 MED:只能在相邻 AS 之间传递,跨越 AS 无法传递,直接和静态的 MED 值为 0 8. Preferred-Value(协议首选值):华为设备的特有属性,该属性仅在本地有效。该值越大,则路由越优先。Preferred-Value只能在路由器本地配置,而且只影响本设备的路由优选。该属性不会传递给任何BGP对等体。 ## Local Preference和MED属性选路的区别: (1)Local Preference值越大越优先,MED越小越优先 (2)Local Preference用于AS内部(IBGP),MED用于AS之间(EBGP) (3)Local Preference用于AS内选择出口,MED用于AS之间选择入口 ## BGP 路由的优选规则顺序 1、优选Preferred-Value属性值最大的路由。 2、优选Local_Preference属性值最大的路由。 3、本地始发的BGP路由优于从其他对等体学习到的路由,本地始发的路由优先级:优选手动聚合\>自动聚合\>network\>import\>从对等体学到的。 4、优选AS_Path属性值最短的路由。 5、优选Origin属性最优的路由。Origin属性值按优先级从高到低的排列是:IGP、EGP及Incomplete。I\>e\>? 6、优选MED属性值最小的路由。 7、优选从EBGP对等体学来的路由(EBGP路由优先级高于IBGP路由)。 8、优选到Next_Hop的IGP度量值最小的路由。 以上8条均满足,则在全局路由表中会形成等价路由,需要通过命令设置等价路由数量,但等价路由在BGP路由表中仍然会继续优选。 9、优选Cluster_List最短的路由。 10、优选Router ID(Orginator_ID)最小的设备通告的路由。 11、优选具有最小IP地址的对等体通告的路由。 ## BGP 路由的聚合 ### 聚合的优势: 1. 优化 BGP 设备的路由表和 BGP 表 2. 当明细路由出现震荡之后,聚合路由不会产生影响,网络更加稳定 3. 维护较少的 BGP 路由,节省设备资源 4. 当所有明细路由失效之后,聚合路由才会失效 ### 自动聚合:IPv4支持 默认关闭状态 自动聚合只能聚合成为有类网络,聚合的精确度差 只能针对本设备 import-route 的路由生效,灵活性交差 执行自动聚合时,不能添加 route-policy 修改路由的部分属性 \[AR1-bgp\] summary automatic //开启自动聚合功能 ### 手动聚合:IPv4 和 IPv6 同时支持 只要在本地 BGP 表中存在的有效路由,就可以执行,灵活度较强 聚合路由属于本地始发的路哟,会通告给所有的 BGP 邻居 \[AR1-bgp\] aggregate 192.168.0.0 22 detail-suppressed //执行路由聚合的时候,抑制明细路由 \[AR1-bgp\] aggregate 192.168.0.0 22 as-set //生成具有 as-set 的路由 \[AR1-bgp\] aggregate 192.168.0.0 22 attribute-policy route-policy-name //产生聚合路由的时候关联 route-policy,对聚合路由属性进行修改 \[AR1-bgp\] aggregate 192.168.0.0 22 origin-policy route-policy-name //按照指定要求产生聚合路由,即如果 BGP 表中存在满足 route-policy 匹配的路由,才会产生聚合路由 \[AR1-bgp\] aggregate 192.168.0.0 22 suppress-policy route-policy-name //产生聚合路由的时候,只有满足 route-policy 的明细路由才会被抑制 ## BGP 的反射: 场景来源于BGP的通告规则三,来源于IBGP的路由不能再发送给IBGP的邻居。但是又需要让AS内部全覆盖BGP的路由,则可以通过IBGP邻居的全互联和BGP反射两种方式解决。 传递:通过邻居关系完成,传递过程中有可能改变BGP的某些属性; 反射:通过反射器完成,反射过程中不会改变BGP的任何属性。 BGP的反射场景角色: 反射器(RR):只传递最优的 BGP 邻居 客户端(C):反射获取的路由 非客户端(NoneC):传递获取的路由,没有被配置为客户机的所有 IBGP 邻居,均为客户机 ### 反射规则: 1. 如果路由反射器从自己的非客户对等体学习到一条IBGP路由,则它会将该路由反射给所有客户,其余非客户不会传递,所以需要在非客户之间建立邻接关系,来实现整个区域的互通 2. 如果路由反射器从自己的客户学习到一条IBGP路由,则它会将该路由反射给所有非客户,以及除了该客户之外的其他所有客户 3. 如果路由学习自EBGP对等体,则发送给所有客户、非客户IBGP对等体。 从客户机收到的路由,反射给所有的客户机 从客户机收到的路由,反射给其他的非客户机 从非客户及收到的路由,反射给其他的客户机 从非客户机收到的路由,不反射给非客户机 ## 反射簇:反射器和该反射器的客户所构成的逻辑区域。 Originator_ID:单簇防环,该路由器的Router-ID,在反射场景中,会记录每经过反射一次的路由器的Originator_ID,若该路由被反射到另外的路由器上,则接受该路由的路由器会对比Originator_ID和自身的Router-ID是否一致,若一致则拒绝接受,若不一致则接受。 Cluster_List:多簇防环。Cluster_List类似于AS_Path,多簇场景中,每经过一个簇会记录该簇的Cluster_ID,多个Cluster_ID组合在一起形成了一个Cluster_List,当路由反射进某个簇的时候,会对比该簇的Cluster_ID是否存在于Cluster_List中,若存在则拒绝接受,若不存在则可以接受,作用类似于AS_Path。 Cluster_ID:默认是每个簇中的RR的Router_ID作为该簇的Cluster_ID,若某个簇中有多个RR,则需要通过命令指定多个RR具有同一个Cluster_ID。 RR 将路由反射出去的时候添加两个属性:Originator ID、Cluster List 用于防止环路 ### 起源 ID: RR 将路由反射出去的时候添加 Originator ID,取值为 IBGP 邻居的 Router ID 当 BGP 设备接受一条路由之后,起源 ID 和 自身 Router ID 相同,则拒绝接受该路由,反之接受 ### 簇列表: 前提:每个 RR 都会有一个 Cluster ID,默认取值为自身的 Router ID 当 RR 将路由反射出去的是偶会将自身的 Cluster ID 添加到路由的 Cluster list 中 当 RR 收到一条 BGP 路由时,如果路由的 Cluster list 包含自身的 Cluster ID,则拒绝接受,反之接受 ## BGP 反射配置: 1. 配置路由反射器及其客户端 > \[Huawei-bgp\] **peer** {*group-name* \| *ipv4-address* }**reflect-client** \[AR2-bgp234\] Peer 3.3.3.3 reflect-client //在 AR2 上指定该邻居为自己的客户机,非客户机就是没有被配置为客户机的所有 IBGP 邻居 2. 配置路由反射器的集群 ID > \[Huawei-bgp\] **reflector cluster-id** *cluster-id* 缺省情况下,每个路由反射器使用自己的 Router-ID 作为集群 ID ## BGP 联盟 在大的 AS 中划分成多个小的 AS,对外隐藏了联盟内部的细节,使用的是联盟对外的 AS 号 成员 AS:小 AS,在一个大的 AS 中划分的各个小的 AS 号,也叫 子 AS 联盟 AS:大 AS,部署了联盟的 AS 成员 EBGP 邻居:在成员 AS 之间建立的 EBGP 邻居关系 联盟 EBGP 邻居:EBGP 邻居,与其他常规 AS 之间建立的 EGBP 邻居 公有 AS 号范围:1\~64511(一般子 AS 使用的范围) 私有 AS 号范围:64512\~65535 针对非 peer-as 发送的 open 报文, my as 字段取值为联盟 AS 号 针对 peer-as 发送的 open 报文,ms as 字段取值为成员 AS 号 联盟 AS 内部存在多个成员 AS,成员 AS 之间建议使用相同的 IGP 协议 基于成员 EBGP 邻居之间传递路由,当做 IBGP 同等对待原则:从成员 EBGP 邻居接受到的路由,传递个其他成员 EBGP 邻居或者 IBGP 邻居时,无法使用 Next-hop-local 修改下一跳属性,也基于这一特性,所以建议联盟 AS 内部存在多个成员 AS 时,成员 AS 之间使用相同的 IGP 协议 ### 配置代码: 配置联盟 AS 号(对外的 AS 号) > \[AR1-bgp\] confederation id + AS 号 配置联盟内的其他子 AS 号 > \[AR1-bgp\] confederation peer-as + 子 AS 号(可以同时添加多个) ## BGP 安全特性 ### BGP 认证 BGP 仅支持 MD5 认证,没有明文认证,BGP 认证由 TCP Options 携带完成 > \[AR1-bgp\] peer + 对端地址 + password simple/cipher + 密码 ### GTSM 检测 IP 报文头中的 TTL 值是否在一个预先设置号的特定范围内,并对不符合 TTL 值范围的报文进行允许通过或丢弃的操作,从而实现了保护 IP 层以上业务,增强系统安全性的目的 > \[AR1-bgp\] peer + 对端地址 + valid-ttl-hops + 跳数 \[1\~255\] //该邻居发送的 BGP 报文 TTL 要在(255-跳数+1)范围内 跳数的设置范围遵循一下规则:TTL 的取值范围 \[255 - hops + 1,255\],取值范围为 1\~255,默认为 255 ### 限制从邻居接受的路由数量 在运营商之间,为了保障设备系统资源而做出的一种限制 > \[AR1-bgp\] peer + 对端地址 + route-limit + 最大接受的数量 + 最大接受数量的百分之多少 (超过这个值就会警报) > \[AR1-bgp\] peer + 对端地址 + route-limit 10 70 //最多收到 10 条路由,告警阀值为 70%,如果超出了最大数值,则断开 BGP 邻居,30s 后重建 可以在末尾添加的参数  ### AS-Path 长度保护 超出 AS-Path 长度范围的将会拒绝接收该路由,但 BGP 邻居关系依然建立 > \[AR1-bgp\] as-path-limit 3 //用来接收或发送 BGP 路由的 as-path 的长度为 3 ## BGP4+ 用于 IPv6 ### BGP4+ 的基础配置命令 1. 配置 BGP 对等体 > \[Huawei-bgp\] peer ipv6-address as-number { as-number-plain \| as-number-dot } 在 BGP 视图下,创建 IPv6 对等体 2. 使能 BGP 对等体 > \[Huawei-bgp\] ipv6-family \[ unicast \| vpnv6 \| vpn-instance vpn-instance-name
Huawei-bgp-af-ipv6\] peer ipv6-address enable
- 配置 BGP 路由注入
Huawei-bgp-af-ipv6\] network ipv6-address prefix-length \[ route-policy route-policy-name
检查 BGP4+ 基本功能的配置结果
- 查看 BGP4+ 的对等体信息
Huawei\] display bgp ipv6 peer ipv6-address \[ verbose
- 查看 BGP4+ 的路由信息
Huawei\] display bgp ipv6 routing-tabl