BGP是一种路径矢量协议,主要用于在自治系统(AS)之间进行路由信息的交换。BGP的主要作用是在互联网上提供一种可扩展的路由系统,使得不同的网络可以互相通信。
BGP有两种运行方式,当BGP运行于同一AS内部时,被称为IBGP(Internel BGP,内部边界网关协议);当BGP运行于不同AS之间时,称为EBGP(Externel BGP,外部边界网关协议)。
BGP就被设计成一种域间路由选择协议,其设计目标就是策略控制能力和可扩展性。
BGP是怎么工作的?
BGP报文中的角色
Speaker:发送BGP报文的路由设备称为BGP发言者(Speaker),它接收或产生新的路由信息,并发布(Advertise)给其它BGP Speaker。当BGP Speaker收到来自其它AS的新路由时,如果该路由比当前已知路由更优、或者当前还没有该路由,它就把这条路由发布给所有其他BGP Speaker(发布该路由的BGP Speaker除外)。
Peer:相互交换报文的BGP Speaker之间互称对等体(Peer)。
BGP的报文
BGP的运行是通过报文驱动的,共有Open、Update、Notification、Keepalive和Route-refresh五种报文类型。
-
Open报文:是TCP连接建立后发送的第一个报文,用于建立BGP对等体之间的连接关系。对等体在接收到Open报文并协商成功后,将发送Keepalive报文确认并保持连接的有效性。确认后,对等体间可以进行Update、Notification、Keepalive和Route-refresh报文的交换。协商BGP参数
-
Update报文:用于在对等体之间交换路由信息。Update报文可以发布多条属性相同的可达路由信息,也可以撤销多条不可达路由信息。交换路由信息
-
Keepalive报文:BGP会周期性地向对等体发出Keepalive报文,用来保持连接的有效性。保持邻居关系
OSPF的hello报文的作用是建立邻居保持邻居。
-
Notification报文:当BGP检测到错误状态时,就向对等体发出Notification报文,之后BGP连接会立即中断。差错通知
-
Route-refresh报文:Route-refresh报文用来请求对等体重新发送所有的可达路由信息。用于在改变路由策略后请求对等体重新发送路由信息
BGP处理过程
因为BGP的传输层协议是TCP协议,所以在BGP对等体建立之前,对等体之间首先进行TCP连接。
BGP邻居间会通过Open报文协商相关参数,建立起BGP对等体关系。
建立连接后,BGP邻居之间交换整个BGP路由表。
BGP会发送Keepalive报文来维持邻居间的BGP连接。
BGP协议不会定期更新路由表,但当BGP路由发生变化时,会通过Update报文增量地更新路由表。
当BGP检测到网络中的错误状态时(例如收到错误报文时),BGP会发送Notification报文进行报错,BGP连接会随即中断。
图1-3 邻居建立过程图
BGP有限状态机
在BGP对等体建立的过程中,BGP有限状态机共有六种状态,分别是Idle、Connect、Active、Open-Sent、Open-Confirm和Established,通常可见的三个状态是:Idle、Active、Established。
-
Idle(空闲):这是BGP会话的初始状态。在此状态下,路由器关闭所有已经存在的BGP连接,并开始初始化BGP资源。路由器会等待开始事件的发生,然后转移到Connect状态。
-
Connect(连接):在此状态下,路由器尝试建立TCP连接。如果连接成功,路由器将转移到OpenSent状态。如果连接失败,路由器将转移到Active状态。
-
Active(活动):在此状态下,路由器继续尝试建立TCP连接。如果连接成功,路由器将转移到OpenSent状态。如果连接尝试失败,路由器将继续保持在Active状态。中间状态
-
OpenSent(开启发送):在此状态下,路由器已经发送了一个OPEN消息,并等待对方的OPEN消息。如果收到的OPEN消息是有效的,路由器将转移到OpenConfirm状态。
-
OpenConfirm(开启确认):在此状态下,路由器已经收到了对方的OPEN消息,并等待KEEPALIVE或NOTIFICATION消息。如果收到的是KEEPALIVE消息,路由器将转移到Established状态。
-
Established(已建立):在此状态下,路由器可以发送/接收UPDATE、KEEPALIVE、NOTIFICATION和ROUTE-REFRESH消息。这是BGP会话的正常工作状态。
这些状态的转换是由BGP的有限状态机(FSM)控制的,每个状态都有明确的输入和输出条件。
BGP对等体双方的状态必须都为Established,BGP邻居关系才能成立,双方通过Update报文交换路由信息。
BGP邻居建立与路由引入
IBGP间的邻居关系建立-示例
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
[R1]bgp 100
[R1-bgp]peer 2.2.2.2 as-number 100
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
[R2]bgp 100
[R2-bgp]peer 1.1.1.1 as-number 100
问题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协议自身不能发现路由,所以需要引入其他协议的路由(如IGP或者静态路由等)注入到BGP路由表中,从而将这些路由在AS之内和AS之间传播。
BGP引入路由时支持Import和Network两种方式:
Import方式是按协议类型,将RIP路由、OSPF路由、IS-IS路由、静态路由和直连路由等某一协议的路由注入到BGP路由表中;
Network方式比Import方式更精确,将指定前缀和掩码的一条路由注入到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的路由
向BGP中引入直连的路由
[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引入的
EBGP间的邻居关系建立-示例R3
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
问题1:报文开起来正常,但是邻居状态处于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
BGP的路由通告原则
- 从IBGP对等体获得的路由,只发布给EBGP对等体
- 从EBGP对等体获得的路由,发布给所有EBGP和IBGP对等体
- 只将BGP的最优路由发布给对等体:示例参考引入方式的优先级
- 只发送更新的BGP路由
从EBGP对等体获得的路由,发布给所有EBGP和IBGP对等体
添加R3后,R2从EBGP对等体R3上学到的路由100.3.1.1,会被发布给所有的IBGP和EBGP。
R3
R2
R1
问题1:R1上学习到的这条引入的路由无效,因为下一条为3.3.3.3
因为从EBGP对等体获得的路由,发布给所有EBGP和IBGP对等体的时候不会改下一条
将路由放给EGP会改下一跳,给IGP发的时候默认不会改下一条
解决方法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.联盟:需要在所有设备上配置,很麻烦,很少用了
路由反射器:
RR (路由反射器) / client(客户端) / non-client(非客户端)
RR收到client的路由,会转发client和non-client;RR收到non-client的路由,只会转发client
路由反射器的防环机制:簇 Cluster 与 Cluster_ID
添加一台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的时候将下一跳修改为更新源地址
问题1:R4未学到R1引入的路由
谁配置这条命令谁就是RR,使用这条命令告诉RR谁是你的client
[R2-bgp]peer 1.1.1.1 reflect-client
[R2-bgp]peer 24.1.1.1 reflect-clien
配置之后(学到了R1的路由)
问题:next-hop-local只针对来自ebgp的路由生效,所以1与4学到的路由不会改下一跳
1与4之间其实应该使用IBGP连起来的
BGP属性
BGP路由属性是一套参数,它对特定的路由进一步的描述,使得BGP能够对路由进行过滤和选择。事实上,所有的BGP路由属性都可以分为以下4类:
- 公认必须遵循的(Well-known mandatory):所有BGP设备都可以识别,且必须存在于Update报文中。如果缺少这种属性,路由信息就会出错。
- 公认任意(Well-known discretionary):所有BGP设备都可以识别,但不要求必须存在于Update报文中;即就算缺少这类属性,路由信息也不会出错
- 可选过渡(Optional transitive):在AS之间具有可传递性的属性。BGP设备可以不支持此属性,但它仍然会接收这类属性,并通告给其他对等体。
- 可选非过渡(Optional non-transitive):如果BGP设备不支持此属性,则相应的这类属性会被忽略,且不会通告给其他对等体。
下面介绍几种常用的BGP路由属性:
Next_Hop属性
Next Hop属性记录了路由的下一跳信息,该属性为公认必遵。
MED属性
MED属性相当于IGP的代价值,用于判断流量进入AS时的最佳路由,即用来影响邻居AS流量进入本AS的最佳路径,该属性为可选非过渡。
进入AS时的最佳路由(AS之间,越小越优先)
MED和Local_Pref都是做优先选路的。
Local_Pref属性
Local_Pref 属性表明BGP路由器的优先级,用于判断流量离开AS时的最佳路由。该属性为公认任意
离开AS时的最佳路由(AS内部,越大越优先)
AS-path 属性
按矢量顺序记录了某条路由从本地到目的地址所要经过的所有AS编号。(AS之间防环)属于公认必须遵循属性。
作用:如果一个路由器收到一条路由,路由的AS-path 包含自己所在的AS,则路由器会认为发生了环路将该路由丢弃。
EBGP 防环:As-path 属性
IBGP 防环:ibgp 水平分割
Origin属性
属于公认必须遵循属性,用来定义路径信息的来源,标记一条路由是怎么成为BGP路由的,包含IGP、EGP和Incomplete三种类型。
- IGP
- 通过路由始发AS的IGP得到的路由信息
- 标识符为"i"
- EGP
- 通过EGP得到的路由信息
- 标识符为“e“
- Incomplete
- 通过其他方式学习到的路由信息
- 标识符为”?"
团体属性
团体属性用于标识具有相同特征的BGP路由,该属性为可选过渡
团体属性分为
- 自定义团体属性
- 公共团体属性
- Internet
- No_Advertise ----------- 联盟 子AS
- No_Export
- No_Export_Subconfed
抗D / color
如果有两个公网ip,公网ip(10.x.x.x)放在一个团体属性里面,走上面;公网ip(20.x.x.x)放在另一个团体属性里面,走下面
路由聚合的AS-set 参数
R4:
bgp 200
aggregate 1.1.0.0 22 detail-suppressed as-set
as-set 参数可以使得聚合后的路由含有原来的as-path 属性
一台路由器上面只能运行一个bgp 的进程。
BGP工作原理
BGP的五张表
邻居表:对等体邻居清单列表
Adj-RIB-In:对等体宣告给本地BGP Speaker的未处理的路由信息库
BGP路由表(Loc-RIB):BGP路由信息库,包括本地BGP Speakeri选择的路由信息
IP路由表(IP-RIB):全局路由信息库,包括所有P路由信息
Adj-RIB-Out:本地BGP Speaker宣告给指定对等体的路由信息库
BGP路由信息处理流程
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的对等体学来的路由
路由聚合
在大规模的网络中,BGP路由表十分庞大,使用路由聚合(Routes Aggregation)可以大大减小路由表的规模。
路由聚合实际上是将多条路由合并的过程。这样BGP在向对等体通告路由时,可以只通告聚合后的路由,而不是通告所有的具体路由。
BGP路由聚合支持两种方式:
-
自动聚合:对BGP引入的路由进行聚合。配置自动聚合后,对参加聚合的具体路由进行抑制。配置自动聚合后,BGP将按照自然网段聚合路由(如10.1.1.1/32和10.2.1.1/32将聚合为A类地址10.0.0.0/8),并且BGP向对等体只发送聚合后的路由。
-
手动聚合:对BGP本地路由进行聚合。手动聚合可以控制聚合路由的属性,以及决定是否发布具体路由。
IPv4支持自动聚合和手动聚合两种方式,而IPv6仅支持手动聚合。
bgp 100
aggregate 1.1.0.0 22
在BGP路由表中,将1.1.0.0/22及其更具体的路由(如果存在)聚合为一条路由。
默认情况下,bgp的明细路由(被聚合的路由)和聚合路由都会通告给其他BGP邻居。
bgp 100
aggregate 1.1.0.0 22 detail-suppressed
使用detail-suppressed关键字,只向邻居通告该聚合路由,抑制该聚合路由所包含的所有明细路由。
结尾
标签:bgp,1.1,R2,16,报文,BGP,路由 From: https://www.cnblogs.com/jiyuchen1/p/17697421.html