Network-5
BGP
BGP(border gateway protocol)边界网关路由协议
通过是否工作在同一个as(自治系统)进行划分的
AS(autonomous systems):运行同一种选路策略,由统一管理者管理
RFC文档:对于as定义,一组被统一管理的路由器,它们使用同一个内部网关协议,并且使用外部网关协议到其他AS
IANA(英特网地址授权委员会)分配ip和as号
AS号范围:0-65535
其中0,65535都被保留的,1-64511是公有as64512-65534私有as
现在ios系统支持4字节的as号(2^32)个as
IGP: RIP EIGRP OSPF ISIS IGRP
EGP: BGPv4 EGP(EGP是BGP前身)
BGP属于路径向量路由协议
使用BGP的原因:
1.一个数据包从一个AS到另一个的时候,必须使用BGP
2.当多条链路从一个as到另一个as时候,必须使用BGP
3.当离开as部署路由策略和路由选择,建议使用BGP
BGP使用触发更新和增量更新
BGP特点
1.BGP基于tcp,并且是唯一一个基于tcp的路径选择协议,源端口大于1024的随机端口,(1024以下的是比较重要的端口),目标端口是179,基于tcp,由于也是端到端的,所以要主动 指neighbor才能建立邻居
2.BGP只支持触发更新
3.通过keep alive消息维持tcp会话
4.BGP有丰富的度量值(丰富的属性)
5.给大型网络设计的(比如英特网)
BGP三张表
1.邻居表
记录了BGP的邻居,BGP邻居可以非直连,需要手工指定,BGP是没有组播地址,都是单播
2.BGP表
记录了从邻居那里学来的所有路由,可以有多条路径去往目标,携带BGP属性
3.路由表
BGP默认不负载均衡,总会通过BGP表选出一条最佳的路径
BGP的AD 20 200
BGP的4个消息
1.open
发现邻居,包括hold time(默认180s)和router-id
2.keep alive
维系邻居,维系tcp邻居,每60s发送一次,3倍时间没收到对面的,就表示邻居挂了
3.update
通过报文,通告从邻居那里知道的路径,并携带了丰富的网络属性,只通告最优的的给邻居
4.notification
当配置出现错误时候的消息,当BGP死了的时候也会出现
BGP的5个状态
1.idle
找路由表看看是否有去邻居的路由,如果找不到就卡在idle状态,这个时候需要检查底层IGP
2.connect
路由器知道去邻居的路径,并且在这个状态完成tcp三次握手
3.open sent
向邻居发送open消息
4.open confirm
作为一种response响应,如果没有响应,会卡在active状态(活动非正常状态),这个时候需要检查对端
(一般常见问题:)
1.对端没有路由达到我的更新源2.邻居neighbor地址错了3.对端没指neighbor4.as号错误
5.established
最终BGP状态
BGP的neighbor
BGP的neighbor又被称为BGP的peers,也就是BGP对等体
BGP的speaker指运行BGP的路由器
EBGP:运行在as与as之间的设备
IBGP: 运行在同一个as之内的设备
EBGP建议使用直连,IBGP建议使用环回口
EBGP管理距离20
IBGP管理距离200
本地路由也是200
配置
(config)
router bgp [as]
这里as表示整个路由器属于某个as
bgp router-id [rid]
这里必须要写rid
nei [对端ip] remote-as [对端as]
nei [对端ip] up [接口]
给对端指定自己的更新源
注意:
BGP默认更新源是自己的出接口,如果要用环回口建立邻居,需要修改自己的更新源(两边都要做)
(config -router)
nei 2.2.2.2 remote 64511
nei 2.2.2.2 up lo0
EBGP建立邻居也可以用环回口,但是不会通,因为EBGP之间的ttl=1,所以需要更改EBGP跳数
(config-router)
nei 4.4.4.4 remote 64512
nei 4.4.4.4 up lo0
nei 4.4.4.4 ebgp-mul
更改默认跳数
[nei 4.4.4.4 ebgp-mul 255==nei 4.4.4.4 ebgp-mul]
sh ip bgp sum
查看bgp邻居信息
sh ip bgp nei
查看bgp邻居细节信息
用clear ip bgp *
重置bgp进程(硬重启)
用clear ip bgp * so
软重启
sh tcp bri
查看自己和对方开放的端口,ESTAB才算真的通信
sh ip bgp 查看bgp表
必须* + > 才可以载入路由表中!!!!
* 代表路由可用 > 代表最优路由(同一条路由理论上永远只有一个)
r 代表本地路由装载失败,因为BGP的ad大于其他协议,但是该路由最优,还是会传给BGP对等体 sh ip bgp rib-fail
next-hop 如果是0.0.0.0代表myself,本地宣告
> 的路由一定会传递给bgp对等体,但不一定载入本地路由表
*> 该路由最优,一定会被装到路由表
打>的条件: 1.下一跳可达 下一跳不可达解决方案:
写静态路由
在EBGP条件下可以考虑nei 4.4.4.4 next-hop-self
2.如果“同步”开启,就要满足“同步”原则 “同步规则”从IBGP邻居学到的路由,不能使用也不能传给EBGP邻居,直到从IGP也学到该路由 一般情况关闭同步
(config-router)
no syn
3.选路
bgp宣告:
bgp宣告的是路由!!!!不是接口,只要路由表存在的路由,都可以宣告进bgp
(config-router)
net 11.1.1.0 mask 255.255.255.0
要和路由表完全一致
EBGP传给自己内部as信息的时候,下一跳不会改变,可能造成自己内部其他对等体的下一跳不可达问题,导致没有>
所以需要在边界路由器对内部
(config-router)
nei 2.2.2.2 next-hop-self
告诉自己对等体把自己当作下一跳
【ospf宣告环回口会把环回口变成32位子网,影响选路,所以需要进入lo接口中,ip os net point-to-point,这样可以让环回口恢复24位子网】
IBGP的水平分割
从IBGP邻居学到的路由不会传给其他的IBGP邻居(BGP防环用的)
所以可以考虑建立全互联关系
在防环的情况下打破水平分割
1.路由反射器(RR:router-reflector)
RRC(路由反射器用户)
non-RRC
配置RRC发命令会发生在中间路由器上
(config-router)
nei [邻居rid] router-reflactor-client
把目标配置成RRC,自己就成为RR
路由反射器只能反射路由,不能对路由属性(比如next-hop)进行修改,是爱没办法只能用静态路由解决
路由反射防环方法:
1.ogrinator 起源者属性
如果起源者的rid是自己的rid,就不能接受该路由
使用sh ip bgp x.x.x.0
查看路由的属性
默认情况起源者是开启的
2.cluster-list簇列表属性,罗列了路由器所有经过的RR的rid
收到的路由簇列表中如果有本地的RID,就deny该路由
配置联盟
联盟里的EBGP是不受水平分割影响的,联盟只对内部有效,对于别的as的设备来说是透明的
配置
(config)
router bgp 12
进入小as
bgp router-id 2.2.2.2
nei 1.1.1.1 remote 12
nei 1.1.1.1 up lo0
nei 23.23.23.3 remote 3
bgp conf id 123
声明自己所在的大as号叫123
!!!在联盟与联盟之间的边界路由要配置bgp conf peers [对方as号]
,让路由器知道实际上对方as也和自己一样属于同一个大as中
配置peer group
配置模版
nei [peer group名:TEST] peer-group
定义一个模版
nei TEST remote 123
nei TEST up lo0
nei TEST route-ref
nei 1.1.1.1 peer TEST
BGP认证
BGP只支持md5认证,没有明文认证
(config-router)
nei [邻居] pass [0-7加密类型] [密码]
0明文显示,7是cisco私有密文显示
BGP路由属性
公认vs任选
公认:所有厂商都支持
任选:不是所有厂商都支持
必须遵守vs任意遵守
可传输vs非可传输
公认必尊属性
所有厂商都识别,必须选择使用,一定携带在路由更新消息中
公认任意遵守属性
所有厂商都识别,不一定用它,有可能出现在更新消息中
任选属性
-任选可传输:如果识别,本地生效后传给邻居,如果不识别,也是可以传给邻居的
-任选非可传输:如果不识别,就忽略它,不会传给邻居
打*号的是公认必遵:
as path*
next-hop*
origin*
local preference
MED
weight
as path
作用:用来描述一条路由经过的as的,EBGP用来放环的
选路:优选短的as path,代表经历了少的as,距离本地近
分类:公认必遵
next-hop
作用:0.0.0.0代表路由是本地产生的
选路:优选起源于本地的路由0.0.0.0
分类:公认必遵
origin
作用:描述路由起源的
i 通过network命令宣告进来的
e 通过EGP协议重发布进来的
?通过其他协议重发布进来的
选路:优选起源代码小的
代码i<e<?
分类:公认必遵
weight
作用:只影响本地路由选择
选路:优选大的weight值
默认32768和0,起源本地的路由都是32768,邻居来的都是0
分类:cisco私有的,最安全的属性,因为影响范围小
local-preference
作用:适用于数据包出站选路(数据包从as出去)
选路:
越大越优先,默认100
分类:公认任意遵守属性,但是影响整个as的设备,适用于影响本as的IBGP邻居的出站
MED(metric)
作用:影响其他as的EBGP设备,影响入站选路
选路:越小越优先,默认值0
分类:任选非可传输属性
BGP的最终选路原则:
1.优选高的weight值
2.优选高的local preference值
3.优选起源于本地的路由(next-hop)
4.优选最短的as-path
5.优选最小的origin code(i,e,?)
6.优选最小的MED值
7.EBGP路由优于IBGP路由
8.优选最近的IGP邻居
9.优选最老的EBGP路由
10.优选最小邻居的router-id
11.优选最小邻居的ip地址
(理论上前6条就搞定了)
注意!!!!
所有路由属性的修改,最后清进程!!!全部在数据发出方清!!!!!!
weight:
本地有效,只在这个路由器起作用
配置
1.
(config-router)
nei [邻居] wei [weight值]
修改针对某个邻居传来的所有路由的weight值
之后没反应,要用clear ip bgp * so
在数据发出方清理
2.
acce 1 per 33.3.3.0
route-map kinmfer per 10
mat ip add 1
set weight 99
route-map kinmfer per 20
一定要写空语句,放过其他路由
(config-router)
nei 4.4.4.4 route-map kinmfer in
local-preference(本地优先级)
不能传出as,可以本as内所有设备生效
告诉自己的IBGP邻居如何离开本as
默认值=100
设置方法:通常在本as的边界路由器设置
配置
1.
bgp def local-pre [本地优先级值]
自己身上清理就可以看到结果
2.
ip pre 100 per 33.3.3.0/24
route-map kinmfer per 10
mat ip add pre 100
set local-pre 101
route-map kinmfer per 20
(config-router)
nei 1.1.1.1 route-map kinmfer out
next-hop
配置
ip pre 100 per 33.3.3.0/24
route-map kinmfer per 10
mat ip add pre 100
set next-hop 0.0.0.0
route-map kinmfer per 20
as-path
只能增长不能减少
配置
acce 1 per 33.3.3.0
route-map kinmfer per 10
mat ip add 1
set as-path prepend 10 20 30 40
route-map kinmfer per 20
(config-router)
nei 32.32.23.3 route-map kinmfer in
之后要在R3上面清
如果是in方向,就是 10 20 30 40 3 i,如果是out就是3 10 20 30 40 i
set的as号最好写重复的,不然会造成环路
origin code
i=IGP 是network
e=EGP 早期EGP协议重发布进来
?=incomplete 重发布进BGP的路由或者静态路由
配置
R1
acce 1 per 3.3.3.0
acce 2 per 33.3.3.0
route-map kinmfer per 10
mat ip add 1
set origin egp 999
route-map kinmfer per 20
mat ip add 2
set origin incomplete
route-map kinmfer per 30
(config-router)
nei 4.4.4.4 route-map kinmfer in
MED选路适用于EBGP邻居进站的选路
1.
(config-router)
default-metric [med值]
大规模修改metric
修改这个只对从邻居发出的路由有效,但是对邻居转发的路由无效
2.
R2
acce 1 per 3.3.3.0
route-map kinmfer per 10
mat ip add 1
set metric 11
route-map kinmfer per 20
(config-router)
nei 1.1.1.1 route-map kinmfer out