站点图标 Linux-技术共享

BGP路由协议总结

路径矢量路由协议

了解AS

AS(Autonomous System)

AS的经典定义为:在单一的技术管理下,采用同一种内部网关协议和统一的度量值在AS内转发数据包,并使用一种外部网关协议将数据包转发到其他AS的一组路由器。

分类:

网站:http://www.cidr-report.org/as6447/autnums.html 。看到所有公有AS对应的机构,可以访问BGP,请telnet route-server.ip.att.net

概要

BGP是一种EGP(外部网关协议)。不同于以前的RIP,EIGRP和OSPF,它们都属于IGP(内部网关协议)

BGP是一种路径矢量的路由协议,不同于RIP的距离矢量的路由协议。

BGP的开销是从源路由器到目标路由器经过的AS;而RIP的开销是从源路由器到目标路由器路径的度量值。在BGP中,一个AS相当于一个大的路由器,直接影响的是就是AS的下一跳。所以,BGP又被叫做AS-by-AS routing protocol

BGP的使用

什么是时候要用到BGP

  1. 大型企事业连接多个SP(多宿主)
  2. ISP之间(当一个数据包从一个AS传输到另一个AS的时候)。
  3. AS交换点(当一个AS连接多个AS的时候)。
  4. 大型企业网

ISP为什么用BGP,而不是别的IGP

  1. 方便管理,安全性能好(阻止不同AS之间的路由、过滤和认证功能)
  2. 承载的路由条目海量(10w+),而ospf(1w+),ISIS(2w+)
  3. 策略比一般的IGP更强(次优路由),更多
  4. 可扩展性强,不仅能传IPv4、v6,还能传VPNv4、组播VPN等。

BGP的特征

  1. 支持VLSM,CIDR。
  2. 支持增量更新与触发更新。
  3. 使用TCP协议作为可靠地传输机制,端口号为179
  4. 没有组播地址
  5. 60s/次,180s dead,通过keeplive包来验证TCP的连通。
  6. 属性化(metric只是属性当中的一员)。
  7. 支持大型的网络拓扑。

BGP和IGP的关系

  1. BGP承载的是一个外部客户路由,IGP承载的是内部核心路由
  2. IGP不会因BGP的影响而变化
  3. BGP不会因IGP的影响而变化,直到BGP的下一跳不可达
  4. BGP是IGP的递归查找

BGP协议报文

BGP协议报文封装

  1. BGP使用TCP来承载BGP协议报文,使用的TCP端口号是179号端口。
  2. BGP协议字段分成BGP头部,BGP Message和BGP Data三个部分。

BGP协议报文类型

BGP头部字段格式:

根据BGP头部不同的Type字段,BGP Message也各有不同,主要分成5类:

  1. Open:负责和对等体建立邻居关系。
  2. KeepAlive:该消息在对等体之间周期性地发送,用以维护连接。
  3. Update:该消息被用来在BGP对等体之间传递路由信息。
  4. Notification:当BGP Speaker检测到错误的时候,就发送该消息给对等体。
  5. Route-refresh:用来通知对等体自己支持路由刷新能力;

Open报文

  1. Version:BGP Open报文的版本号。
  2. My AS:本AS号。
  3. Hold Time:
  4. BGP Identifier:指定BGP的Route-ID。
  5. Variable:BGP能力字段,能力字段会相互会协商IPv4、IPv6和组播等

Update报文

  1. Path Attribute:路径属性
  2. NLRI(Network Layer Reachability Information):即网络层可达信息,由于TCP是一种可靠地面向连接的协议,需要保持连接的可达性,BGP的keeplive包便提供了这样一个机制
  3. 触发更新和增量更新:由于BGP是一个庞大的路由系统,每时每刻的更新会导致资源的浪费。IBGP 5s/次;EBGP 30s/次
  4. 撤销路径

Notification报文

Route-Refresh报文

通常发生在邻居路由器做完策略后,我还没有得到更新,我就会发送一个这样的报文

通常我会利用clear命令来实现这一步骤

BGP协议邻居关系

邻居关系建立

由于BGP邻居关系建立在TCP连接的基础之上,所以可以通过IGP或静态路由来提供TCP连接的IP可达性

关于建立邻居使用的hello报文:

IBGP邻居

  1. IBGP,全称Internal BGP,即在AS内部BGP路由器之间建立的邻居关系。
  2. IBGP邻居可以不直连,但要保证TCP 179的连通,可以通过neighbor命令来实现。
  3. IBGP不支持负载均衡。

EBGP邻居

  1. EBGP,全称External BGP,即在AS之间BGP路由器之间建立的邻居关系。
  2. EBGP的邻居默认情况下是直连的,但是也可以不直连,这需要修改TTL。
  3. EBGP默认不支持,但是有办法让它支持。

指定更新源和EBGP多跳

更新源,即update-source。在BGP通过neighbor指邻居时,会自动带上一个update-source信息,默认是:源是本端连接对端接口IP地址,目的是neighbor指向邻居的地址。

