路径矢量路由协议
了解AS
AS(Autonomous System)
AS的经典定义为:在单一的技术管理下,采用同一种内部网关协议和统一的度量值在AS内转发数据包,并使用一种外部网关协议将数据包转发到其他AS的一组路由器。
分类:
- 公有AS(必须申请):0—64511。电信:4134;网通:9929;CN2:1609
- 私有AS:64512--65535
网站: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
- 大型企事业连接多个SP(多宿主)
- ISP之间(当一个数据包从一个AS传输到另一个AS的时候)。
- AS交换点(当一个AS连接多个AS的时候)。
- 大型企业网
ISP为什么用BGP,而不是别的IGP
- 方便管理,安全性能好(阻止不同AS之间的路由、过滤和认证功能)
- 承载的路由条目海量(10w+),而ospf(1w+),ISIS(2w+)
- 策略比一般的IGP更强(次优路由),更多
- 可扩展性强,不仅能传IPv4、v6,还能传VPNv4、组播VPN等。
BGP的特征
- 支持VLSM,CIDR。
- 支持增量更新与触发更新。
- 使用TCP协议作为可靠地传输机制,端口号为179
- 没有组播地址
- 60s/次,180s dead,通过keeplive包来验证TCP的连通。
- 属性化(metric只是属性当中的一员)。
- 支持大型的网络拓扑。
BGP和IGP的关系
- BGP承载的是一个外部客户路由,IGP承载的是内部核心路由
- IGP不会因BGP的影响而变化
- BGP不会因IGP的影响而变化,直到BGP的下一跳不可达
- BGP是IGP的递归查找
BGP协议报文
BGP协议报文封装
- BGP使用TCP来承载BGP协议报文,使用的TCP端口号是179号端口。
- BGP协议字段分成BGP头部,BGP Message和BGP Data三个部分。
BGP协议报文类型
BGP头部字段格式:
根据BGP头部不同的Type字段,BGP Message也各有不同,主要分成5类:
- Open:负责和对等体建立邻居关系。
- KeepAlive:该消息在对等体之间周期性地发送,用以维护连接。
- Update:该消息被用来在BGP对等体之间传递路由信息。
- Notification:当BGP Speaker检测到错误的时候,就发送该消息给对等体。
- Route-refresh:用来通知对等体自己支持路由刷新能力;
Open报文
- Version:BGP Open报文的版本号。
- My AS:本AS号。
- Hold Time:
- BGP Identifier:指定BGP的Route-ID。
- Variable:BGP能力字段,能力字段会相互会协商IPv4、IPv6和组播等
Update报文
- Path Attribute:路径属性
- NLRI(Network Layer Reachability Information):即网络层可达信息,由于TCP是一种可靠地面向连接的协议,需要保持连接的可达性,BGP的keeplive包便提供了这样一个机制
- 触发更新和增量更新:由于BGP是一个庞大的路由系统,每时每刻的更新会导致资源的浪费。IBGP 5s/次;EBGP 30s/次
- 撤销路径
Notification报文
Route-Refresh报文
通常发生在邻居路由器做完策略后,我还没有得到更新,我就会发送一个这样的报文
通常我会利用clear命令来实现这一步骤
BGP协议邻居关系
邻居关系建立
由于BGP邻居关系建立在TCP连接的基础之上,所以可以通过IGP或静态路由来提供TCP连接的IP可达性
关于建立邻居使用的hello报文:
- 在IGP中的hello包无非就是发现建立邻居,维持邻居关系(keeplive)两大作用。
- 在BGP中,hello包被细分成open包(只发一次)和keeplive包(60s/次;180s dead)。
- BGP neighbor=BGP peer(对等体)
- BGP分为IBGP和EBGP,IBGP是内部的(internal),EBGP是外部的(external)。所以,IBGP形成邻居的路由器在同一个AS,而EBGP形成邻居的路由器在不同的AS。
- 注:IBGP必须通过IGP来保持互通。
IBGP邻居
- IBGP,全称Internal BGP,即在AS内部BGP路由器之间建立的邻居关系。
- IBGP邻居可以不直连,但要保证TCP 179的连通,可以通过neighbor命令来实现。
- IBGP不支持负载均衡。
EBGP邻居
- EBGP,全称External BGP,即在AS之间BGP路由器之间建立的邻居关系。
- EBGP的邻居默认情况下是直连的,但是也可以不直连,这需要修改TTL。
- EBGP默认不支持,但是有办法让它支持。
指定更新源和EBGP多跳
更新源,即update-source。在BGP通过neighbor指邻居时,会自动带上一个update-source信息,默认是:源是本端连接对端接口IP地址,目的是neighbor指向邻居的地址。
- 在EBGP中,update-source就是自己的物理口,而指的也是对方的物理口,匹配,邻居建立。
- 在IBGP中,由于是指peers的环回口,而update-source却是学习到这个路由(IGP)的物理口。所以,有必要把update-source改写成loopback口。一边做也可以,但是建议两边都做上。
- 注意:我们建议用环回口作为update source口,主要目的是为了冗余。
EBGP多跳,称EBGP-multihop(EBGP多跳)。这里的hop=TTL,默认EBGP发来的路由协议报文的TTL=1,即1跳,而IBGP默认是多跳。这样问题就来了,如果EBGP是用环回口建立邻居,那么EBGP邻居之间的路由协议报文就无法抵达。针对这个问题,解决的办法很简单,修改TTL,即EBGP多跳。
邻居建立的状态机制
- Idle:查找我neighbor的邻居,并看是否有路由到达邻居。
- Connect:我找到了邻居,并与它完成了TCP的3次握手。
- Open sent:我开始向它发送我的Open包,里面含有我的基本信息。
- Open confim:它收到了我的包,查看和它的信息是否一致,不一致不给我回包。
- Exstablished:邻居建立,可以路由了。
常见的几种状态:
- Idle:我neighbor你了,但是我的路由表里没有你的路由。解决:IGP路由可达。
- Exstablished:邻居建立。sh ip bgp summary中,可以从state字段中看到的是数字,这个数字代表我从邻居学习到了多少条路由
- Active:如果出现这种情况,有四种可能性:
- 我的open包到你那了(说明我neighbor你了),但是你没有我的路由。
- 你neighbor我的地址配错了。
- 你根本没有neighbor我。
- AS号没有配置。
BGP邻居关系实验
目的一:BGP邻居关系的建立(neighbor和update Source问题)
分为IBGP和EBGP邻居关系的建立
R2(config-router)#bgp router-id 2.2.2.2
R2(config-router)#neighbor 192.168.12.1 remote-as 1
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
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
注意:
- 在IGP中,network的作用有两个:hello建立邻居和路由的通告。
- 在BGP中,由于是基于TCP,TCP是一个点到点的连接,不支持广播,只能单播。
- 所以,BGP用neighbor指邻居,而network传路由。
验证:
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张表中的邻居表,邻居的详细信息,很多的。
TCB Local Address Foreign Address (state)
65053418 192.168.12.2.32373 192.168.12.1.179 ESTAB
目的二: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)#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
目的三:路由的通告(network,show查看)
Network在IGP和BGP区别
在IGP中,network宣告的是接口,即路由器是宣告自己直连的本地接口。
在BGP中,network宣告的是路由,即路由器是宣告自己路由表里的路由。
PS:BGP宣告的时候,一定要学到的路由的掩码一样
Network在BGP的原则:
- 从EBGP获得的路由会向它所有BGP相邻体通告(包括EBGP和IBGP)
- 从IBGP获得的路由不向它的IBGP邻居通告(除非RR)
- 从IBGP获得的路由是否通告给它的EBGP对等体要靠同步来决定
- 多条路径时,BGP会选择一条最优的路径
R1(config-router)#network 1.1.1.0 mask 255.255.255.0 //前提是确保R1的路由表里有
验证
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
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是没有>号的,说明这个路由不是最优的。
造成路由不是最优会导致:
- 不放进路由表。
- 不会给其他BGP邻居传这条路由。
造成不优的原因有:
- BGP Synchronization(同步)
- 下一跳
同步:只是针对IBGP来说的,默认的我从IBGP学习到的路由,我不会放进路由表,也不会宣告给邻居路由器。直到我从IGP也学习到这条路由。结合拓扑:R4中1.1.1.0/24路由为什么是不优的呢?是因为R4没有通过OSPF学到1.1.1.0/24。
同步的好处:
- 避免了数据层面的路由黑洞(路由可达,数据包去回不来)。Eg:每个路由器中都有1.1.1.0/24的路由。
- 确保穿越AS信息的一致性
- 注:同步只是针对数据层面的问题,但是解决数据的问题的方法有很多,包括MPLS。所以,现在的路由器,特别是Cisco IOS 12.2(8)T或更高的版本中,默认是关闭同步。
下一跳:再来看看R4上1.1.1.0/24
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)# 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)#neighbor 4.4.4.4 next-hop-?
next-hop-self next-hop-unchanged
R2(config-router)#neighbor 4.4.4.4 next-hop-self
验证:
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)
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
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发送消息啦,我们看一下怎么走滴?……
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
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
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出现了,他能:
- 减小路由器的buffer
- 减少命令行
peer group 配置
R3(config-router)#neighbor cisco peer-group //下面是peer-group的模板,模板的名字是cisco
R3(config-router)#neighbor ?
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(config-router)#neighbor 3.3.3.3 remote-as 2
R2(config-router)#neighbor 3.3.3.3 update-source loopback 0
这时,所有路由器的路由表中都有了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)#network 5.5.5.0 mask 255.255.255.0
//检查各个路由器中的5.5.5.0/24是不是最优的,无非就是下一跳和同步。
验证
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间的路由传输
- 重分布IGP到BGP
- Network
- 路由汇总
目的十: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
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宣告的。
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小。
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
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,
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协议的路由通告就是纯路由信息,只是宣告的方式有所不同:
- 在IGP中,network宣告的是接口,即路由器是宣告自己直连的本地接口。
- 在BGP中,network宣告的是路由,即路由器是宣告自己路由表里的路由。
- 所以我们会发现,BGP的设计模型是基于IGP之上的。
BGP的通告原则:
- 从EBGP获得的路由会向它所有BGP相邻体通告(包括EBGP和IBGP)。
- 从IBGP获得的路由不向它的IBGP邻居通告(除非RR)。
- 从IBGP获得的路由是否通告给它的EBGP对等体要靠同步来决定。
- 多条路径时,BGP会选择一条最优的路径。
BGP数据库的建立
和OSPF与ISIS链路状态路由协议不一样,BGP路由协议作为一种矢量路由协议,在构建路由协议数据库中,传递的是简单的路由表和度量值。但与其他矢量路由协议不同,BGP是一种特殊的矢量路由协议,它在传递的过程中加入了一种路径属性的参数,它是通过不同路径属性来根据数据库路由信息选举最优路径。
BGP的路径属性
在下面有章节详细讲解。
BGP的3张表
- 邻居表:存放BGP的邻居信息(通过open包)。
- BGP表(转发数据库):存放邻居学习到的所有路由;到达目标网络的所有路径;各种BGP路径属性
- 路由表:到达目标网络的最优路径。
注:BGP中是不带负载均衡的,它最终只会选出一条最优的路径。
当一个网络被BGP和另一个路由协议同时学到,这时,还是比AD,AD小的会放入路由表中。这时,想想BGP的两种AD(IBGP=200;EBGP=20)的作用了…….
修改BGP AD的命令
R(config-route)#distance bgp external internal local
BGP的路径属性
路径属性
- 我看可以把BGP的路径属性看成矢量路由协议中的度量值,它是一组描述BGP前缀特性的参数,通过不同路径属性来根据数据库路由信息选举最优路径。
- 和OSPF与ISIS不同,它们都是利用SPF算法计算出最小的Cost值来选取最优路径,路径调整很难控制;而BGP则是通过不同路径属性信息来决定,这些路径属性信息可以通过CLI命令进行调整,显然在路径调整上BGP更加灵活。
- BGP路由信息的路径属性是封装在Update报文中,通过路由通告来进行交互。
另外,BGP的路径属性被归档成这些类别:
- Well-known(公认)和optional(任选)关于是否识别。
- Transitive(传递)和non-transitive(非可传递)关于传播范围。
- Mandatory(必遵)和discretionary(可选)关于是否遵守。
于是得到下列4大组合
- 公认必决:所有BGP路由器都可以识别,且必须存在于Update消息中。如果缺少这种属性,路由信息就会出错
- 公认可选:所有BGP路由器都可以识别,但不要求必须存在于Update消息中,可以根据具体情况来决定是否添加到Update消息中
- 任选可传递:BGP路由器可以选择是否在Update消息中携带这种属性。接收的路由器如果不识别这种属性,可以转发给邻居路由器,邻居路由器可能会识别并使用到这种属性。
- 任选非可传递:BGP路由器可以选择是否在Update消息中携带这种属性。在整个路由发布的路径上,如果部分路由器不能识别这种属性,可能会导致该属性无法发挥效用。因此接收的路由器如果不识别这种属性,应当丢弃这种属性,不必再转发给邻居路由器。
常见的路径属性
其中有三个公认必遵属性:
- Origin属性:
- AS-Path属性:
- 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选路原则
出现选路的前提:同步(可以关闭同步)+最优路由(‘>’)
比较,选路……
- 最高的weight值(Cisco私有)或者perferred-value值(Huawei私有)
- 最高的本地优先级Local-preference,在AS内
- 聚合路由优先于非聚合路由
- 本地手动聚合路由优先于本地自动聚合路由
- 优先与本地0.0.0.0的路由,即本地network宣告的路由优先本地通过路由重分布注入的路由。
- 评估最短AS路径的长度,最短的优先。
- 最小的起源值Origin(i<e<?)。
- 最小的MED值,在AS间
- EBGP优于IBGP
- 优先与最近(IGP的Metric值最小)的IGP邻居
- 谁先和我建立EBGP,谁优先。
- 最小的BGP邻居的Route-ID
注意:
- 2和8是最常用的可选项策略;10(IBGP间)和12(EBGP间)是默认情况下的选路。
- 当1-10都相同的时候,为等价路由,可以进行负载,当负载成功时,以下三条原则失效:
- 比较Cluster-List长度,短者优先
- 比较Originator_ID(如果没有Originator_ID,则用Router ID比较),选择数值较小的
- 比较对等体的IP地址,选择IP地址数值最小的路径
那我们开始正式学习BGP的各个属性,其实,我们可以理解成属性就是BGP下挂的很多字段,你不设置它,它就没有…
分析BGP属性,要掌握顺序:
- 传播范围
- 默认值
- 越大越好还是越小越好
Weight属性
Cisco私有属性,所以必然是任选非可传递
- 传播范围:本地有效
- 默认值:0(从BGP邻居那里学的)和32768(本地宣告的路由)
- 越大越好,越大越优先
- 通常,weight值可以对路由进行策略,为其选路,但是只能策略修改从邻居学到路由的weight值,不能修改发给邻居的weight值
- 这个属性是自己决定的
Local-Priority(本地优先级)属性
这个属性是公认可选的。
- 传播范围:只能在一个AS内部,即只能给自己的IBGP邻居。
- 默认值:默认是100
- 越大越好。越大越优先
- 通常,local-priority是出口路由器用来通告给IBGP邻居,告诉它们怎么离开这个AS。
- 这个属性是别人(IBGP邻居)决定你的
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
//这样的情况很难看到啊!自己宣告的路由,还会总从别人那里学到……..
Shortest AS path
优先于携带AS path最少的router
扩展命令:
R(config-router)#bgp bestpath as-path ignore
Origin Code
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
这个属性是可选非穿越的
- 传播范围:仅仅EBGP邻居之间
- 默认值:0或空
- 越小越好,越小越优先
- 通常,MED用来通告给同一个AS的不同EBGP邻居,告诉它们怎么进入自己的AS。
- 这个属性是别人(EBGP)决定你的
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
Network Next Hop Metric LocPrf Weight Path
*>i1.1.1.0/24 3.3.3.3 0 100 0 1 i
优先是从R3,因为R4到R3是ethernet,metric值小些
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
3.3.3.3 (metric 11) from 3.3.3.3 (3.3.3.3)
Origin IGP, metric 0, localpref 100, valid, internal, best
2.2.2.2 (metric 65) from 2.2.2.2 (2.2.2.2)
Origin IGP, metric 0, localpref 100, valid, internal
呵呵,因为IBGP之间的neighbor是指的对方的环回口咋…..
目的三:了解weight属性
我们再在R1上起一条8.8.8.0/24的路由
Network Next Hop Metric LocPrf Weight Path
* i1.1.1.0/24 2.2.2.2 0 100 0 1 i
*>i8.8.8.0/24 3.3.3.3 0 100 0 1 i
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
Network Next Hop Metric LocPrf Weight Path
* i1.1.1.0/24 3.3.3.3 0 100 0 1 i
* i8.8.8.0/24 3.3.3.3 0 100 0 1 i
看,weight值改成1了,都从R2走了,显然不是我们要的效果。
R4(config)#ip prefix-list 1 permit 8.8.8.0/24
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)#neighbor 2.2.2.2 route-map map in
Network Next Hop Metric LocPrf Weight Path
* i1.1.1.0/24 2.2.2.2 0 100 0 1 i
*>i8.8.8.0/24 2.2.2.2 0 100 1 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 default local-preference 101
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
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显示的是空
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:
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)#match ip address 1
R2(config-route-map)#set local-preference 101
R2(config)#route-map map permit 20
R2(config-router)#neighbor 4.4.4.4 route-map map out
Network Next Hop Metric LocPrf Weight Path
*>i1.1.1.0/24 3.3.3.3 0 100 0 1 i
* i8.8.8.0/24 3.3.3.3 0 100 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(config)#ip prefix-list 1 permit 8.8.8.0/24
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)#neighbor 192.168.13.2 route-map map out
//策略是R1在给R3传8.8.8.0/24的时候,增加了6 7 8的AS path属性。
Network Next Hop Metric LocPrf Weight Path
* i1.1.1.0/24 2.2.2.2 0 100 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,路径变了。
原来,prepend意思是在……之前。就是说,8.8.8.0/24这条路由在出之前,AS path里已经有了6 7 8了。
Network Next Hop Metric LocPrf Weight Path
*>i1.1.1.0/24 3.3.3.3 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(config)#ip prefix-list 1 permit 8.8.8.0/24
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)#neighbor 192.168.13.1 route-map map in
Network Next Hop Metric LocPrf Weight Path
* i1.1.1.0/24 2.2.2.2 0 100 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
其实,route map是在in方向做的。就是说,在in之前加上6 7 8,而R3 in之前,R1 out已经带上了AS 1了。
Network Next Hop Metric LocPrf Weight Path
*>i1.1.1.0/24 3.3.3.3 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的环路了吗?
R3(config-route-map)#set as-path prepend 2 2 2
目的六:了解origin code属性
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)#neighbor 192.168.34.4 route-map orgin in
目的七:了解BGP filter
目的八:了解MED属性在AS之间的策略选路
在R4上把4.4.4.0/24的路由宣告进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
*> 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)#match ip address 1
R3(config-route-map)#set metric 3
R3(config)#route-map map premit 20
R3(config-route)#neighbor 192.168.13.1 route-map map
Target IP address: 8.8.8.8
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
我们不能在R1上直接sh ip bgp,因为我可控的只有AS2