前期回顾
我们上节,做了实验,现在再来梳理几个点,之前AS1和AS234进行互联线路(R1-->R2)中,我们并没有将R2的g0/0/0接口加入到IGP协议中,然后我们在R2、3、4路由配置ISIS协议,并且将R2和R4安置在AS234的BGP环境中,R3不运行BGP协议。AS之间走EBGP,以此来模拟EBGP、IBGP、IGP之间的联系。
R1创建一条环回口路由,利用network发布到BGP,此时R1的BGP路由表中插入了一条关于该路由的最优标识,利用
BGP的通告原则1:仅将自己的最优路由发布给邻居。
R2的BGP路由表也可以查看到该路由。
R2在路由表中查看有去往该路由下一跳的唯一路由,所以该路由在R2的BGP路由表中名副其实的也是带*>的有效最优路由,符合
BGP通告原则2:通过EBGP获得的最优路由发布给所有BGP邻居。
R4于此同时也可以收到R1产生的这条路由,但是这条路由在路由表中是否是最优的?还有待商榷。
我们查看R4路由表发现BGP路由表中该路由的下一跳并不在IGP路由表中,因此它在存放时没有有效符号标识更谈不上最优,由此对外的表现就是当这条路由到R4在路由表中命中的时候,会查询该路由的下一跳,发现下一跳竟然还是10.1.12.1,查询路由表,并没有找到相关记录,下一跳不可达就无法转发。原来我们少了解了一个原则,从EBGP邻居传过来的路由传给IBGP邻居时,下一跳默认不变。为什么会出现这种情况呢,这和我们开头做的限制也有一定的关系,就是我们并没有将R2的g0/0/0接口加入到IGP协议中,如果我们把R2 g0/0/0加入到IGP协议中,那么同在IGP协议下的R4的g0/0/0就可以算出到R2g0/0/0的路由,这样就不会产生这个下一跳不可达的现象。其实在生产环境中也是如此,我们默认在EBGP的AS之间的互联口不加入IGP协议。
解决方案1:
路由不可达,我们就做一条路由让它可达,也就是在R4上将这个下一跳指向自己的g0/0/0接口配置的10.1.34.4,这样通过IBGP协议我们就可以轻松的进行路由选择。
缺陷:BGP路由一般是十万条起步,这么庞大的路由我们无法进行逐条的手工配置。
解决方案2:
我们可以利用R2这个路由,针对IBGP邻居做一条next-hop-local
[R2]bgp 234
[R2-bgp]peer 4.4.4.4 next-hop-local
该命令仅对IBGP邻居生效,将从EBGP邻居得到的路由传递给指定的IBGP邻居时,下一跳修改为自身向该IBGP邻居发送BGP报文的源地址,
再次查看R4、R5的BGP路由表,如预想的一般。
我们看R2的路由,发现虽然R4收到了R2发过来的最优路由,但是并没有向R2再次发送,这样就避免了产生环路,!!!也就是
BGP的通告原则3:通过IBGP获得的最优路由不会发布给其他的IBGP邻居
继续我们的猜想,R4通过EBGP将最优的路由传递给了它的BGP邻居。R5上现在可以从BGP路由表中查到去往1.1.1.0的路由,而且下一跳也是对的。
BGP路由传递给EBGP邻居时,下一跳自动修改为向该EBGP邻居发送BGP报文的源地址。
此时我们以为现在总可以访问R1的环回口了吧,我们进行ping命令,wac为啥不通???
我们往上查,看下R4是否可以ping通。R4此时也不可以,为什么会出现这个原因呢?
我们看它的下一跳所在路由表的路由,发现了一切
它是通过2.2.2.2转发,而2.2.2.2的路由指向了10.1.34.3,我们立即定位,知道了,R3并没有去往1.1.1.0的路由。这样很像我们之前的一个案例:路由黑洞
回顾一下
路由黑洞
在这个拓扑图中,BGP传播路由是可以跨路由器传递的,A路由器可以将路由通过EBGP传递给B,B可以通过IBGP传递给D,因为B路由器到D路由器有运行OSPF协议,路由可达,D再次通过EBGP传递给E。
但是C路由器上却没有A路由器100.0.o.o的路由,因为C路由器没有运行BGP协议。
这样就会导致E路由器在回包的时候,将100.0.o.o的路由先发送给D,D继续转发给C,C直接丢弃。这就出现了BGP的路由黑洞。最终导致R3上没有去往1.1.1.0的路由。
对的!路由黑洞了,这个时候我们会想起来,
哦哦,我们需要进行
BGP的通告原则4:BGP与IGP的同步
我们在R2上做一个同步
第一种方案,我们将BGP引入到IGP协议中,
此时我们继续测试ping 1.1.1.1 发现还是不通,
观察R4BGP的配置,发现其中有一个命令是,
undo synchronization
其实,同步功能在华为设备中一直都是关闭的状态,没有开启的命令,同步同步并不影响R4的BGP路由1.1.1.1传递给R5.
此时我们在R5上也创建一个环回口
[R5]int l0
[R5-LoopBack0]ip add 5.5.5.5 24
[R5-LoopBack0]q
[R5]bgp 5
[R5-bgp]network 5.5.5.0 24
R4:与R1 的1.1.1.0一样,利用next-hop-local 将R4发往R2的下一跳改变,
peer 2.2.2.2 next-hop-local
isis协议中引入BGP
[R4-isis-1]dis this
[V200R003C00]
isis 1
is-level level-2
network-entity 49.0004.0000.0000.0004.00
import-route bgp
向所有BGP邻居手动触发路由更新
<R4>refresh bgp all export
我们通过R5
<R5>ping -a 5.5.5.5 1.1.1.1
PING 1.1.1.1: 56 data bytes, press CTRL_C to break
Reply from 1.1.1.1: bytes=56 Sequence=1 ttl=252 time=30 ms
Reply from 1.1.1.1: bytes=56 Sequence=2 ttl=252 time=50 ms
Reply from 1.1.1.1: bytes=56 Sequence=3 ttl=252 time=30 ms
Reply from 1.1.1.1: bytes=56 Sequence=4 ttl=252 time=40 ms
Reply from 1.1.1.1: bytes=56 Sequence=5 ttl=252 time=40 ms
总结:
1、同步功能只能通过bgp路由黑洞检测机制,但是并不是解决路由黑洞。
2、这种方法目前已经被淘汰,如果BGP路由表产生振荡,会对IGP造成影响。
第二种方案:
我们将R2、R4上引入配置IGP配置取消
[R2-isis-1]undo import-route bgp
R4同
[R2]bgp 234
[R2-bgp]peer 3.3.3.3 as-number 234
[R2-bgp]peer 3.3.3.3 connect-interface LoopBack 0
[R2-bgp]peer 3.3.3.3 next-hop-l
R3\ R4自己配
三条命令缺一不可
总结:
只要解决路由黑洞问题,BGP同步检查功能开启或者关闭无足轻重。
我们再做个小测试,我们现在可以通过1.1.1.1 访问到5.5.5.5,
是因为在几个BGP AS中,路由是通的,但是1.1.1.1 可以访问4.4.4.4 么?
测试之后 发现不可以。为什么呢?因为在BGP AS:234中4.4.4.4并没有发布出去
所以BGP路由访问的基本逻辑,你要是想别人能访问你,你就要把这条路由发布出去,然后再避免路由黑洞。我们发布出去,ping 4.4.4.4 1.1.1.1 还是不通,我们就需要自己再思考思考了