EBGP多跳,称EBGP-multihop(EBGP多跳)。这里的hop=TTL,默认EBGP发来的路由协议报文的TTL=1,即1跳,而IBGP默认是多跳。这样问题就来了,如果EBGP是用环回口建立邻居,那么EBGP邻居之间的路由协议报文就无法抵达。针对这个问题,解决的办法很简单,修改TTL,即EBGP多跳。

邻居建立的状态机制

  1. Idle:查找我neighbor的邻居,并看是否有路由到达邻居。
  2. Connect:我找到了邻居,并与它完成了TCP的3次握手。
  3. Open sent:我开始向它发送我的Open包,里面含有我的基本信息。
  4. Open confim:它收到了我的包,查看和它的信息是否一致,不一致不给我回包。
  5. Exstablished:邻居建立,可以路由了。

常见的几种状态:

BGP邻居关系实验

目的一:BGP邻居关系的建立(neighbor和update Source问题)

分为IBGP和EBGP邻居关系的建立

EBGP peers:
R2:
R2(config)#router bgp 2
R2(config-router)#bgp router-id 2.2.2.2
R2(config-router)#neighbor 192.168.12.1 remote-as 1
R1和R2的配置一样
 
IBGP peers:
R2(config)#router ospf 100
R2(config-router)#router-id 2.2.2.2
R2(config-router)#network 2.2.2.0 0.0.0.255 a 0
R2(config-router)#network 192.168.23.0 0.0.0.255 a 0
//所有AS内的BGP路由器都起IGP
 
R2(config)#router bgp 2
R2(config-router)#neighbor 4.4.4.4 remote-as 2 //IBGP指R4
R2(config-router)#neighbor 4.4.4.4 update-source loopback 0
R4和R2的配置一样

注意:

验证:

R2#sh ip bgp summary //3张表中的BGP表简要信息。
BGP router identifier 2.2.2.2, local AS number 2:自己的AS
BGP table version is 1, main routing table version 1
邻居 版本
Neighbor V AS MsgRcvd MsgSent TblVer InQ OutQ Up/Down State/PfxRcd
192.168.12.1 4 1 6 6 1 0 0 00:03:46 0
 
R2#sh ip bgp neighbor //3张表中的邻居表,邻居的详细信息,很多的。
 
R2#sh tcp brief
TCB Local Address Foreign Address (state)
65053418 192.168.12.2.32373 192.168.12.1.179 ESTAB
本路由的随机端口号 R1的179端口号

目的二:EBGP-multihop

EBGP-multihop(EBGP多跳),这里的hop=TTL,默认EBGP发来的报文的TTL=1(1跳),而IBGP默认是多跳

这里是EBGP的双线冗余,所以就不能neighbor物理口了,环回口是最佳选择。
但是EBGP的peers有没有对方的换回口的路由,怎么neighbor呢?
看!做静态路由,双线的静态路由。

回到话题,默认EBGP发来的报文的TTL=1,这~~不就意味着报文到了对方就不能再穿了?
环回口绝对是不能到了,因为环回口是另一个网络。
所以,要修改TTL=2或大于2

EBGP-multihop配置:
R4和R5之间EBGP对指环回口

R5(config)#ip route 4.4.4.4 255.255.255.255 Ethernet0/1 //静态让R5上有4.4.4.4的路由
R5(config)#router bgp 3
R5(config-router)#neighbor 4.4.4.4 remote-as 2
R5(config-router)#neighbor 4.4.4.4 update-source loopback
R5(config-router)#neighbor 4.4.4.4 ebgp-multihop //不配就是EBGP TTL=255
R4和上一样

目的三:路由的通告(network,show查看)

Network在IGP和BGP区别
在IGP中,network宣告的是接口,即路由器是宣告自己直连的本地接口。
在BGP中,network宣告的是路由,即路由器是宣告自己路由表里的路由。
PS:BGP宣告的时候,一定要学到的路由的掩码一样

Network在BGP的原则:

  1. 从EBGP获得的路由会向它所有BGP相邻体通告(包括EBGP和IBGP)
  2. 从IBGP获得的路由不向它的IBGP邻居通告(除非RR)
  3. 从IBGP获得的路由是否通告给它的EBGP对等体要靠同步来决定
  4. 多条路径时,BGP会选择一条最优的路径
R1(config)#router bgp 1
R1(config-router)#network 1.1.1.0 mask 255.255.255.0 //前提是确保R1的路由表里有
R2和上一样

验证

R2#sh ip bgp //这就是3张表中的BGP表
BGP table version is 3, local router ID is 2.2.2.2
Status codes: s suppressed, d damped, h history, * valid, > best, i - internal,r RIB-failure, S Stale
Origin codes: i - IGP, e - EGP, ? - incomplete
Network Next Hop Metric LocPrf Weight Path
*> 1.1.1.0/24 192.168.12.1 0 0 1 i
*> 2.2.2.0/24 0.0.0.0 0 32768 i
//*表示这条路由是可用的;>表示是最优的路由。
 
