定义
BGP叫做边界(AS的边界)网关协议
AS:AS是指由同一个技术管理机构管理(企业,ISP运营商),使用统一选路策略的一些路由器的集合。
IGP:AS内部网关协议,实现AS内部的互联互通
EGP:AS互联互通的一种路由协议
AS号:取值范围 1-65535
64512-65535 是私有AS号,用大型企业内部进行AS的复制
1-64511 是公有AS号,需要为用户/企业提供互联网介入服务时分配的
AS号 老的长度2个字节,16bit
AS号 新的长度4个字节,32bit
IGP 直连邻居之间传递路由信息,逐跳(逐路由)的传递路由
BGP是一种工作在应用层的协议,只要BGP邻居能够建立,BGP可以跨越多跳路由器建立邻居关系
BGP的路由属性是人为设计的,BGP的路由属性是对BGP路由进一步的描述
作用:实现BGP路由的控制,防环,选路,管理
BGP邻居发现
1、BGP是一种基于TCP协议的应用层路由协议,所以邻居不会自动建立,需要手动配置。
2、BGP是一种单播通信,DIP要事先知道
3、BGP使用TCP的179端口进行工作
4、BGP建立邻居的地址要保证连通性(两个地址之间的路由要通)
BGP发现邻居时需要先启动BGP的一端,先发起TCP连接,RTB先启动BGP协议,RTB 使用随机端口号向RTA的179端口发起TCP连接。
BGP邻居类型
EBGP:运行在不同AS之间的BGP路由器建立的邻居关系为EBGP邻居关系
IBGP:运行在同一个AS之间的BGP路由器建立的邻居关系为IBGP邻居关系
EBGP的配置步骤
1、直连物理接口配置EBGP
实验拓扑
ip配置不再赘述
配置BGP的AS
[R1]BGP 1
[R1-bgp]peer 10.1.12.2 as-number 2
源地址默认情况下为去往邻居地址路由的出接口IP
[R2]bgp 2
[R2-bgp]peer 10.1.12.1 as-number 1
我们在进行BGP配置的时候需要注意指定的邻居地址为本端向该邻居发送BGP报文的目的地址,源地址默认情况下为去往邻居地址路由的出接口IP
我们继续实验:
<R1>dis bgp peer
BGP local router ID : 10.1.12.1##继承全局的router id
Local AS number : 1 ##用来描述自己所在的AS号
Total number of peers : 1 #用来描述邻居的数量 Peers in established state : 1#用来描述能正常建立邻居关系的数量
Peer(邻居ip) V (协议版本号)AS(邻居bgpAS号) MsgRcvd (从邻居那边收到的BGP报文的数量) MsgSent(发送给邻居BGP报文的数量) OutQ(在发送给邻居的BGP出接口队列上有多少BGP,不为0,说明BGP相关的链路有拥塞) Up/Down (状态) State PrefRcv(表示从邻居那边收到BGP路由的数量)
10.1.12.2 4 2 19 19 0 00:17:47(邻居建立起来的时间) Established(只有这种的状态才是best,其他的都有问题)
0(表示从邻居那边收到路由的数量为0)
<R1>dis
<R1>display rou
<R1>display router i
<R1>display router id
RouterID:10.1.12.1
继承全局的router id
2、用lookback接口配置EBGP
背景:
继续实验:
为了解决单条BGP线路不稳定,我们新建一条物理链路作为备选路线,并配置如下
ip配置完成之后,我们将其配置入BGP进程中。
[R1]bgp 1
[R1-bgp]peer 10.1.21.2 as 2
R2操作相同
此时我们查询bgp 邻居
这种i情况看似稳定,但是我们继续实验就会发现问题
我们在R1引入一条静态路由,
[R1]ip route-static 192.168.1.0 24 NULL 0
[R1]bgp 1
[R1-bgp]import-route st
[R1-bgp]import-route static
[R1-bgp]q
[R1]dis bgp rou
[R1]dis bgp routing-table
BGP Local router ID is 10.1.12.1
Status codes: * - valid, > - best, d - damped,
h - history, i - internal, s - suppressed, S - Stale
Origin : i - IGP, e - EGP, ? - incomplete
Total Number of Routes: 1
Network NextHop MED LocPrf PrefVal Path/Ogn
*> 192.168.1.0 0.0.0.0 0 0 ?
我们从R2上观察bgp 的路由表
从上图我们可以看到针对一条路由,它传递了两次,一次是上边的路由线路,一次是下边的路由线路。这样就会增加协议的负担,因为BGP的路由都是十万多条数据起步,增加资源负担,~占用。
所以这种方法是不建议的。
因此我们可以采用环回口配置EBGP邻居,因为不管两条链路中的任何一条都可以通过环回口通信。在保证可靠性的同时又可以节省资源占用。
做法
1.各自起环回口
[R1]int lo 0
[R1-LoopBack0]ip add 1.1.1.1 32
R2同
[R2]int l0
[R2-LoopBack0]ip add 2.2.2.2 32
我们测试一下连通性:
一定是不通的
现在我们删掉R2设备上BGP相关的所有配置,(现网不要用,小心蹲号子)
[R1]undo bgp 1
Warning: All BGP configurations will be deleted. Continue? [Y/N]: y
R2同上
配置路由:
[R1]ip route-static 2.2.2.2 32 10.1.12.2
[R1]ip route-static 2.2.2.2 32 10.1.21.2
R2
[R2]ip route-static 1.1.1.1 32 10.1.12.1
[R2]ip route-static 1.1.1.1 32 10.1.21.1
路由ping通之后我们就可以建立BGP邻居了
建立
[R1]bgp 1
[R1-bgp]router-id 1.1.1.1
[R1-bgp]peer 2.2.2.2 as
[R1-bgp]peer 2.2.2.2 as-number 2
[R1-bgp]dis ip rout
[R1-bgp]dis ip routing-table 2.2.2.2
[ R2]bgp 2
[R2-bgp]router-id 2.2.2.2
[R2-bgp]peer 1.1.1.1 as
[R2-bgp]peer 1.1.1.1 as-number 1
[R2-bgp]
这里需要注意一下,我们查看路由表发现,他还是会用物理口作为源地址发起连接,至于是哪个物理口,我们需要看负载分担的情况。
此时我们的目的很明显,就是通过1.1.1.1作为源地址向2.2.2.2发送BGP报文,但是此时的R1的1.1.1.1是环回口静态路由,默认用的是出接口的地址作为源地址进行通信。
因此我们需要再进行以下操作
BGP进程下
[R1-bgp]peer 2.2.2.2 connect-interface LoopBack 0
[R2-bgp]peer 1.1.1.1 connect-interface LoopBack 0
这条命令表示:向指定邻居发送BGP报文的地址为指定loopback接口的ip地址
我们发现此时过了很久双方邻居关系还是没有建立起来。
埋雷
这是因为从环回口到路由,中间是进过一跳的,从1.1.1.1的环回口到对端路由器接口后TTL-1=0,还需要再往本路由的环回口作为下一跳继续发送,但是此时TTL=0,直接丢弃,导致邻居关系不建立。
ps: 在现实网络环境中,由于防止单一线路脆弱,路由器选路的方式有很多条,我们可以把TTL值设置的大一点,让路由经过很多条依然可以使得在到达对端BGP路由器接口时TTL>=1.
默认情况下,EBGP邻居之间发送BGP报文的TTL=1,即强制要求EBGP邻居直连。
修改BGP进程下环回口ip的TTL值
[R1]bgp 1
[R1-bgp]peer 2.2.2.2 eb
[R1-bgp]peer 2.2.2.2 ebgp-max-hop 10
R2同
目的:当EBGP邻居之间存在多跳时,指定向EBGP邻居发送BGP报文的TTL值,仅在EBGP邻居之间使用,IBGP邻居默认TTL=255
效果图
因为我们是在bgp引入静态路由,所以也会把2.2.2.2这条路由存入BGP路由表,现在我们直接发布路由,
[R1-bgp]undo import-route static
[R1-bgp]network 192.168.1.0 24
此时我们再次从R2查看BGP的路由表
如果我们需要在同一个AS号内用loopback接口配置IBGP,我们就只需要配置两条命令
bgp 1
peer 2.2.2.2 as 1
peer 2.2.2.2 connect-interface LoopBack 0
这个时候就不需要进行TTL值的配置,因为在IBGP中邻居默认的TTL值255
bgp 1
peer 1.1.1.1 as 1
peer 1.1.1.1 connect-interface LoopBack 0