16.BGP
BGP 概述
定义:BGP 是一种外部网关协议,用于在不同的自治系统(AS)之间交换路由信息。
传输协议:基于 TCP,端口号为 179。
特点:
- 可靠性:基于 TCP,因此不需要额外的可靠性机制。OSPF 需要周期性更新和确认报文,而 BGP 不需要。
- 增量更新:只在路由发生变化时发送更新信息,无需周期性更新。
- 支持 CIDR:除 RIPv1 外,其他协议都支持 CIDR。
- 距离矢量协议:基于路径向量算法,通过技术手段避免环路。
- 丰富的路由策略:支持多种路由策略,防止路由震荡,易于扩展。支持 IPv4、IPv6、MPLS VPN、EVPN 等多种扩展功能。
一台路由器上面只能运行一个bgp 的进程。
BGP是怎么工作的?
BGP中的角色
-
Speaker:发送BGP报文的路由设备称为BGP发言者(Speaker)。它接收或产生新的路由信息,并发布给其它BGP Speaker。当BGP Speaker收到来自其它AS的新路由时,如果该路由比当前已知路由更优,或者当前还没有该路由,它就把这条路由发布给所有其他BGP Speaker(发布该路由的BGP Speaker除外)。
-
Peer:相互交换报文的BGP Speaker之间互称对等体(Peer)。
BGP的报文类型
BGP通过五种类型的报文进行通信:
-
Open报文:是TCP连接建立后发送的第一个报文,用于建立BGP对等体之间的邻居关系,协商参数。对等体在接收到Open报文并协商成功后,将发送Keepalive报文确认并保持连接的有效性。
-
Keepalive报文:BGP会周期性地向对等体发出Keepalive报文,用来保持邻居关系。
OSPF的hello报文的作用是建立邻居、保持邻居。
-
Update报文:用于在对等体之间交换路由信息。Update报文可以发布多条属性相同的可达路由信息,也可以撤销多条不可达路由信息。
-
Notification报文:通知错误。当BGP检测到错误状态时,会向对等体发出Notification报文,之后BGP连接会立即中断。
-
Refresh报文:用于请求对等体重新发送所有的可达路由信息,通常在改变路由策略后使用。
BGP有限状态机及工作流程
在BGP对等体建立的过程中,BGP有限状态机共有六种状态
- Idle(空闲):初始状态,路由器关闭所有已有的BGP连接,并开始初始化BGP资源。
路由器会等待开始事件的发生,然后转移到Connect状态。
-
Connect(连接):尝试建立TCP连接。如果成功,转移到OpenSent状态;如果失败,转移到Active状态。
-
Active(活动):继续尝试建立TCP连接。如果成功,转移到OpenSent状态;如果失败,保持在Active状态。
-
OpenSent(开启发送):发送OPEN消息,等待对方的OPEN消息。如果有效,转移到OpenConfirm状态。
-
OpenConfirm(开启确认):等待KEEPALIVE或NOTIFICATION消息。如果收到KEEPALIVE消息,转移到Established状态。
-
Established(已建立):正常工作状态,可以发送/接收UPDATE、KEEPALIVE、NOTIFICATION和REFRESH消息。
这些状态的转换是由BGP的有限状态机(FSM)控制的,每个状态都有明确的输入和输出条件。
BGP对等体双方的状态必须都为Established,BGP邻居关系才能成立,双方通过Update报文交换路由信息。
邻居建立过程图
- 在任何状态下,如果检测到错误,则发送 Notification 报文并回到 Idle 状态。
- 如果 TCP 三次握手失败,则进入 Active 状态,并不断尝试重新建立连接。
IBGP邻居建立实验
实验环境
- 两台路由器:
Router 1
和Router 2
- AS 号:100
- 使用 Loopback 接口建立邻居关系
- 推荐使用 Loopback 接口的原因:
- 可靠性更高
- 不需要直接相连
- 只需底层 IP 可达即可
配置步骤
配置IP地址
R1
<Huawei>sys
[Huawei]sys R1
[R1]inter gi 0/0/0
[R1-GigabitEthernet0/0/0]ip add 12.1.1.1 30
[R1-GigabitEthernet0/0/0]inter loop0
[R1-LoopBack0]ip add 1.1.1.1 32
[R1-LoopBack0]q
R2
<R2>sys
[R2]sys R2
[R2]inter gi 0/0/0
[R2-GigabitEthernet0/0/0]ip add 12.1.1.2 30
[R2-GigabitEthernet0/0/0]inter loop0
[R2-LoopBack0]ip add 2.2.2.2 32
[R2-LoopBack0]q
配置 BGP
[R1]bgp 100
[R1-bgp]peer 2.2.2.2 as-number 100
[R2]bgp 100
[R2-bgp]peer 1.1.1.1 as-number 100
查看bgp邻居状态
display bgp peer
问题1:此时状态处于Idle状态,因为路由不通
两边路由不通,解决办法添加路由,这里使用静态路由
[R1]ip route-static 2.2.2.2 32 12.1.1.2
[R2]ip route-static 1.1.1.1 32 12.1.1.1
问题2:此时邻居开始建立,但状态处于Active状态,即TCP/IP状态建立失败。
原因:目的地址2.2.2.2
的出接口是G/0/0/0
,TCP/IP的SYN报文在封装的时候就会以出接口的IP地址作为源地址去封装,也就是12.1.1.1
;R2在收到SYN报文后会检查SYN报文,源地址2.2.2.2
证明是发给R2处理的,但是源地址是12.1.1.1
与R2的邻居配置冲突,R2不想跟他做邻居,就会回复一个RST报文,三次握手建立失败。
回复一个RST报文,TCP/IP三次握手连接建立失败。
解决办法:将源IP12.1.1.1
改为1.1.1.1
,这个技术就叫做更新源。
[R1]bgp 100
[R1-bgp]peer 2.2.2.2 connect-interface LoopBack 0 #将目的地址为2.2.2.2的路由的源地址修改为loopback0的地址
[R2]bgp 100
[R2-bgp]peer 1.1.1.1 connect-interface LoopBack 0
其实配一边的话TCP/IP就能建立,BGP就能走,但是为了健壮性还是两边都配。
三次握手建立成功后,BGP邻居建立成功。
问题3:如果处于Connect状态的原因:
- 对端没有回程路由
- 中间有防火墙,没有放通BGP端口号(BGP的端口号:179)
BGP的路由引入
BGP协议自身不能发现路由,所以需要引入其他协议的路由(如IGP或者静态路由等)注入到BGP路由表中,从而将这些路由在AS之内和AS之间传播。
BGP的路由引入
BGP引入路由支持Import和Network两种方式:
-
Import方式是按协议类型,将RIP路由、OSPF路由、IS-IS路由、静态路由和直连路由等某一协议的路由注入到BGP路由表中;
- 静态路由引入:通过
import static
命令将静态路由引入BGP。
- 静态路由引入:通过
-
Network方式比Import方式更精确,将指定前缀和掩码的一条路由注入到BGP路由表中。
BGP路由引入实验
- 添加两个loopback地址来模拟用户
[R1]int loop 1
[R1-LoopBack1] ip address 100.1.1.1 32
[R2]int loop 1
[R2-LoopBack1] ip address 200.1.1.1 32
BGP已经起来了,但是是没有学到任何的路由。
- 引入路由
R1上将静态路由全部引入BGP
[R1]bgp 100
[R1-bgp]import-route static #引入静态路由
R2上引入指定路由
[R2]bgp 100
[R2-bgp]network 200.1.1.1 32
引入的时候这条路由必须存在于本地路由表中
R1上学到的路由
R2的路由
R1引入所有的直连路由
[R1]bgp 100
[R1-bgp]import-route direct #引入直连路由
两种引入方式的优先级
使用network将100.1.1.1
重新发布一下
这里只显示network引入的100.1.1.1
,因为network引入的优先级高于import的,所以不会发布这条路由给对等体的。
*
表示有效>
表示最优
Path/Ogn 表示路由的引入方式
-
i
表示使用network引入的 -
?
表示使用import-route引入的
路由通告
BGP的路由通告原则
BGP有两种运行方式,当BGP运行于同一AS内部时,被称为IBGP(Internel BGP,内部边界网关协议);当BGP运行于不同AS之间时,称为EBGP(Externel BGP,外部边界网关协议)。
BGP(边界网关协议)与IGP(内部网关协议)的区别
- IGP(如OSPF)会自动通告链路状态,而BGP需要遵循特定的通告原则。
- OSPF的Network命令用于使能接口,而BGP的Network命令用于引入路由。
BGP路由通告原则
- 从IBGP对等体学到的路由不会通告给IBGP对等体,只发布给EBGP对等体:防止路由环路。
- 从EBGP对等体学到的路由会通告给所有邻居(所有EBGP和IBGP对等体):确保路由信息的传播。
- 只通告最优且有效的路由:BGP只会通告最优的路由给对等体。
- TTL设置:EBGP默认TTL为1,需要手动调整以确保邻居关系建立。
- 只发送更新的BGP路由
EBGP间的邻居关系建立
配置IP地址
R2
[R2]inter gi 0/0/1
[R2-GigabitEthernet0/0/1]ip add 23.1.1.2 30
R3
[R3]inter gi 0/0/0
[R3-GigabitEthernet0/0/0]ip add 23.1.1.1 3
[R3-GigabitEthernet0/0/0]inter loop 0
[R3-LoopBack0]ip add 3.3.3.3 32
静态路由
[R2]ip route-static 3.3.3.3 32 23.1.1.1
[R3]ip route-static 2.2.2.2 32 23.1.1.2
配置邻居关系与更新源
[R2]bgp 100
[R2-bgp]peer 3.3.3.3 as-number 200
[R2-bgp]peer 3.3.3.3 connect-interface LoopBack 0
[R2]bgp 200
[R3-bgp]peer 2.2.2.2 as-number 100
[R3-bgp]peer 2.2.2.2 connect-interface LoopBack 0
问题:报文开起来正常,但是邻居状态处于Idle状态
报文看起来正常,但是为什么处于Idle状态呢?
保护机制:对等体在同一个AS内部的话,就是互相可信的,ttl默认为255
EBGP为了安全,TTL默认为1,也就是经过1条,就会被丢弃。
loopback到loopback至少需要2跳,1跳是不够的,这就导致邻居建不起来
解决方法:将默认的ttl改了,将ttl改为2(如果够的话),两边都要配
[R2]bgp 100
[R2-bgp]peer 3.3.3.3 ebgp-max-hop 2
[R3]bgp 200
[R3-bgp]peer 2.2.2.2 ebgp-max-hop 2
添加一个loopback地址来模拟用户并引入
[R3]interface loop
[R3-LoopBack1]ip add 100.3.1.1 3
[R3-LoopBack1]q
[R3]bgp 200
[R3-bgp]network 100.3.1.1 32
从EBGP对等体获得的路由,发布给所有EBGP和IBGP对等体
添加R3后,R2从EBGP对等体R3上学到的路由100.3.1.1
,会被发布给所有的IBGP和EBGP。
R3
R2
R1
问题:R1上学习到的这条引入的路由无效,因为下一条为3.3.3.3
因为从EBGP对等体获得的路由,发布给所有EBGP和IBGP对等体的时候不会改下一条
解决方法1:直接在R2上添加一条到3.3.3.3
的静态路由(极不推荐)(应该是引入,前面为了建邻居关系,静态路由已经添加了)
解决方法2:自动修改下一条为更新源的地址
[R2-bgp]peer 1.1.1.1 next-hop-loca
在R2上配置以上命令,意思是在向邻居1.1.1.1
发布路由的时候,将下一跳替换,替换为更新源地址。
从IBGP对等体获得的路由,只发布给EBGP对等体,不发送给IBGP邻居,称为IBGP水平分割原则
其实,原本设计之初,是否发布给EBGP会检查同步原则,但是华为这边默认有一条 undo synchronization
,意思是不做同步检查,而且改不了,现在永远会发布给EBGP
水平分割主要用于AS内防止环路。IBGP水平分割会导致路由传递问题,会使AS内的IBGP无法学习到路由;4就学不到1引入的路由了。
解决方法:
1.全连接 1和4之间建一个BGP,也就是一个全连接的BGP,full
2.路由反射器
3.联盟:需要在所有设备上配置,很麻烦,很少用了
路由反射器
- 简化IBGP全连接需求: 用于简化IBGP全连接需求。
- 路由反射器的角色:
- Client: 路由反射器的客户端。
- Non-Client: 路由反射器的非客户端。
- Cluster ID: 用于识别路由反射器集群的ID。
- Originator ID: 用于识别路由反射器的发起者ID。
RR (路由反射器) / client(客户端) / non-client(非客户端)
RR收到client的路由,会转发client和non-client;RR收到non-client的路由,只会转发client
路由反射器的防环机制:簇 Cluster 与 Cluster_ID
Cluster_List:记录路由反射器的信息,用于检测路由环路。
添加一台R4并配置路由反射器
这里R2与R4直接使用接口ip建立邻居关系
[R4]inter gi 0/0/0
[R4-GigabitEthernet0/0/0]ip add 24.1.1.1 30
R2
[R2]inter gi 0/0/2
[R2-GigabitEthernet0/0/2]ip add 24.1.1.2 30
静态路由:不需要静态路由
配置邻居关系与更新源
[R4]bgp 100
[R4-bgp]peer 24.1.1.2 as-number 100
[R2]bgp 100
[R2-bgp]peer 24.1.1.1 as-number 100
[R2-bgp]peer 24.1.1.1 next-hop-local #通过EBGP学到的路由传递给24.1.1.1的时候将下一跳修改为更新源地址
问题:R4未学到R1引入的路由
谁配置这条命令谁就是RR,使用这条命令告诉RR谁是你的client
[R2-bgp]peer 1.1.1.1 reflect-client
[R2-bgp]peer 24.1.1.1 reflect-client
配置之后(学到了R1的路由)
问题:next-hop-local
只针对来自ebgp的路由生效,所以1与4学到的路由不会改下一跳
1与4之间其实应该使用IGP连起来的
BGP路由属性
BGP路由属性 用于对特定的路由进一步的描述,使得BGP能够对路由进行选择和控制。(其他协议用于路由选择的属性 不一定和BGP相同,)
BGP作为一种EGP(Exterior Gateway Protocol,外部网关协议),设计用于在不同的自治系统(AS)之间交换路由信息,因此它需要更多的灵活性和控制选项。这导致了BGP具有大量的路由属性,这些属性可以用来过滤、标记和控制路由信息的传播。例如,BGP支持的属性如Local Preference、AS_PATH、Next Hop、MED(Multi-Exit Discriminator)、Community等,这些属性提供了高级路由控制机制,使得网络管理员能够精细地管理跨AS的路由行为。
IGP(Interior Gateway Protocols,内部网关协议) 如OSPF(Open Shortest Path First,开放最短路径优先)或IS-IS(Intermediate System to Intermediate System,中间系统到中间系统)也有它们自己的特性或度量标准,比如OSPF中的Cost(开销)。这些度量标准可以被视为一种形式的路由属性,用于决定最佳路径。RIP(Routing Information Protocol,路由信息协议) 也有一个简单的度量标准——跳数(hop count),这也是一个属性,用于决定路由的距离向量。
所有的路由属性可以分为以下4类:
- 公认必尊属性(Well-known mandatory): 所有BGP设备都必须识别且必须存在于路由更新消息中的属性。缺少任何一个属性会导致路由信息无效。
- 公认任意属性(Well-known discretionary): 所有BGP设备都必须识别,但不要求必须存在于更新报文中。即就算缺少这类属性,路由信息也不会出错,可以根据需求选择是否使用。
- 可选过渡属性(Optional transitive):
- BGP设备可以不支持此属性,但它仍然会接收这类属性,并通告给其他对等体。
- 可选非过渡属性(Optional non-transitive):
- 如果BGP设备不支持此属性,则相应的这类属性会被忽略,且不会通告给其他对等体。
Origin属性
属于公认必须遵循属性,用来定义路径信息的来源,标记一条路由是怎么成为BGP路由的,包含IGP、EGP和Incomplete三种类型。
- IGP
- 通过路由始发AS的IGP得到的路由信息
- 标识符为"i"
- EGP
- 通过EGP得到的路由信息
- 标识符为“e“
- Incomplete
- 通过其他方式学习到的路由信息
- 标识符为”?"
AS-path 属性
属于公认必须遵循属性。按矢量顺序记录了某条路由从本地到目的地址所要经过的所有AS编号。
作用:AS之间防环:如果一个路由器收到一条路由,路由的AS-path
包含自己所在的AS,则路由器会认为发生了环路将该路由丢弃。
-
EBGP 防环:
As-path
属性 -
IBGP 防环:ibgp 水平分割
Next_Hop属性
该属性为公认必遵,记录了路由的下一跳信息。
Local_Pref属性
Local_Pref
是一个 公认任意 属性,用于控制BGP路由器在AS内部选择最佳出口路由时的优先级。值越大,优先级越高
如果路由器1配置了 local-preference 300
,路由器2配置了 local-preference 200
,则路由器1会选择 local-preference 300
的路径。
MED属性
Multi-Exit Discriminator (MED)属性 是一个 可选非过渡属性,用于影响进入AS时的最佳路由选择。越小越优先
如果路由器1配置了 MED 200
,路由器2配置了 MED 300
,则远端客户会选择 MED 200
的路径。
团体属性
团体属性(Community Attributes)是附加到相同特征的路由上的标签,用于路由控制。该属性为可选过渡
分类:
- 自定义团体属性:
- 用户自定义的团体属性,可以根据需要进行设置。
- 公共团体属性:
- 预定义的标准团体属性,具有特定的功能。
- 包括:
- Internet
- No_Advertise: 不向外宣传该路由。 ----------- 联盟 子AS
- No_Export: 不向其他AS宣传该路由。
- No_Export_Subconfed: 不向子联盟外的AS宣传该路由。
应用示例:
- 抗D:
- 使用团体属性进行路由控制,以应对DDoS攻击。
- 通过if-match匹配特定团体属性来实现不同路由策略
- 路由策略:
- 如果有两个公网IP,可以通过团体属性进行区分。
- 例如,将公网IP
10.x.x.x
放在一个团体属性中,使其走上面的路径;将公网IP20.x.x.x
放在另一个团体属性中,使其走下面的路径。
路由聚合
在大规模的网络中,BGP路由表十分庞大,使用路由聚合(Routes Aggregation)可以将多个具体的路由条目合并为一个汇总路由,从而大大减小路由表的规模。
BGP路由聚合支持两种方式:
-
自动聚合:
- 定义:当 BGP 引入路由时,BGP 协议会自动将这些路由聚合到自然网段。
- 配置:通常通过全局或特定地址族下的
auto-summary
命令启用。 - 特点:
- 按自然网段聚合:
- BGP 将按照自然网段(如 A 类、B 类、C 类地址)进行聚合。
- 例如,
10.1.1.1/32
和10.2.1.1/32
将被聚合为10.0.0.0/8
。
- 抑制具体路由:
- 配置自动聚合后,BGP 将不再发送具体路由,只发送聚合后的路由。
- 无需额外配置:
- 一旦启用自动聚合,路由器会自动处理聚合逻辑。
- 按自然网段聚合:
-
手动聚合:
- 定义:
- 手动聚合是指BGP协议根据管理员指定的规则进行聚合。需要管理员指定具体的聚合前缀和相关属性。
- 配置:
- 通过
aggregate
命令进行配置。
- 通过
- 特点:
- 自定义聚合范围:
- 可以指定任意前缀进行聚合,不受自然网段限制。
- 例如,可以将
10.1.1.0/24
和10.1.2.0/24
聚合为10.1.0.0/16
。
- 控制聚合属性:
- 可以设置聚合路由的属性,如 AS 路径、下一跳等。
- 例如,可以通过
as-set
参数保留原始的 AS 路径。
- 选择是否发布具体路由:
- 可以选择是否抑制具体路由,只发布聚合路由。
- 例如,使用
detail-suppressed
选项抑制具体路由。
- 自定义聚合范围:
- 定义:
IPv4支持自动聚合和手动聚合两种方式,而IPv6仅支持手动聚合。
R4:
bgp 200
aggregate 1.1.0.0 22 detail-suppressed as-set
-
aggregate
命令:- 用于聚合多个具体的路由条目为一个汇总路由。
1.1.0.0 22
表示将所有前缀为1.1.0.0/22
的路由聚合为一个汇总路由。
-
detail-suppressed
参数:- 默认情况下,bgp的明细路由(被聚合的路由)和聚合路由都会通告给其他BGP邻居。
detail-suppressed
选项表示抑制该聚合路由所包含的所有明细路由,只发布汇总路由。
-
as-set
参数:- 该参数使得聚合后的路由包含原来的 AS 路径信息。
- 例如,假设原始路由的 AS 路径为
100 -> 200 -> 300
,聚合后的路由也会保留这些 AS 号。
router bgp 100
no auto-summary
address-family ipv4
auto-summary
exit-address-family
router bgp 100
address-family ipv4
aggregate 10.0.0.0 8 as-set detail-suppressed
exit-address-family
BGP工作原理
BGP的五张主要表
- 邻居表 (Neighbor Table):记录 BGP 邻居的信息。
- 未处理路由表 (Adj-RIB-In):存储从对等体接收到但还未处理的路由信息。
- BGP 路由表 (Loc-RIB):包含本地 BGP Speaker 选择的有效路由信息。
- IP 路由表 (IP-RIB):包含所有 IP 路由信息,不仅仅是 BGP 的。
- 待发送路由表 (Adj-RIB-Out):准备发送给对等体的路由信息集合。
BGP路由信息处理流程
- 接收路由信息:从邻居接收路由信息并存入 Adj-RIB-In 表。
- 选择路由:从 Adj-RIB-In 表中选出最优路由放入 Loc-RIB 表。
- 应用策略:根据配置的策略过滤 Loc-RIB 表中的路由。
- 更新 IP 路由表:将过滤后的路由添加到 IP-RIB 中。
- 发送路由信息:将需要通告给邻居的路由信息存入 Adj-RIB-Out 表,并发送给相应的邻居。
BGP是如何选择路由的?
当到达同一目的地存在多条路由时,BGP依照如下策略顺序进行路由选择:
- 如果此路由的下一跳不可达,忽略此路由
- 优选协议首选值(PrefVal)最高的路由
- 优选本地优先级(Local_Pref)最高的路由
- 优选本地生成的路由
- 优选AS路径(AS_Path)最短的路由
- 比较Qrigin属性,依次优选Origin类型为IGP、EGP、Incomplete的路由
- 优选MED值最低的路由
- 优选MBGP邻居学来的路由(EBGP路由优先级高于IBGP路由)
- 选到下一跳IGP Metric较小的路由
- 优选Cluster_List最短的路由
- 优选Router ID最小的路由器发布的路由
- 比较对等体的IP Addres,优选从具有较小IP Address的对等体学来的路由