R4#sh ip bgp //R1-R2-R4
BGP table version is 2, local router ID is 4.4.4.4
Status codes: s suppressed, d damped, h history, * valid, > best, i - internal,r RIB-failure, S Stale
Origin codes: i - IGP, e - EGP, ? - incomplete
Network Next Hop Metric LocPrf Weight Path
* i1.1.1.0/24 192.168.12.1 0 100 0 1 i
*>i2.2.2.0/24 2.2.2.2 0 100 0 i
//i表示是从内部AS学到的路由。图中,R4的1.1.1.1的路由是从R2(同AS)学到的。
//不打i的情况:本地通告和从EBGP学到的路由。例如R2学到的1.1.1.1的路由
//发现:R4的1.1.1.1是没有>号的,说明这个路由不是最优的。

目的四:解决IBGP中路由不优问题(同步和下一跳)

目的三的结果告诉我,R4的1.1.1.1是没有>号的,说明这个路由不是最优的。

造成路由不是最优会导致:

  1. 不放进路由表。
  2. 不会给其他BGP邻居传这条路由。

造成不优的原因有:

  1. BGP Synchronization(同步)
  2. 下一跳

同步:只是针对IBGP来说的,默认的我从IBGP学习到的路由,我不会放进路由表,也不会宣告给邻居路由器。直到我从IGP也学习到这条路由。结合拓扑:R4中1.1.1.0/24路由为什么是不优的呢?是因为R4没有通过OSPF学到1.1.1.0/24。

同步的好处:

  1. 避免了数据层面的路由黑洞(路由可达,数据包去回不来)。Eg:每个路由器中都有1.1.1.0/24的路由。
  2. 确保穿越AS信息的一致性
  3. 注:同步只是针对数据层面的问题,但是解决数据的问题的方法有很多,包括MPLS。所以,现在的路由器,特别是Cisco IOS 12.2(8)T或更高的版本中,默认是关闭同步。

下一跳:再来看看R4上1.1.1.0/24

R4#sh ip bgp
Network Next Hop Metric LocPrf Weight Path
* i1.1.1.0/24 192.168.12.1 0 100 0 1 i
*>i2.2.2.0/24 2.2.2.2 0 100 0 i
//BGP中的下一跳不是路由器,而是AS,所以知道为什么下一跳不可达了吧!
//想一想:R4上会有12网段的路由吗?肯定没有,因为只有R2、R3和R4运行了OSPF,但R2并没有宣告12网段到OSPF。
//这是一个下一跳不可达的问题。

解决不优的方法有:

对于同步:从IGP学习到/直接关闭(no synchronization),关闭同步配置:

R4(config)#router bgp 2
R4(config-router)# no synchronization

对于下一跳:静态/next-hop-self

当R1把1.1.1.0/24的路由通过EBGP传到R2时,R2会自动把1.1.1.0/24路由的下一跳改成自己,这样R4中1.1.1.0/24路由的下一跳就是R2了。通过IGP,R4知道R2的。

这个命令建议在AS边界路由器向自己AS的IBGP邻居做的。

R2(config)#router bgp 2
R2(config-router)#neighbor 4.4.4.4 next-hop-?
next-hop-self next-hop-unchanged
R2(config-router)#neighbor 4.4.4.4 next-hop-self

验证:

R4#sh ip bgp
Network Next Hop Metric LocPrf Weight Path
*>i1.1.1.0/24 2.2.2.2 0 100 0 1 i
*>i2.2.2.0/24 2.2.2.2 0 100 0 i
//变成最优了,下一跳也变了(update-Source)
 
R4#sh ip route //BGP的路由表
1.0.0.0/24 is subnetted, 1 subnets
B 1.1.1.0 [200/0] via 2.2.2.2, 00:05:42
2.0.0.0/8 is variably subnetted, 2 subnets, 2 masks
//路由表里也有了1.1.1.0/24这条路由。
 
R5#sh ip bgp
Network Next Hop Metric LocPrf Weight Path
*> 1.1.1.0/24 4.4.4.4 0 2 1 i
*> 2.2.2.0/24 4.4.4.4 0 2 i
//R4优了,就会向其他BGP邻居传这条路由,所以,R5也有这条路由了。

目的五:解决数据层面的路由黑洞以及peer-group的应用

前提:路由层面打通了,即1.1.1.0/24的路由在R5的路由表中了

现在,R5要向R1的1.1.1.1发送消息啦,我们看一下怎么走滴?……

R5#sh ip route
1.0.0.0/24 is subnetted, 1 subnets
B 1.1.1.0 [20/0] via 4.4.4.4, 00:33:27
//1.1.1.1的路由AD是20,EBGP学习到的,下一跳4.4.4.4
R4#sh ip route
1.0.0.0/24 is subnetted, 1 subnets
B 1.1.1.0 [200/0] via 2.2.2.2, 00:33:18
2.0.0.0/8 is variably subnetted, 2 subnets, 2 masks
O 2.2.2.2/32 [110/21] via 192.168.34.3, 05:21:58, Ethernet0/0
B 2.2.2.0/24 [200/0] via 2.2.2.2, 02:22:26
//1.1.1.1的路由AD是200,IBGP学习到的,下一跳是2.2.2.2(R4 neighbor 2.2.2.2了嘛!)
//再看看,2.2.2.2的路由是IGP的OSPF学习到的,下一跳是R3的物理口,扔给了R3
 
