BGP
总结
一:
BGP
邻居
1.
BGP
邻居状态机:
l
Connect
:
触发事件:激活
BGP
,使用
neighbor
命令指邻居
动作:通过
TCP179
端口发起连接。
l
Open sent
:
触发事件:连接成功建立(通过
tcp179
端口完成三次握手)
动作
1
:发送
open
消息,并等待对方的
open
消息
动作
2
:核对对方的
open
消息内容(
AS
号,
RID
,
BGP
版本号)
l
Open confirm
:
触发事件:
open
消息核对成功
动作:发送
keepalive
消息,并等待对方
keepalive
消息
l
Establish
:
触发事件:收到对方的
keepalive
消息(
keepalive
消息默认定期发送,用于维持邻居关系)
动作:发送
update
消息
l
Idle
:
触发事件
1
:任何一种状态下发现异常,则发送
notification
消息中断连接
触发事件
2
:收到对方的
notification
消息
动作:空闲,等待连接
提出疑问
:(
1
)当两个BGP路由器之间隔着几个路由器建立邻居关系的时候,他会根据neighbor所指邻居的IP地址在路由表查找到达此邻居的应该怎么走,然后根据路由转发原则,去发送用于建立TCP连接的消息,假设到达邻居有多条路径,那么将先看AD值,AD小的优选,AD一样则看cost值,cost值小的优选,如果两个都一样的话会怎么样呢??
(
2
)那么此时他向邻居发送更新是不是也会有多条呢?
解决疑问
:我么通过实验来研究这个问题:
对于问题一:
实验环境如下:
有两个路由器,分别是R1和R2,各自有一个loopback口,IP地址分别是
1.1.1.1 和 2.2.2.2,通过两个串行口相连,即cost值一样,分别是S0和S1
两个串行口的网段分别是11.0.0.0/24和22.0.0.0/24
在R1上写两条静态路由
1.1.1.1 [1/0] via 22.0.0.2, Serial1
[1/0] via 11.0.0.2, Serial0
情况一:R1运行BGP,R2不运行
R1输入
nei 1.1.1.1 remote 12
deb ip bgp
deb信息如下:
*Jan 28 14:28:48.483: BGP: 2.2.2.2 went from Idle to Active
*Jan 28 14:28:48.483: BGP: 2.2.2.2 open active, delay 7687ms
R1(config-router)#
*Jan 28 14:28:56.171: BGP: 2.2.2.2 open active, local address 22.0.0.1
*Jan 28 14:28:56.195: BGP: 2.2.2.2 open failed: Connection refused by remote host
R1(config-router)#
*Jan 28 14:30:56.195: BGP: 2.2.2.2 open active, local address 22.0.0.1
*Jan 28 14:30:56.223: BGP: 2.2.2.2 open failed: Connection refused by remote host
观察deb信息,发现并没有在两个接口发送open消息
猜想:BGP建邻居关系的时候,会根据所指邻居的IP地址来查看路由表,以便确定
如何去发送用于建立TCP连接的消息。
路由器会按照从上至下的顺序查找,当查找到了一个匹配的的路由条目后,就停止查找
并按该条目去发送用于建立TCP连接的消息
为验证猜想,将静态路由表改成如下:
1.1.1.1 [1/0] via 11.0.0.2, Serial0
[1/0] via 22.0.0.2, Serial1
此时deb 的显示信息为
*Jan 28 15:28:48.483: BGP: 2.2.2.2 went from Idle to Active
*Jan 28 15:28:48.483: BGP: 2.2.2.2 open active, delay 7687ms
R1(config-router)#
*Jan 28 15:28:56.171: BGP: 2.2.2.2 open active, local address 11.0.0.1
*Jan 28 15:28:56.195: BGP: 2.2.2.2 open failed: Connection refused by remote host
R1(config-router)#
*Jan 28 15:30:56.195: BGP: 2.2.2.2 open active, local address 11.0.0.1
*Jan 28 15:30:56.223: BGP: 2.2.2.2 open failed: Connection refused by remote host
猜想成立
情况二:R1运行BGP,R2不运行
在R1上写入如下两条静态路由
S
2.2.2.0 [1/0] via 10.0.0.2, FastEthernet0/0
[1/0] via 12.0.0.2, Serial1/1
即R1和R2通过两个不同类型的接口相连,参照情况一的方法进行验证,发现路由器按照从上至下的顺序查找,当查找到了一个匹配的的路由条目后,就停止查找
并按该条目去发送用于建立TCP连接的消息
情况三:两路由器都运行BGP
此时若在R1上观察deb 信息,会发现,R1既有可能从S0口发送open消息,又有可能从
S1口发送open 消息,至于究竟从那个接口发送,要取决于在哪个接口受到了R2发送的用于建立TCP连接的消息,则从那个接口回应
对于问题二
,分为两种情况:
l
两个路由器通过两个接口相连,且分别通过两个物理接口建立邻居关系
首先
R2
输入
sh ip b s
,输出结果如下:
Neighbor V AS MsgRcvd MsgSent TblVer InQ OutQ Up/Down State/PfxRcd
10.0.0
.1 4 12 7 6 2 0 0 00:02:45 1
12.0.0
.1 4 12 7 6 2 0 0 00:02:59 1
R1
上宣告了
1.1.1
.1/32
之后,
R2
再输入命令
sh ip b
,输出结果如下:
R2(config-router)#do sh ip b
BGP table version is 2, 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
* i1.1.1.1/32 12.0.0.1 0 100 0 i
*>i 10.0.0.1 0 100 0 i
这里,
R1
向两条路径都发送了更新信息,
R2
收到了两条更新信息后,会按
11
条选路由原则去进行最优路径的选举
注意:
BGP
是通过
RID
来唯一标识一个邻居的,而这里通过
sh ip b s
命令得到的输出结果所显示的两个“
Neighbor
”实际上是表示
RID
为
1.1.1
.1
的邻居通过两条不同的路径和我建立了邻居关系,并且所用接口的
IP
地址是
10.0.0.1
和
12.0.0.1
,通过如下命令可以查看邻居的
RID
R1(config-router)#do sh ip b nei 12.0.0.2
BGP neighbor is 12.0.0.2, remote AS 12, internal link
BGP version 4, remote router ID 2.2.2.2
BGP state = Established, up for 00:00:08
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。(此处省略
N 1
行)
l
两个路由器通过
loopback
口建立邻居,在这种情况下,则要参照问题一中所讨论的情况,选举其中的一条路径进行发送。
R2(config)#do sh ip b s
Neighbor V AS MsgRcvd MsgSent TblVer InQ OutQ Up/Down
1.1.1
.1 4 12 7 6 3 0 0 00:02:51
R2(config)#do sh ip b
Network Next Hop Metric LocPrf Weight Path
r>i1.1.1.1/32 1.1.1.1 0 100 0 i
2
.邻居建立的几点注意:
l
邻居之间必须互指
neighbor
l
当
ibgp
邻居是隔着几个路由器建立时,要确定所指邻居的
IP
地址必须在路由表中可达。
l
当
ebgp
邻居建立时,若其所指邻居的
IP
地址并非是处于自己的直连网段(如通过
loopback
口建立邻居),则必须要用如下命令
Neighbor 1.1.1.1 ebgp-multihop *
(
*
代表跳数)
提出疑问
:
ebgp-multihop
后跟的跳数到底有何规律?
解决疑问
:通过实验验证很容易得出这样一个结论:当两个路由器试图建立
ebgp
邻居时,若非是通过直连网段进行建立的话(通过直连网段进行建立不需要配置
ebgp-multihop
命令),则后跟跳数和路由器的数量相同,举个例子说就是,若两个路由器隔者一个路由器建立
ebgp
邻居的话,则无论是通过物理接口还是
loopback
口,后跟跳数都是
3
。
二:
BGP
防环和防黑洞机制
1.
IBGP
的水平分割原则
:从
IBGP
邻居所收到的路由信息,不会传递给其它的
IBGP
邻居,但可以传递给
EBGP
邻居,即
IBGP
的防环机制
注意
:若无此机制,那么当三个路由器两两相连,并建立了
IBGP
邻居之时,那么此时其中一个路由器发送的更新将在三个路由器之间无限循环。
2.
EBGP
防环机制
:当所接受的更新信息中包含自己所在区域的
AS
号,则拒绝接受。
3.
IBGP
synchronization
(
IBGP
同步)
的
IBGP
路由信息,也必须从
IGP
路由协议中学习到,也就是
IBGP
的防黑洞机制。
注意
:
不少路由器的
IOS
默认关闭此特性,也用命令
no synchronization
手工关闭。
三:
BGP
表和
BGP
的更新
:
1.
BGP
更新:
l
BGP
中的
network
命令
:
BGP
路由器通过
network
命令来宣告路由信息,这里要注意的是,
BGP
中的
network
命令并不存在接口激活的概念,当路由器
network
了某个网段后,
BGP
会首先检查路由表,如果发现路由表中有该网段的信息(需要严格匹配,包括掩码),则会向所有邻居发送此条更新,这样的好处是,
BGP
路由器宣告的路由信息将不必只局限于直连接口,只要是路由表中有的,都可以被宣告。
举例说明
:
R1(config-router)#do sh ip rou
1.0.0.0/32 is subnetted, 1 subnets
C 1.1.1.1 is directly connected, Loopback0
12.0.0.0/24 is subnetted, 1 subnets
C 12.0.0.0 is directly connected, Serial1/1
这时候想宣告
1.1.1
.1
,则应当
network 1.1.1.1 mask 255.255.255.255
l
BGP
路由器转发更新的原则
:
1.
路由器从
IBGP
邻居学到的路由信息不会转发给自己其他的
IBGP
邻居,但是会转发给自己的
EBGP
邻居
2.
只有当自己收到的更新信息在
BGP
表中被优化了以后,才会被发送给其他的邻居
Clear ip bgp * soft out
命令
当在路由器上输入此命令时,路由器将会将其全部已优化的
BGP
条目向其所有邻居发送一遍
提出疑问
:此时接收到更新的邻居路由器,会像
OSPF
那样,选择覆盖原先老的条目吗?
解决疑问
:我们通过实验来验证这个问题
实验环境简述如下
:
R1
与
R2
相连并建立
IBGP
邻居,
R2
与
R3
相连并建立
IBGP
邻居,
R1
上宣告
1.1.1
.1/32
,待
R2
和
R3
学到此条目后,在
R2
上输入
deb ip bgp ev
deb ip bgp update
此时在
R1
上输入
Clear ip bgp * soft out
,
R2
上的
deb
输出信息为:
BGP(0): 12.0.0.1 rcvd UPDATE w/ attr: nexthop 12.0.0.1, origin i, metric 0, path 1
BGP(0): 12.0.0.1 rcvd 1.1.1.1/32...duplicate ignored
通过
deb
信息我们可以得知,
R2
会认为
R1
发给他了一条重复的路由条目,而将其忽略掉
而事实上,在
BGP
表中,
BGP
条目是不存在超时这个概念的,只有在如下两种情况下会让
BGP
表中的条目被清除:
告诉“我”这条
BGP
条目的邻居路由器“
down
”掉,于是“我”会将我”全部从该邻居路由器上学到的条目给清除
接收到了一条
BGP
条目的清除消息,这种消息会在两种情况下出现
情况一
:环境简述如下:
R1
与R2,R2与R3建立了BGP邻居关系,R1宣告了一条1.1.1.1/32,在某一时期,R1因为故障而“down”掉,R2会首先将1.1.1.1/32给清除,然后会发送一条清除消息给R3,R3收到后,也会将该条目给清除
情况二
:环境简述如下:
R1
与R2立了BGP邻居关系,R1宣告了一条1.1.1.1/32,在某一时期,R1发现在自己与1.1.1.1/32的连通性,于是R1会发送一个清除消息给R2,R2收到后便会将该条目清除
注意:
在
BGP damping
中,可能会出现符合上诉两种
BGP
条目清除的条件,但却依旧在
BGP
表中保留的现象,详见后面的
BGP damping
讨论
2
.
BGP
表:
l
路由器将会把从邻居那里收到的更新信息先写入
BGP
表,再来判断是否要写入路由表(后面会讨论)
l
先来看几个
BGP
表的示例:
拓扑简述如下:
R1
和
R2
建立
EBGP
邻居,
R2
和
R3
建立
IBGP
邻居,
R1
宣告直连网段
1.1.1
.1/32
首先
R2
看
bgp
表:
R2(config-router)#do sh ip b
BGP table version is 2, 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.1/32 12.0.0.1 0 0 1 i
再在
R3
上看
BGP
表:
R3(config-router)#do sh ip b
BGP table version is 2, local router ID is 3.3.3.3
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.1/32 23.0.0.2 0 100 0 1 i
我们可以看到,
Status codes
在传递过程中是会变的,而
Origin codes
在传递过程却不会发生改变。
提出疑问:
在
R1
上,
1.1.1
.1/3
明明是
BGP
通过
network
引入的,但是为什么
Origin codes
却是显示的“
i
”,也就是通过
IGP
引入?
解决疑问:
在
BGP
看来,路由表中除了通过
BGP
学到的条目以外,其他的全都是属于
IGP
路由条目,当
R1
通过
network
宣告直连网段的时候,在
BGP
看来,该直连网段是自己从
IGP
路由条目中宣告进
BGP
的,所以
Origin codes
会显示为“
i
”
无法写入
BGP
表和无法写入路由表的几种情况
:
1.
无法被写入
BGP
表
实验环境如下:
R1
和
R2
通过
E0
口相连,并且各自都有一个
IP
地址为
1.1.1
.1/32
的环回口,两路由器运行
BGP
,顺利建立邻居关系。
在
R1
上打开如下
debug
命令:
deb ip bgp event
deb ip bgp updata
在
R2
宣告
1.1.1
.1/32
后,在
R1
上输入
sh ip b
,发现
bgp
表中没有
1.1.1.1/32
此时
R1
的
deb
输出信息为:
BGP: 12.0.0.1 announced my interface 1.1.1.1/32 back to me - ignored
由此可见原因是R1认为1.1.1.1/32是我自己的一个直连接口的IP地址,而R2却声称自己可达,这显然是不合理的,并且很有可能是一个环路,于是忽略此更新信息,拒绝写入BGP表。
且几分钟之后,R1会断掉与R2的邻居关系,deb 信心显示如下:
BGP: 12.0.0.2 reset due to BGP Notification sent
BGP-5-ADJCHANGE: neighbor 12.0.0.2 Down BGP Notification sent
这实际上是
BGP
为了避免潜在的环路所做的预防措施
另附
:此条相关内容的讨论参见“
IP
,子网划分,精确匹配,
VLSM
总结
.doc
”的第三页
2.
无法被写入路由表
此种情况一般是因为路由表中已有一条
AD
值比
BGP
更低的路由条目,此时在
BGP
表中,该路由条路的
Status codes
将会被标记为
r