BGP基础
BGP(BorderGateway Protocol,边界网关协议)协议进行路由传递,相较于传统的IGP协议只传递路由信息,不会暴露AS内的拓扑信息 IGP传递LSA
AS(Autonomous System,自治系统)指的是在同一个组织管理下,使用统一选路策略的设备集合。
BGP 特点
- BGP使用TCP作为其传输层协议(端口号为179),使用触发式路由更新,而不是周期性路由更新。---BGP要想建立邻居关系,必须保证建立邻居关系的两端能够ping通
- BGP能够承载大批量的路由信息,能够支撑大规模网络。
- BGP提供了丰富的路由策略,能够灵活的进行路由选路,并能指导对等体按策略发布路由。
- BGP能够支撑MPLS/VPN的应用,传递客户VPN路由。
- BGP提供了路由聚合和路由衰减功能用于防止路由振荡,通过这两项功能有效地提高了网络稳定性。
BGP特征
- BGP使用TCP为传输层协议,TCP端号179。路由器之间的BGP会话基于TCP连接而建立。
- 运行BGP的路由器被称为BGP发言者(BGP Speaker),或BGP路由器
- 两个建立BGP会话的路由器互为对等体(Peer),BGP对等体之间交换BGP路由表
- BGP路由器只发送增量的BGP路由更新,可或进行触发式更新(不会周期性更新)。
- 每条BGP路由都携带多种路径属性(Path attribute),BGP可以通过这些路径属性控制路径选择
BGP对等体
类型
IBGP:运行在相同的AS之间的BGP路由器建立的邻居关系称为IBGP关系
EBGP:运行在不同的AS之间的BGP路由器建立的邻居关系称为EBGP关系
缺省情况下,BGP使用报文出接口作为TCP连接的本地接口。
BGP建立IBGP对等体时候,一般使用loopback接口作为更新源接口(更稳定)
IBGP建立对等体关系,发送报文TTL值为255,所以不用考虑TTL不可达问题
①使用loopback接口建立:
[Ar4]bgp 200
[Ar4-bgp]peer 2.2.2.2 as-number 200
[Ar4-bgp]peer 2.2.2.2 connect-interface loopback0 <mark style="background: #FF5582A6;">如果使用loopback接口建立对等体,必须要指明建立对等体的接口</mark>
②使用物理接口建立:
[Ar4]bgp 200
[Ar4-bgp]peer 10.0.34.4 as-number 200
BGP建立EBGP对等体时候,一般使用物理接口作为更新源地址
①使用物理接口建立:
[AR1]bgp 100
[AR1-bgp]router-id 1.1.1.1
[AR1-bgp]peer 10.0.12.2 as-number 200
②使用loopback接口建立:
[Ar4]bgp 200
[Ar4-bgp]peer 5.5.5.5 as-number 300
[Ar4-bgp]peer 5.5.5.5 connect-interface loopback0 <mark style="background: #FF5582A6;">如果使用loopback接口建立对等体,必须要指明建立对等体的接口</mark>
[Ar4-bgp]router-id 4.4.4.4 # 指定router id
[Ar4-bgp]peer 5.5.5.5 ebgp-max-hop # EBGP建立对等体关系默认发出报文TTL值为1,如果用loopback接口建立,到达loopback接口TTL值变成0,此时报文会丢弃,所以需要更改接口的TTL,peer 5.5.5.5 ebgp-max-hop命令可以直接设置TTL,至少设置为2,如果不设置,此时TTL值为255
对等体建立过程
-
先启动BGP的一端先发起TCP连接,使用随机端口号向对端179端口发起TCP连接,完成TCP连接的建立。
-
三次握手建立完成之后,相互发送
Open报文
携带参数用于对等体建立,参数协商正常之后双方相互发送Keepalive
报文,收到对端发送的Keepalive报文之后对等体建立成功,同时双方定期发送Keepalive报文用于保持连接。Open报文中携带:
- My Autonomous System:自身AS号
- Hold Time:用于协商后续Keepalive报文发送时间
- BGP Identifier:自身RouterID
-
BGP对等体关系建立之后,BGP路由器发送BGP Update(更新)报文通告路由到对等体
BGP报文以及状态机
BGP的报文类型
BGP存在5种类型的报文,不同类型的报文拥有相同的头部。
报文名称 | 作用 | 发送时间 |
---|---|---|
Open | 发现建立BGP邻居,open报文携带建立bgp对等体的参数 | BGP TCP连接建立成功之后 |
Update | 携带BGP路由信息,发送BGP路由更新 | BGP对等体关系建立之后有路由需要发送或路由变化时向对等体发送Update报文 |
Notification | 报告错误信息,中止对等体关系 | 当BGP在运行中发现错误时,发送Notification报文将错误通告给BGP对等体 |
Keepalive | 协商open参数一致,发送keepalive确认标志。对等体建立,维持BGP对等体关系 | BGP路由器收到对端发送的Keepalive报文,将对等体状态置为已建立,同时后续定期发送keepalive报文用于保持接 |
Route-refresh | 路由刷新 | 当路由策略发生变化时,触发请求对等体重新通告路由 |
OPEN
UPDATE
KEEPALIVE
默认60s发一次 超时时间hode time 为3倍发送时间
NOTIFICATION
Route-refresh
报文用来要求对等体重新发送指定地址族的路由信息,一般为本端修改了相关路由策略之后让对方重新发送Update报文,本端执行新的路由策略重新计算BGP路由。
BGP状态机
Peer状态名称 | 用途 |
---|---|
idle | 开始准备TCP的连接并监视远程对等体,启用BGP时,要准备足够的资源 (初始状态) |
connect | 正在进行TCP连接,等待完成中,认证都是在TCP建立期间完成的。 |
Active | TCP连接没建立成功 ,反复尝试TCP连接 |
OpenSent | TCP连接已经建立成功,开始发送open包,Open包携带参数协商对等体的建立 |
OpenConfirm | 参数、能力特性协商成功,自己发送Keepalive包,等待对方的Keepalive包 |
Established | 已经收到对方的Keepalive包,双方能力特性经协商发现一致,开始使用Update通告路由信息 |
查看邻居表
BGP邻居关系建立不成功
如果是在opensent阶段前:①检查IP地址是否错误;②检查路由是否可达;③查看179端口是否被过滤
如果是在opensent阶段后:①AS号;②版本;③hold timer;④Router id;⑤认证;
BGP路由
路由生成
不同于IGP路由协议,BGP自身并不会发现并计算产生路由,BGP将IGP路由表中的路由注入到BGP路由表中,并通过Update报文传递给BGP对等体。
BGP注入路由的方式有两种:
-
Network
-
import-route
Network:将路由逐条宣告进BGP;network进来的路由,BGP路由表中origin属性为“i”
import方式:将其他协议的路由引入BGP;import进来的路由,BGP路由表中origin属性为“?”(Incomplete)
聚合路由
与IGP协议相同BGP支持根据已有的路由条自进行聚合,生成聚合路由
aggregate 聚合后IP 掩码 detail-suppressed
detail-suppressed 只通告聚合后路由,而不通告聚合前的明细路由
通告原则
- 只发布最优路由
- 从EBGP对等体获取的路由,会发布给所有对等体。
- IBGP水平分割:从IBGP对等体获取的路由,不会发送给IBGP对等体。
这是为了防止出现环路。因为水平分割的原则我们在IBGP之间无法直接传递路由这个时候可以直接建立IBGP全互联或者使用路由反射器来实现传递
- BGP同步规则(默认关闭)
BGP同步规则指的是:当一台路由器从自己的IBGP对等体学习到一条BGP路由时(这类路由被称为IBGP路由),它将不能使用该条路由或把这条路由通告给自己的EBGP对等体,除非它又从IGP协议(例如OSPF等,此处也包含静态路由)学习到这条路由,也就是要求IBGP路由与IGP路由同步。同步规则主要用于规避BGP路由黑洞问题。
路由黑洞:解决办法:
①BGP--IGP互相引入 该方法不建议
②IBGP全互联
③MPLS
BGP属性
任何一条BGP路由都拥有多个路径属性,BGP的路径属性将影响路由优选
路径属性分为公认必遵,公认任意,可选过渡,可选非过渡
- 公认必遵(Well-known Mandatory):必须包括在每个Update消息里。
- 公认任意(Well-known Discretionary):可能包括在某些Update消息里
- 可选过渡(Optional Transitive):BGP设备不识别此类属性依然会接受该类属性并通告给其他对等体,
- 可选非过渡(Optional Non-transitive):BGP设备不识别此类属性会忽略该属性,且不会通告给其他对等体
公认属性是所有BGP路由器都必须能够识别的属性,可选属性不需要都被BGP路由器所识别
公认必遵
公认必遵(Well-known Mandatory):必须包括在每个Update消息里。
Origin
它标识了BGP路由的起源
.当去往同一个目的地存在多条不同Origin属性的路由时,在其他条件都相同的情况下,BGP将按如Origin的下顺序优选路由:IGP>EGP>Incomplete。
起源名称 | 标记 | 属于 |
---|---|---|
IGP | i | 如果路由是由始发的BGP路由器使用network 命令注入到BGP的,那么该BGP路由的Origin属性为IGP |
EGP | e | 如果路由是通过EGP学习到的,那么该BGP路由的Origin属性为EGP(这里的EGP协议特指该协议) |
Incomplete | ? | 如果路由是通过其他方式学习到的,则origin属性为incomplete(不完整的)。例如通过import-route 命令引入到BGP的路由 |
AS_PATH
前往目标网络的路由经过的AS号列表(短的更优)
作用:确保路由在EBGP对等体之间传递无环;另外也作为路由优选的衡量标准之一;
路由在被通告给EBGP对等体时,路由器会在该路由的AS Path中追加上本地的AS号;路由被通告给IBGP对等体时,AS_Path不会发生改变 ,若存在自身AS则不接受该路由
类型
-
AS_SEQENCE(默认)
表示AS_Path内的AS号是一个有序的列表
-
AS_SET
在做路由聚合时可以使用该类型。路由聚合解决了两类问题,一是减轻了设备的负担,二是隐藏了明细的路由信息,减少了路由震荡的影响。但是路由聚合后,AS_Path属性丢失,存在产生环路的风险,为此可以通过AS_SET类型的AS_Path属性携带聚合前的AS路径信息。用与链路聚合后记录聚合前的AS路径信息 例:AS_PATH=300{100,200}
修改AS_path
使用Route-Policy修改BGP路由的AS_Path属性时,可以使用以下三种方式
-
additive
原有AS_Path上追加
acl number 2000
rule 5 permit source 10.10.10.10 0
route-policy aa permit node 10
if-match acl 2000
apply as-path 500 additive
bgp 200
peer 5.5.5.5 route-policy aa export
-
overwrite
将已有AS_Path值替换成新的值
acl number 2000
rule 5 permit source 10.10.10.10 0
route-policy aa permit node 10
if-match acl 2000
apply as-path 500 overwrite
bgp 200
peer 5.5.5.5 route-policy aa export
-
none overwrite
将已有AS_Path的值清空
Next_Hop
用于指定到达目标网络的下一跳地址。该属性值(IP地址)必须在本地路由可达,如果不可达,则这条BGP路由不可用
设置规则
-
BGP路由器在向EBGP对等体发布某条路由时,会把该路由信息的下一跳属性设置为本地与对端建立BGP邻居关系的接口地址
-
BGP路由的始发路由器上,下一跳是0.0.0.0
-
BGP路由器将本地始发路由发布给IBGP对等体时,会把该路由信息的下一跳属性设置为本地与对端建立BGP邻居关系的接口地址。
- 路由器在收到EBGP对等体所通告的BGP路由后,在将路由传递给自己的IBGP对等体时,会保持路由的Next_Hop属性值不变。
IBGP在进行路由传递时,下一跳地址 不变会造成路由不可达这种情况,可以使用以下命令修改
使用peernext-hop-local命令可以在设置向IBGP对等体(组)通告路由时,把下一跳属性设为自身的TCP连接源地址[AR4-bgp]peer 10.0.45.5 next-hop-local
配置之后
- 如果路由器收到某条BGP路由,该路由的Next_Hop属性值与EBGP对等体(更新对象)同属一个网段,那么该条路由的Next_Hop地址将保持不变并传递给它的BGP对等体。
公认任意
公认任意(Well-known Discretionary):可能包括在某些Update消息里
Local_Preference
Local_Preference即本地优先级属性,是公认任意属性,可以用于告诉AS中的路由器,哪条路径是离开本AS的首选路径。
Local_Preference属性值越大则BGP路由越优。缺省的Local_Preference值为100。
该属性只能被传递给IBGP对等体,而不能传递给EBGP对等体。
注意事项:
Local_Preference属性只能在IBGP对等体间传递(除非做了策略否则Local_Preference值在IBGP对等体间传递过程中不会丢失),而不能在EBGP对等体间传递,如果在EBGP对等体间收到的路由的路径属性中携带了Local_Preference,则会进行错误处理。
但是可以在AS边界路由器上使用Import方向的策略来修改Local_Preference属性值。也就是在收到路由之后,在本地为路由赋予Local_Preference。
使用bgp default local-preference命令修改缺省Local_Preference值,该值缺省为100。
路由器在向其EBGP对等体发送路由更新时,不能携带Local_Preference属性,但是对方接收路由之后,会在本地为这条路由赋一个缺省Local_Preference值(100),然后再将路由传递给自己的IBGP对等体。
本地使用network命令及import-route命令引入的路由, Local_Preference为缺省值100,并能在AS内向其他IBGP对等体传递,传递过程中除非受路由策略影响,否则Local_Preference不变
Atomic_Aggregate
路由聚合后自动生成 标识聚合路由
可选过渡
Aggregate
聚合路由丢失明细路由的路径属性,因此需要给下游对等体告警,并提示“聚合点”及聚合设备所属的AS号。
Aggregator属性记录了聚合设备的AS号、RouterID
Community
是一种路由标记,用于简化路由策略的执行,可以将某些路由分配一个特定的community属性值,之后就可以基于community值而不是网络前缀/掩码信息来匹配路由并执行相应的策略了。
-
RFC (常用)
AA:NN AA表示AS号 NN表示自定义的编号 (自定义格式)
-
10进制整数
公认Community属性 (重要)
名称 | 说明 |
---|---|
Internet | 设备在收到具有此属性的路由后,可以向任何BGF对等体 发送该路由。缺省情况下,所有的路由都属于Internet团体 |
No_Advertise | 设备收到具有此属性的路由后,将不向任何BGP对等体 发送该路由 |
No_Export | 设备收到具有此属性的路由后,将不向AS外 发送该路由 |
No_Export_Subconfed | 设备收到具有此属性路用后将不向AS外 发送也不向AS内其他子AS 发布此路由该路由 |
可选非过渡
MED
是一种度量值,用于向外部对等体指出进入本AS的首选路径,即当进入本AS的入口有多个时,AS可以使用MED动态地影响其他AS选择进入的路径.MED属性值越小则BGP路由越优
MED主要用于在AS之间影响BGP的选路。MED被传递给EBGP对等体后,对等体在其AS内传递路由时,携带该MED值,但将路由再次传递给其EBGP对等体时,缺省不会携带MED属性。
注意:
缺省情况下,路由器只比较来自同一相邻AS的BGP路由的MED值,也就是说如果去往同一个目的地的两条路由来自不同的相邻AS,则不进行MED值的比较。
一台BGP路由器将路由通告给EBGP对等体时,是否携带MED属性,需要根据以下条件进行判断(不对EBGP对等体使用策略的情况下):
-
如果该BGP路由是本地始发(本地通过network或import-route命令引入)的,则缺省携带MED属性默认为0发送给EBGP对等体。
-
如果该BGP路由为从BGP对等体学习到,那么该路由传递给EBGP对等体时缺省不会携带MED属性。
-
在IBGP对等体之间传递路由时,MED值会被保留并传递,除非部署了策略,否则MED值在传递过程中不发生改变也不会丢失。
-
如果路由器通过IGP学习到一条路由,并通过network或import-route的方式将路由引入BGP,产生的BGP路由的MED值继承路由在IGP中的metric。
可以使用default med命令修改缺省的MED值,default med命令只对本设备上用import-route命令引入的路由和BGP的聚合路由生效。
- 如果该BGP路由时本地始发(本地通过net/import引入的)则缺省携带MED属性发送EBGP对等体
- 如果BGP路由时从BGP对等体学习到,那么路由传递给EBGP对等体缺省不会携带MED属性
- 在IBGP对等体之间传递路由时,MED值保留
Preferred-Value
华为设备的特有属性,该属性仅在本地有效,只影响本设备的路由优选。该属性不会传递给任何BGP对等体。当BGP路由表中存在到相同目的地的路由时,将优先选择Preferred-Value值高的路由。取值范围:0~65535;该值越大,则路由越优先。
路由反射器
作用:解决IBGP全互联的问题
反射器角色:
- RR(Route Reflector):路由反射器
- Client:RR客户端
RR会将学习的路由反射出去,从而使得IBGP路由在AS内传播无需建立IBGP全互联将一台BGP路由器指定为RR的同时,还需要指定其client。至于client本身,无需做任何配置,它并不知晓网络中存在RR。
反射规则(非非不传)
1、RR从EBGP学习到的,会发送给client和非client
2、RR从非client学习到的路由,会反射给自己的client,但是不会给非client
3、RR从client学习到的路由,会反射非自己的非client和client
路由反射器中的防环
Originator_ID,Cluster_List
RR将一条BGP路由进行反射时会在反射出去的路由中增加Originator_ID,其值为本地AS中通告该路由的BGP路由器Router ID。
若AS内存在多个RR,则Originator_ID属性由第一个RR创建,并且不被后续的RR(若有)所更改。
当BGP路由器收到一条携带Originator_ID属性的IBGP路由,并且Originator_ID属性值与自身的Router ID相同,则它会忽略关于该条路由的更新。
路由反射簇包括反射器RR及其Client。一个AS内允许存在多个路由反射簇。
每一个簇都有唯一的簇ID(Cluster_ID,缺省时为RR的BGP Router ID )。
当一条路由被反射器反射后,该RR(该簇)的Cluster_ID就会被添加至路由的Cluster_list属性中。
当RR收到一条携带Cluster_list属性的BGP路由,且该属性值中包含该簇的Cluster_ID时,RR认为该条路由存在环路,因此将忽略关于该条路由的更新。
配置:
在RR路由器上配置:
Bgp 200
peer 6.6.6.6 reflect-client --谁是client,就peer谁`
缺省情况下,每个路由反射器使用自己的Router ID作为集群ID。
[Huawei-bgp] reflector cluster-id 20.2.2.2
路由聚合
路由聚合
BGP路由聚合支持两种方式:
-
自动聚合:对BGP引入的路由进行聚合。配置自动聚合后,对参加聚合的具体路由进行抑制。配置自动聚合后,BGP将按照自然网段聚合路由(如10.1.1.1/24和10.2.1.1/24将聚合为A类地址10.0.0.0/8),并且BGP向对等体只发送聚合后的路由。
配置:Bgp 200 summary automatic
该命令对BGP引入的路由(也就是通过import-route方式得到的路由)进行聚合,引入的路由可以是直连路由、静态路由、RIP路由、OSPF路由、IS-IS路由。配置该命令后,BGP将按照自然网段聚合路由。该命令对network命令引入的路由无效。
-
手动聚合:对BGP本地路由进行聚合。手动聚合可以控制聚合路由的属性,以及决定是否发布具体路由。
[AR3-bgp]aggregate 10.0.0.0 255.255.252.0 detail-suppressed as-set
detail-suppressed :抑制明细路由,只传递聚合后的路由
as-set :路由携带聚合前的AS号
路由优选
P L L A O M E N 漂亮老男人
p---Preference Value (越大越优,仅限路由器本地)
L--- Local Preference,本地优先级 (越大越优,同一AS内的路由器)
L--- 手动聚合->自动聚合->network->import,为本地始发
A ---AS Path (短的优先)
O ---Origin,起源i(network)>e(EBGP)>? (import-route)
M---MED (值越小越优,本AS内或上游AS内所有路由器,EBGP邻居上设置)
E--- EBGP优于IBGP (前面都一样,比不出最优路径时)
N--- Next-Hop,下一跳(BGP选择IGP下一跳cost值最小的)
前8条一样,可以实现负载分担
bgp 200
maximum load-balancing ibgp 2
默认不开启
Comments NOTHING