R3#sh ip route
2.0.0.0/32 is subnetted, 1 subnets
O 2.2.2.2 [110/11] via 192.168.23.2, 05:23:22, Ethernet0/1
3.0.0.0/24 is subnetted, 1 subnets
C 3.3.3.0 is directly connected, Loopback0
4.0.0.0/32 is subnetted, 1 subnets
O 4.4.4.4 [110/11] via 192.168.34.4, 05:23:22, Ethernet0/0
C 192.168.23.0/24 is directly connected, Ethernet0/1
C 192.168.34.0/24 is directly connected, Ethernet0/0
//发现:R3上并没有1.1.1.0的BGP路由。
//就这样,数据层面的路由黑洞出现了……

上文已经提过了解决黑洞的方法,现采用第二种:BGP邻居的full mesh。

引出一个技术:peer group,想一想,R3和R2、R4建立邻居的命令是一样的,这是不是要一个一个地配置呢?这时,peer group出现了,他能:

  1. 减小路由器的buffer
  2. 减少命令行

peer group 配置

R3(config-router)#neighbor cisco peer-group //下面是peer-group的模板,模板的名字是cisco
R3(config-router)#neighbor ?
A.B.C.D Neighbor address
WORD Neighbor tag
X:X:X:X::X Neighbor IPv6 address
R3(config-router)#neighbor cisco remote-as 2
R3(config-router)#neighbor cisco update-source loopback 0
 
R3(config-router)#neighbor 2.2.2.2 peer-group cisco //调用
R3(config-router)#neighbor 4.4.4.4 peer-group cisco
 
分别在R2和R4做一条指向R3的IBGP。
 
R2(config)#router bgp 2
R2(config-router)#neighbor 3.3.3.3 remote-as 2
R2(config-router)#neighbor 3.3.3.3 update-source loopback 0
R3同上一样

这时,所有路由器的路由表中都有了1.1.1.0/24的路由。路由黑洞解决……

目的六:R5 ping R1 !!!! and R5 ping R1 so 5.5.5.5 !!!!

任务是完成 R5 ping R1 !!!! and R5 ping R1 so 5.5.5.5 !!!! 要知道,要完成数据包 ping R5 到 R1!!!,所有路由器光有1.1.1.0/24的路由是没有用的。因为ping包含echo-request和echo-replay。echo-request包是可以从R5到R1,但是echo-replay回不来(R1到R5),因为R1的路由表中没有45的网段和R5环回口的路由。

解决:在R5上把R5的环回口和45网段通告出来。

配置:

R5(config)#router bgp 3
R5(config-router)#network 5.5.5.0 mask 255.255.255.0
//检查各个路由器中的5.5.5.0/24是不是最优的,无非就是下一跳和同步。

验证

R5#ping 1.1.1.1 so l0
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 1.1.1.1, timeout is 2 seconds:
Packet sent with a source address of 5.5.5.5
!!!!!
好了,做通了,不容易啊!!!

目的七:AS间的路由传输

  1. 重分布IGP到BGP
  2. Network
  3. 路由汇总

目的十:BGP在show中的各种状态

*和>
R2#sh ip bgp //这就是3张表中的BGP表
BGP table version is 3, local router ID is 2.2.2.2
Status codes: s suppressed, d damped, h history, * valid, > best, i - internal,r RIB-failure, S Stale
Origin codes: i - IGP, e - EGP, ? - incomplete
Network Next Hop Metric LocPrf Weight Path
*> 1.1.1.0/24 192.168.12.1 0 0 1 i
*> 2.2.2.0/24 0.0.0.0 0 32768 i
//*表示这条路由是可用的;>表示是最优的路由。
 
i
R4#sh ip bgp //R1到R2到R4
BGP table version is 2, local router ID is 4.4.4.4
Status codes: s suppressed, d damped, h history, * valid, > best, i - internal,r RIB-failure, S Stale
Origin codes: i - IGP, e - EGP, ? - incomplete
Network Next Hop Metric LocPrf Weight Path
* i1.1.1.0/24 192.168.12.1 0 100 0 1 i
*>i2.2.2.0/24 2.2.2.2 0 100 0 i
//i表示是从内部AS学到的路由。图中,R4的1.1.1.1的路由是从R2(同AS)学到的。
//不打i的情况:本地通告和从EBGP学到的路由。例如R2学到的1.1.1.1的路由
//发现:R4的1.1.1.1是没有>号的,说明这个路由不是最优的。
//后面的i表示起源属性,i表示这个路由是在BGP中network宣告的。
 
