该文档涉及的命令有:
neighbor [ip-address|peer-group-name] advertise-map [route-map-name1] non-exist-map [route-map-name2]
neighbor [ip-address|peer-group-name] default-originate
neighbor [ip-address|peer-group-name] default-originate route-map xxx
3-6-1 neighbor [ip-address|peer-group-name] advertise-map [route-map-name1] non-exist-map [route-map-name2]
这个命令实际上就是我们常说的条件路由。
如果强制性翻译成中文,比如下面的命令:
neighbor 172.17.1.2 advertise-map secondery non-exist-map primary
对于邻居172.17.1.2,如果route-map通告的路由primary已经不存在于BGP表中了,那么将会通告secondery route-map给172.17.1.2
Advertise-map的作用是:如果主要前缀在BGP表中显身,bgp路由器便不得将次要前缀通告给bgp对等体,要是主要前缀从bgp表中消失,那么便通告次要前缀。
在这个拓扑中,R1的配置为:
interface Loopback0
ip address 1.1.1.1 255.255.255.0
!
interface Loopback1
ip address 2.2.2.2 255.255.255.0
!
interface FastEthernet0/0
ip address 172.17.1.1 255.255.255.0
duplex full
speed auto
!
router bgp 100
no synchronization
bgp log-neighbor-changes
network 1.1.1.0 mask 255.255.255.0
network 2.2.2.0 mask 255.255.255.0
neighbor 172.17.1.2 remote-as 100
no auto-summary
!
no ip http server
no ip http secure-server
!
R2的配置为:
interface FastEthernet0/0
ip address 172.17.1.2 255.255.255.0
duplex full
speed auto
!
router bgp 100
no synchronization
bgp log-neighbor-changes
neighbor 172.17.1.1 remote-as 100
no auto-summary
!
最后在R2上面看到的结果是2条路由都可以通告过来:
现在把需求稍加修改:
对于R2来说依然是简单的设置对端邻居的bgp配置,不做任何修改。对于R1来说需要在bgp 100下面设置一条条件通告:
最后我们可以一步一步来看:
在R1上面,show ip bgp,1.1.1.1和2.2.2.2这两个路由都存在:
在R2上面,只学到1.1.1.0/24的主要路由:
这里可以看到,虽然R1上面两个路由都存在,但是因为1.1.1.0/24这个主用前缀是在R1的bgp表中的,所以R1将只会通告1.1.1.0/24的路由给R2.
R2也只能学到1.1.1.0这个路由,并且对于R2来说,2.2.2.0/24是不可知的。
所以不能ping通。
下面将在R1上面将interface loopback 0 : 1.1.1.1/24 shutdown.
那么R1因为1.1.1.0/24在bgp表中消失了,所以应该立即将2.2.2.0/24通告给R2.
最后在R2上面,我们可以看到,1.1.1.0/24已经没有了,现在学到的是2.2.2.0/24的路由信息从R1上面:
这就是今天说明的条件路由通告的用法。
3-6-2 neighbor [ip-address|peer-group-name] default-originate
关于这个命令,很简单。就是通告默认路由的东东。
但是这个命令会产生一个问题,轻易cisco是不推荐使用该命令的。
原因就是:
虽然使用default-originate形式的neighbor通告给指定邻居默认路由,通过bgp来通告默认路由,但是,在默认路由所指的网关失效的情况下,路由器也会打肿脸充胖子,将默认路由通告过去,最后形成路由黑洞,数据包都不知道丢到哪里去了。
因为这个概念很简单,所以带过就是.重点是和命令default-originate information 对比记忆。
R2的配置:(在R2上面我用null0作为下一跳来模拟一个默认路由)
router bgp 100
no synchronization
bgp log-neighbor-changes
neighbor 172.17.1.1 remote-as 100
neighbor 172.17.1.1 default-originate
no auto-summary
!
ip route 0.0.0.0 0.0.0.0 Null0
那么R1自然而然的就学到了这条路由了:
这里我做一个列表来比较一下两个命令的不同点:
命令 | default-orginate information | neighbor x.x.x.x default-originate |
配置模式 | 配置在BGP进程下面,针对于所有邻居 | 配置于BGP进程下面,针对于某一个邻居 |
产生条件 | 1,创建静态默认路由 2,将静态默认路由重分发进bgp进程 3,设置BGP命令default-information originate | 1,创建静态路由 2, 在BGP进程下面配置命令neighbor x.x.x.x default-originate 3, 不需要重分发静态默认路由 |
弊端/好处 | 该命令的好处就是,如果默认的静态路由因为接口down了,或者因为对端不可达接口被keepalive down下去,那么本地bgp是不会发送默认路由到对端的。 | 打肿脸冲胖子,只要配置里面有默认路由,不管是否写到核心路由表中,那么一定会通告给指定邻居, 有可能造成路由黑洞. |
3-6-3 neighbor [ip-address|peer-group-name] default-originate route-map [name]
前面说过的命令:neighbor x.x.x.x default-originate
这个命令是只要创建一条静态路由,然后在bgp进程下面写neighbor x.x.x.x default-originate就可以将默认路由通告给BGP邻居。但是有一个问题这里:
如果,在本地的出接口是出于UP的状态,那么那条默认路由就一定会写在核心路由表中,如果核心路由表有这条路由,bgp就一定会通告给对端的邻居。
但是如果那条默认路由已经不可达对端了呢?
这个时候路由器还是傻乎乎的通告默认路由给对端,最后形成了路由黑洞。数据包不知道甩到哪里去了已经。
为了解决这个问题,那么现在路由器要变得更加智能一些。
比如说有一条默认路由或者是静态路由要达到网段3.3.3.0/24的时候,首先本地路由器会去见车3.3.3.0的网络是否可达,如果可达,才会传递给邻居去。如果不可达的时候,邻居是不会从本地学到这条默认路由的,这,也就解决了路由黑洞的问题。
首先把环境搭建起来.
R2的配置为:
router bgp 100
no synchronization
bgp log-neighbor-changes
neighbor 172.17.1.1 remote-as 100
neighbor 172.17.1.1 default-originate route-map tanzhen
no auto-summary
!
ip route 0.0.0.0 0.0.0.0 2.1.1.2
!
access-list 1 permit 2.1.1.0 0.0.0.255
!
route-map tanzhen permit 10
match ip address 1
在R3上面直接就是一个默认路由指向R2. ip route 0.0.0.0 0.0.0.0 2.1.1.1
好了,现在来验证一下:
当bgp邻居已经建立好以后,并且R2的接口F0/1是up的情况,而且对端也是可达的情况,那么这个时候,R1应该可以学到一条从R2通告过来的默认路由,下一跳是指向R2的172.17.1.2作为出口的,意思是R2才是整个AS的出口网关.
如果这个时候把R2的接口F0/1 给down掉。
最后在R1上面那条默认路由就没有了。因为R2通告过来了。
这个就是有条件性的选择通告与否的应用。
当目的网段可达的时候,就通告,当目的网段不可达的时候,马上撤回以前通告出去的默认路由。