r
R2#sh ip bgp
BGP table version is 3, local router ID is 2.2.2.2
Status codes: s suppressed, d damped, h history, * valid, > best, i - internal,r RIB-failure, S Stale
Origin codes: i - IGP, e - EGP, ? - incomplete
Network Next Hop Metric LocPrf Weight Path
*> 1.1.1.0/24 192.168.1.1 0 0 2 i
r>i2.2.2.0/24 192.168.1.3 1 100 0 ?
r>i3.3.3.0/24 192.168.1.3 0 100 0 ?
*>i4.4.4.0/24 192.168.1.3 0 100 0 3 i
r>i192.168.1.0 192.168.1.3 0 100 0 ?
//r表示同时从IGP和BGP学到这个路由,但是IGP的AD比BGP的AD小。
//打r的路由会:不放进路由表,但是会传给邻居
R2#sh ip bgp rib-failure
Network Next Hop RIB-failure RIB-NH Matches
2.2.2.0/24 192.168.1.3 Higher admin distance n/a
3.3.3.0/24 192.168.1.3 Higher admin distance n/a
192.168.1.0 192.168.1.3 Higher admin distance n/a
 
s
R4#sh ip bgp
//再看看R4(在R4上宣告的)
BGP table version is 29, local router ID is 4.4.4.4
Status codes: s suppressed, d damped, h history, * valid, > best, i - internal,
r RIB-failure, S Stale
Origin codes: i - IGP, e - EGP, ? - incomplete
Network Next Hop Metric LocPrf Weight Path
*> 1.1.1.0/24 172.16.34.3 0 1 2 i
*> 4.4.4.0/24 0.0.0.0 0 32768 i
*> 192.168.4.0/22 0.0.0.0 32768 i
s> 192.168.4.0 0.0.0.0 0 32768 i
s> 192.168.5.0 0.0.0.0 0 32768 i
s> 192.168.6.0 0.0.0.0 0 32768 i
s> 192.168.7.0 0.0.0.0 0 32768 i
*> 192.168.8.0 0.0.0.0 0 32768 i
//打s的路由是被抑制掉的路由,它不会再向邻居传路由了。

BGP协议路由通告

路由通告

虽然OSPF与ISIS的路由协议通告称为LSA,其实也就是路由信息。BGP协议的路由通告就是纯路由信息,只是宣告的方式有所不同:

BGP的通告原则:

BGP数据库的建立

和OSPF与ISIS链路状态路由协议不一样,BGP路由协议作为一种矢量路由协议,在构建路由协议数据库中,传递的是简单的路由表和度量值。但与其他矢量路由协议不同,BGP是一种特殊的矢量路由协议,它在传递的过程中加入了一种路径属性的参数,它是通过不同路径属性来根据数据库路由信息选举最优路径。

BGP的路径属性

在下面有章节详细讲解。

BGP的3张表

注:BGP中是不带负载均衡的,它最终只会选出一条最优的路径。

当一个网络被BGP和另一个路由协议同时学到,这时,还是比AD,AD小的会放入路由表中。这时,想想BGP的两种AD(IBGP=200;EBGP=20)的作用了…….

修改BGP AD的命令

R(config-route)#distance bgp external internal local

BGP的路径属性

路径属性

另外,BGP的路径属性被归档成这些类别:

  1. Well-known(公认)和optional(任选)关于是否识别。
  2. Transitive(传递)和non-transitive(非可传递)关于传播范围。
  3. Mandatory(必遵)和discretionary(可选)关于是否遵守。

于是得到下列4大组合

  1. 公认必决:所有BGP路由器都可以识别,且必须存在于Update消息中。如果缺少这种属性,路由信息就会出错
  2. 公认可选:所有BGP路由器都可以识别,但不要求必须存在于Update消息中,可以根据具体情况来决定是否添加到Update消息中
  3. 任选可传递:BGP路由器可以选择是否在Update消息中携带这种属性。接收的路由器如果不识别这种属性,可以转发给邻居路由器,邻居路由器可能会识别并使用到这种属性。
  4. 任选非可传递:BGP路由器可以选择是否在Update消息中携带这种属性。在整个路由发布的路径上,如果部分路由器不能识别这种属性,可能会导致该属性无法发挥效用。因此接收的路由器如果不识别这种属性,应当丢弃这种属性,不必再转发给邻居路由器。

常见的路径属性

其中有三个公认必遵属性:

  1. Origin属性:
  2. AS-Path属性:
  3. Next-Hop属性:

AS Path

AS path:每条BGP路由穿越AS时便带上自己的AS号,不多说,防环用的。

默认的,最新的AS在最左边,依次累计.....

 

Next-hop

在IGP中,一条明细路由的下一跳是直连接口。

在BGP中,一条明细的BGP路由的下一跳是BGP邻居。

Next-hop:每条BGP都会携带,下一跳不可达时,BGP路由就没有‘>’

 

Origin

i 在BGP中通过network注入的路由
e EGPàBGP(现在估计没有了)
? IGP or StaticàBGP

BGP选路原则

出现选路的前提:同步(可以关闭同步)+最优路由(‘>’)

比较,选路……

  1. 最高的weight值(Cisco私有)或者perferred-value值(Huawei私有)
  2. 最高的本地优先级Local-preference,在AS内
  3. 聚合路由优先于非聚合路由
  4. 本地手动聚合路由优先于本地自动聚合路由
  5. 优先与本地0.0.0.0的路由,即本地network宣告的路由优先本地通过路由重分布注入的路由。
  6. 评估最短AS路径的长度,最短的优先。
  7. 最小的起源值Origin(i<e<?)。
  8. 最小的MED值,在AS间
  9. EBGP优于IBGP
  10. 优先与最近(IGP的Metric值最小)的IGP邻居
  11. 谁先和我建立EBGP,谁优先。
  12. 最小的BGP邻居的Route-ID

注意:

那我们开始正式学习BGP的各个属性,其实,我们可以理解成属性就是BGP下挂的很多字段,你不设置它,它就没有…

分析BGP属性,要掌握顺序:

  1. 传播范围
  2. 默认值
  3. 越大越好还是越小越好

Weight属性

Cisco私有属性,所以必然是任选非可传递

Local-Priority(本地优先级)属性

这个属性是公认可选的。

Route origin by Local route(next hop=0.0.0.0)

公认必决属性

本地network宣告的路由下一跳为0.0.0.0,意思是本地宣告的路由优先本地通过路由重分布注入的路由。

怎么说呢?比如:
Network Next Hop Metric LocPrf Weight Path
*>i1.1.1.0/24 0.0.0.0 0 100 0 1 i
* i 2.2.2.2 0 100 0 1 i
//这样的情况很难看到啊!自己宣告的路由,还会总从别人那里学到……..

Shortest AS path

优先于携带AS path最少的router

扩展命令:

R(config)#router bgp XX
R(config-router)#bgp bestpath as-path ignore
//跳过这一个选路原则

Origin Code

R4#sh ip bgp
BGP table version is 2, local router ID is 4.4.4.4
Status codes: s suppressed, d damped, h history, * valid, > best, i - internal,r RIB-failure, S Stale
Origin codes: i - IGP, e - EGP, ? - incomplete
Network Next Hop Metric LocPrf Weight Path
* i1.1.1.0/24 192.168.12.1 0 100 0 1 i
*>i2.2.2.0/24 2.2.2.2 0 100 0 i
i 在BGP中network xxxx
e EGP到BGP(现在估计没有了)
? IGP or Static 到 BGP

选路原则中IGP<EGP<incomplete

MED(Multi-Exit Discription)

MED就是BGP中的metric

这个属性是可选非穿越的

BGP选路实验

目的二:了解R4对X路由的选择路径

R4到X:可以从R3到R1再到X;也可以从R2到R1再到X

如果什么属性都不配置,R4到x路由:

如果AS2内IGP是OSPF呢?如果RIP呢?

OSPF metric值的计算和RIP metric值的计算不同咋?所以,OSPF选路是优先来的与最近(metric值最小)的IGP邻居。而RIP选路是最小的BGP邻居的route-id

R4#sh ip bgp
Network Next Hop Metric LocPrf Weight Path
*>i1.1.1.0/24 3.3.3.3 0 100 0 1 i
* i 2.2.2.2 0 100 0 1 i
优先是从R3,因为R4到R3是ethernet,metric值小些
 
R4#sh ip bgp 1.1.1.0/24
BGP routing table entry for 1.1.1.0/24, version 3
Paths: (2 available, best #1, table Default-IP-Routing-Table)
Not advertised to any peer
1
3.3.3.3 (metric 11) from 3.3.3.3 (3.3.3.3)
Origin IGP, metric 0, localpref 100, valid, internal, best
1
2.2.2.2 (metric 65) from 2.2.2.2 (2.2.2.2)
Origin IGP, metric 0, localpref 100, valid, internal
 
为什么不是10和64呢?
呵呵,因为IBGP之间的neighbor是指的对方的环回口咋…..

 

目的三:了解weight属性

我们再在R1上起一条8.8.8.0/24的路由

R4#sh ip bgp
Network Next Hop Metric LocPrf Weight Path
* i1.1.1.0/24 2.2.2.2 0 100 0 1 i
*>i 3.3.3.3 0 100 0 1 i
*>i8.8.8.0/24 3.3.3.3 0 100 0 1 i
* i 2.2.2.2 0 100 0 1 i
看看,都是从R3走。
 
R1#sh ip bgp
Network Next Hop Metric LocPrf Weight Path
*> 1.1.1.0/24 0.0.0.0 0 32768 i
*> 8.8.8.0/24 0.0.0.0 0 32768 i

现在我们想让R4到8.8.8.0/24的路由走R2,利用weight值来做策略。

可以在R4的入方向和R2的出方向上做,因为X路由是从R1,经过R2,传给R4的。

R4(config-router)#neighbor 2.2.2.2 weight 1
注:默认是策略进来的路由,不是出去的路由
R4#sh ip bgp
Network Next Hop Metric LocPrf Weight Path
* i1.1.1.0/24 3.3.3.3 0 100 0 1 i
*>i 2.2.2.2 0 100 1 1 i
* i8.8.8.0/24 3.3.3.3 0 100 0 1 i
*>i 2.2.2.2 0 100 1 1 i
看,weight值改成1了,都从R2走了,显然不是我们要的效果。
因为这样修改太厉害了…….
这时,我们可以用route-map来进行策略。
R4(config)#ip prefix-list 1 permit 8.8.8.0/24
 
R4(config)#route-map map
R4(config-route-map)#match ip address prefix-list 1
R4(config-route-map)#set weight 3(大于0即可)
R4(config)#route-map map premit 20
 
R4(config)#router bgp 2
R4(config-router)#neighbor 2.2.2.2 route-map map in
 
R4#sh ip bgp
Network Next Hop Metric LocPrf Weight Path
* i1.1.1.0/24 2.2.2.2 0 100 0 1 i
*>i 3.3.3.3 0 100 0 1 i
*>i8.8.8.0/24 2.2.2.2 0 100 1 1 i
* i 3.3.3.3 0 100 0 1 i
//看呀,效果是不是达到了啊…….

 

目的四:了解local-priority属性在AS内部的策略选路

现在我们想让R4到8.8.8.0/24的路由走R2,利用local-priority来做策略。

由于local-priority是邻居宣告过来的,所以要R4想走R2,必须在R2上做策略。

还是先来个厉害的,让1.1.1.0/24 and 8.8.8.0/24都从R2走。
R2(config)#router bgp 2
R2(config-router)#bgp default local-preference 101
R4#sh ip bgp
BGP table version is 9, local router ID is 4.4.4.4
Network Next Hop Metric LocPrf Weight Path
*>i1.1.1.0/24 2.2.2.2 0 101 0 1 i
*>i8.8.8.0/24 2.2.2.2 0 101 0 1 i
//优先级变了,都从R2走了。
R2#sh ip b
Network Next Hop Metric LocPrf Weight Path
*> 1.1.1.0/24 192.168.12.1 0 0 1 i
*> 8.8.8.0/24 192.168.12.1 0 0 1 i
//R2做的local-priority策略,R2上怎么没有显示呢?通常,对于自己宣告的路由,一般local preference显示的是空
 
R2#sh ip bgp 1.1.1.0/24
BGP routing table entry for 1.1.1.0/24, version 4
Paths: (1 available, best #1, table Default-IP-Routing-Table)
Advertised to update-groups:
2
1
192.168.12.1 from 192.168.12.1 (1.1.1.1)
Origin IGP, metric 0, localpref 101, valid, external, best
//这样可以看到本地宣告的localpref!!!
 
厉害的来完了,我们还是回归正题吧,要利用local-priority使8.8.8.0/24从R2走,还是要用route-map滴…….可以在R2的出接口上做策略。
 
R2(config)#access-list 1 permit 8.8.8.0 0.0.0.255
 
R2(config)#route-map map
R2(config-route-map)#match ip address 1
R2(config-route-map)#set local-preference 101
R2(config)#route-map map permit 20
 
R2(config)#router bgp 2
R2(config-router)#neighbor 4.4.4.4 route-map map out
R4#sh ip bgp
Network Next Hop Metric LocPrf Weight Path
*>i1.1.1.0/24 3.3.3.3 0 100 0 1 i
* i 2.2.2.2 0 100 0 1 i
* i8.8.8.0/24 3.3.3.3 0 100 0 1 i
*>i 2.2.2.2 0 101 0 1 i
效果达到了,想想,和weight值选路一样,local-priority也是用的route-map…….

 

目的五:了解Shortest AS path属性

现在我们想让R4到8.8.8.0/24的路由走R2,利用shortest AS path来做策略。

我们知道,只有穿越了AS,才会携带AS path属性,相同AS内的各个路由器的AS path都是一致的
 
所以,我们可以在R1的出方向做策略。
R1(config)#ip prefix-list 1 permit 8.8.8.0/24
 
R1(config)#route-map map
R1(config-route-map)#match ip address prefix-list 1
R1(config-route-map)#set as-path ?
prepend Prepend to the as-path
tag Set the tag as an AS-path attribute
R1(config-route-map)#set as-path prepend 6 7 8
R1(config)#route-map map premit 20
 
R1(config)#router bgp 1
R1(config-router)#neighbor 192.168.13.2 route-map map out
//策略是R1在给R3传8.8.8.0/24的时候,增加了6 7 8的AS path属性。
 
验证
R3#sh ip bgp
Network Next Hop Metric LocPrf Weight Path
* i1.1.1.0/24 2.2.2.2 0 100 0 1 i
*> 192.168.13.1 0 0 1 i
*>i8.8.8.0/24 2.2.2.2 0 100 0 1 i
* 192.168.13.1 0 0 1 6 7 8 i
//在R3上,8.8.8.0/24的路由AS path属性增加了6 7 8,路径变了。
 
为什么不是6 7 8 1呢?
原来,prepend意思是在……之前。就是说,8.8.8.0/24这条路由在出之前,AS path里已经有了6 7 8了。
 
R4#sh ip bgp
Network Next Hop Metric LocPrf Weight Path
*>i1.1.1.0/24 3.3.3.3 0 100 0 1 i
* i 2.2.2.2 0 100 0 1 i
*>i8.8.8.0/24 2.2.2.2 0 100 0 1 i
//R4到8.8.8.0/24的路由从R2走了,哈哈!!
 
 
我们也可以在R3的入方向上做
R3(config)#ip prefix-list 1 permit 8.8.8.0/24
 
R3(config)#route-map map
R3(config-route-map)#match ip address prefix-list 1
R3(config-route-map)#set as-path prepend 6 7 8
R3(config)#route-map map premit 20
 
R3(config)#router bgp 1
R3(config-router)#neighbor 192.168.13.1 route-map map in
R3#sh ip bgp
Network Next Hop Metric LocPrf Weight Path
* i1.1.1.0/24 2.2.2.2 0 100 0 1 i
*> 192.168.13.1 0 0 1 i
*>i8.8.8.0/24 2.2.2.2 0 100 0 1 i
* 192.168.13.1 0 0 6 7 8 1 i
 
按上面的说,为什么不是1 6 7 8呢?
其实,route map是在in方向做的。就是说,在in之前加上6 7 8,而R3 in之前,R1 out已经带上了AS 1了。
R4#sh ip bgp
Network Next Hop Metric LocPrf Weight Path
*>i1.1.1.0/24 3.3.3.3 0 100 0 1 i
* i 2.2.2.2 0 100 0 1 i
*>i8.8.8.0/24 2.2.2.2 0 100 0 1 i
//效果达到了……..
 
 
但是,前面的6 7 8是我们随便起的AS,假设连接的AS中真的有6 7 8呢,不就造成了EBGP的环路了吗?
呵呵,就拓扑来,我可以打上三个AS 1:
R3(config-route-map)#set as-path prepend 2 2 2
//这样便行了,实际中最好是这样……

 

目的六:了解origin code属性

R1#sh ip bgp
Network Next Hop Metric LocPrf Weight Path
*> 1.1.1.0/24 0.0.0.0 0 32768 i
*> 4.4.4.0/24 192.168.1.2 0 1 3 i
*> 192.168.4.0 192.168.1.2 0 1 3 i
*> 192.168.5.0 192.168.1.2 0 1 3 i
*> 192.168.6.0 192.168.1.2 0 1 3 i
*> 192.168.7.0 192.168.1.2 0 1 3 i
*> 192.168.8.0 192.168.1.2 0 1 3 i
 
针对192.168.4.0做一下修改,把起源属性i变成e
R1(config)#ip prefix-list 2 permit 192.168.4.0/24
 
R3(config)#route-map orgin
R3(config-route-map)#match ip address prefix-list 2
R3(config-route-map)#set orgin egp 2
R3(config)#route-map orgin permit 20
 
R3(config)#router bgp 1
R3(config-router)#neighbor 192.168.34.4 route-map orgin in

目的七:了解BGP filter

 

目的八:了解MED属性在AS之间的策略选路

在R4上把4.4.4.0/24的路由宣告进BGP中

R1#sh ip bgp
Network Next Hop Metric LocPrf Weight Path
*> 1.1.1.0/24 0.0.0.0 0 32768 i
* 4.4.4.0/24 192.168.12.2 0 2 i
*> 192.168.13.3 0 2 i
*> 8.8.8.0/24 0.0.0.0 0 32768 i
//默认R1到4.4.4.0/24会选择R3来走。因为R3的route-id大嘛!!
 
现在我想让R1访问4.4.4.0/24从R2走。就是说,R2或R3把4.4.4.0/24路由给R1时,会打上这条路由的MED,策略就在这MED上做……
 
可以把R3给R1 4.4.4.0/24时的MED改高点
R3(config)#access-list 1 permit 4.4.4.0 0.0.0.255
 
R3(config)#route-map map
R3(config-route-map)#match ip address 1
R3(config-route-map)#set metric 3
R3(config)#route-map map premit 20
 
R3(config)#router bgp 2
R3(config-route)#neighbor 192.168.13.1 route-map map
 
验证(扩展ping):
R4#ping
Target IP address: 8.8.8.8
Extended commands [n]: y
Source address or interface: 4.4.4.4
Loose, Strict, Record, Timestamp, Verbose[none]: r
eply to request 3 (68 ms). Received packet has options
Total option bytes= 40, padded length=40
Record route:
(192.168.34.4)
(192.168.13.3)
//去包走R3
(8.8.8.8)
(192.168.12.1)
(192.168.24.2)
//回包走R2
(4.4.4.4) <*>
(0.0.0.0)
(0.0.0.0)
(0.0.0.0)
End of list
回包走R2便知道策略完成了。
我们不能在R1上直接sh ip bgp,因为我可控的只有AS2
退出移动版