该文档涉及的命令有:

distance [admin-distance] [ip-source-address] [ip-adress-mask]

distance bgp external internal local

neighbor [ip-address] distribute-list ACL in

neighbor [ip-address] distribute-list ACL out

主要这里会说到关于扩展方位列表如何进行路由的过滤。

access-list 100 permit ip 182.16.0.0 0.0.3.255 255.255.252.0 0.0.0.0的语法到底是什么?

关于路由过滤方式有很多,除了用扩展访问列表那么别扭的方式以外,前缀列表ip prefix是一个很好用的东西。或者是终极武器route-map....

关于管理距离,我们都知道.cisco路由器会使用管理距离来选择最优的路由。

管理距离值越小,路由的优先级就越高.

03-5 BGP 管理距离AD/路由过滤_CCIE

这就是管理距离,同样在路由表中有EBGP和OSPF,那么EBGP路由优先,因为管理距离小。

关于修改管理距离的命令,相当灵活,而且很强大。

3-5-1 distance [admin-distance] [ip-source-address] [ip-adress-mask]

03-5 BGP 管理距离AD/路由过滤_CCNP_02

在这个拓扑图中,R1上面有两个loopback接口:

loopback 0 : 10.10.10.10/24

loopback 1 : 11.11.11.11/24

R1R2建立EBGP邻居将两个接口networkBGP进程1那么R1会通过EBGP传递2条路由到R2,管理距离为20.

R3上面有一个loopback接口

loopback0: 30.30.30.30/24

R3上面将该接口networkbgp 2进程中那么R3会通过IBGP邻居传递给R2,最后默认的管理距离是200.

R2上面首先先检查一下结果是否是默认情况:

03-5 BGP 管理距离AD/路由过滤_CCIE_03

这个时候,在一个拓扑图中有2个需求:

从R3邻居传递过来的路由AD=45.

从R1邻居传递过来的10.10.10.10/24路由管理距离为55.

首先来了解一下配置在R2上面,注意关于distance命令用了以后只是本地生效的。这个一定要注意,这个属性是不会被传递出去的。也就是说,如果R2收到。了10.10.10.10的路由的AD为55,那么传递给R3的时候AD仍然是200.

本地有效。

在R2上面的配置是:

router bgp 2

no synchronization

bgp log-neighbor-changes

neighbor 1.1.1.1 remote-as 1

neighbor 2.1.1.2 remote-as 2

neighbor 2.1.1.2 next-hop-self

distance 45 2.1.1.2 0.0.0.0//邻居2.1.1.2通告过来的所有路由的管理距离在本地都为45.

distance 55 1.1.1.1 0.0.0.0 1 //邻居1.1.1.1通告过来的路由10.10.10.0/24的管理距离在本地为55.

no auto-summary

!

access-list 1 permit 10.10.10.0 0.0.0.255

最后来看看结果在R2上面:

03-5 BGP 管理距离AD/路由过滤_管理距离_04

最后来总结一下这个命令的用法.

distance [修改后的AD] [邻居的IP地址]

我先犯了一个错误我在想如果R2想要把10.10.10.10/24的路由加上AD 50,我在R2上面用的命令是

distance 50 10.10.10.10

实际上最后一看show ip route bgp,管理距离任然是20EBGP通告过来的没有改变。然后才看清楚这个命令的用法:

使用掩码0.0.0.0,意在匹配IP地址的所有32位掩码.如果在本地要对所有的bgp邻居修改相同的AD,那么可以用0.0.0.0 255.255.255.255

当要修改接收自特定邻居的具体路由的管理距离的时候需要和access-list配合使用。意思是从哪个邻居接收过来的某条路由的AD需要修改。

如果要对某一个邻居通告过来的所有的路由都修改AD的话那么直接用命令distance 100 x.x.x.x 0.0.0.0就可以了。

3-5-2 distance bgp external internal local

该命令的主要功能是修改外部,内部以及本机bgp路由的管理距离。

external:通过EBGP邻居学到的路由.

internal:通过IBGP邻居学到的路由

local:由aggregate-address命令导入的bgp路由表.

默认为:EBGP=20, IBGP=200,Local=200.

经过试验验证,该命令依然是本地有效的,而且和distance [X] 邻居IP 掩码 更为强大和笼统。如果在bgp进程下面有很多邻居,只想笼统的指定EBGP为多少,IBGP为多少的话,这条命令更为实用。

03-5 BGP 管理距离AD/路由过滤_管理距离_05

首先看看R2的配置:

03-5 BGP 管理距离AD/路由过滤_管理距离_06

最后在R2上面结果是:

03-5 BGP 管理距离AD/路由过滤_CCNP_07

总结:

关于修改AD管理距离,一直都是本地有效的概念,传递到其他的路由器还是按照默认的进行传递,IBGP=200,EBGP=20.

两个命令可以很好的做互补:

distance [admin-distance] [ip-source-address] [ip-adress-mask]

distance bgp external internal local

如果想仅仅针对某个邻居的某条路由在本地修改AD,那么可以用distance [admin-distance] [ip-source-address] [ip-adress-mask]加上访问列表的方式进行处理。

如果想仅仅针对某个邻居的所有路由,还是用命令distance [admin-distance] [ip-source-address] [ip-adress-mask]。

如果只是想粗略的区分,IBGP/EBGP/local的话,那么可以用命令distance bgp external internal local.就可以笼统的实现按照邻居类型来全部设置AD.

3-5-3 路由过滤 neighbor [ip-address] distribute-list ACL in

Case 1: 对于来自邻居通告的路由阻挡其中的一条,其他的放行.

用途:过滤接收自特定的BGP邻居的路由更新,只能针对每个邻居应用一个分发列表。对IBGP和EBGP邻居来说,入站分发列表所起的作用相同。

03-5 BGP 管理距离AD/路由过滤_路由过滤_08

在R1上面创建4个loopback接口,然后将4个loopback接口都network到BGP 100进程中。

R1会通告给R2 四个bgp路由1/2/3/4,在R2上面通过设置路由过滤指定2.2.2.2/32的掩码不能宣告过来。

最后在R2上面只能学习到R1传递过来的三条路由1.1.1.1/3.3.3.3/4.4.4.4.

下面是R2的配置:

03-5 BGP 管理距离AD/路由过滤_BGP_09

最后在R2上面看看学习到的bgp路由呢?

03-5 BGP 管理距离AD/路由过滤_CCNP_10

这里show ip bgp summary可以看到,只从对端R1收到了3条路由.真的是这样的吗?我认为不是这样的。而是本地的distribute in把2.2.2.2拒绝掉了,最后只是成功的写入3条路由到bgp路由表。本来distribute in就是一个本地策略。是本地有效的.

要想看看是否是这样,简单,在R1上面打开debug bgp updates out,然后把Interface FE0/0 shutdown,然后no shutdown就可以进行验证了。

正常情况下,R1应该会把四条路由都传递给对端邻居:

03-5 BGP 管理距离AD/路由过滤_路由过滤_11

这里可以看到,我打开了debug ip bgp updates out在R1上面,然后将链路接口FE0/0 shutdown,no shutdown,当bgp邻居建立起来以后,bgp

就会通告路由给对端,这里我们是可以看到R1确实是将2.2.2.2通告给R2了的。

所以,验证完毕,distribute in是一个本地行为,仅本地有效,会接受到对端通告过来的所有路由信息,然后在本地进行过滤。

Case 2: 对于来自邻居通告的路由,只放行其中的汇总路由,阻塞其他所有的明细路由。

扩展访问列表,在通常情况下,只能对数据转发层面的东西进行控制,而不能对路由进行控制。

BGP4 命令与配置手册上面,光写了该访问列表的表达式,没有做任何讲解。

access-list 100 permit ip 182.16.0.0 0.0.3.255 255.255.252.0 0.0.0.0

|目的网段| |反掩码| |掩码的表达式| |掩码范围|

03-5 BGP 管理距离AD/路由过滤_BGP_12

其实case1已经验证过了,如果在本地做in方向的路由过滤不是最佳的方案,因为对端并不知道你本地要阻挡哪些路由过来,所以以前该怎么发路由过来,现在还会怎么发,等路由送到本地了以后,由本端路由器进行过滤,这样,带宽也就无故的浪费了。

但是有些时候因为一些安全和私密性的原因,根本我们就不能操作对端的设备,那么又不能让本地路由器学到一些路由分发给下面的站点。这个时候就是需要用in方向的时候了。

在这里,R1会通告给R2 5条路由,4条182.16.0.0/24的明细路由.一条22位掩码的汇总路由。

需求:在R2的in方向,需要做路由过滤。只接收汇总路由,不接收明细路由:

R1的配置

router bgp 100

no synchronization

bgp log-neighbor-changes

network 182.16.0.0 mask 255.255.255.0

network 182.16.1.0 mask 255.255.255.0

network 182.16.2.0 mask 255.255.255.0

network 182.16.3.0 mask 255.255.255.0

aggregate-address 182.16.0.0 255.255.252.0 //产生一条182.16.0.0/22的汇总路由.

neighbor 172.17.1.2 remote-as 200

no auto-summary

!

R2的配置(用扩展访问列表方式)

router bgp 200

no synchronization

bgp log-neighbor-changes

neighbor 172.17.1.1 remote-as 100

neighbor 172.17.1.1 distribute-list 100 in

distance 15 172.17.1.1 0.0.0.0

no auto-summary

!

access-list 100 permit ip 182.16.0.0 0.0.3.255 host 255.255.252.0

R2的配置:(用前缀列表的方式)

router bgp 200

no synchronization

bgp log-neighbor-changes

neighbor 172.17.1.1 remote-as 100

neighbor 172.17.1.1 prefix-list guolv in

distance 15 172.17.1.1 0.0.0.0

no auto-summary

!

ip prefix-list guolv seq 5 permit 182.16.0.0/22

最后R2那里得到的结果是:

03-5 BGP 管理距离AD/路由过滤_路由过滤_13

3-5-4 路由过滤 neighbor [ip-address] distribute-list ACL out

case 1 : 阻挡特定的路由.

03-5 BGP 管理距离AD/路由过滤_BGP_14

这个拓扑图中,R1和R2建立了EBGP邻居以后,R1会传递4条路由给R2.

因为这四个网段都network进了bgp 100进程里面的。

现在在R1上不允许182.16.0.1和182.16.2.1/24的网段通告给R2. (out的命令和in的命令使用方式相同,不过不同的是,应用在out方向,实际上路由在本地就已经被丢弃了,不会通告给对端邻居,而应用在in的方向,对端实际上是通告了路由过来,等路由到达本地路由器以后,才被丢弃,带宽是被莫名的占用了,所以一般路由过滤是在出方向做。)

下面是在R1上面做的配置:(阻止182.16.0.0/24和182.16.2.0/24的路由通告出去)

03-5 BGP 管理距离AD/路由过滤_路由过滤_15

最后在R2上面,我们发现只有2条路由过来了,182.16.0.0/24和182.16.2.0/24.

03-5 BGP 管理距离AD/路由过滤_CCIE_16

后者说放行特定的路由,阻挡其他所有的路由。

现在的需求是R1只放行182.16.0.0/24的路由通告给R2,其他所有的路由全部在本地deny掉。

对于R1的配置为下面的情况:

03-5 BGP 管理距离AD/路由过滤_管理距离_17

在R2上面或者R1上面将邻居清除,clear ip bgp * soft.

最后在R2上面可以看到:

03-5 BGP 管理距离AD/路由过滤_管理距离_18

case 2 : 阻挡明细路由,放行汇总路由.

03-5 BGP 管理距离AD/路由过滤_CCIE_19

现在在R1上面宣告5条路由给R2,四条是明细路由,一条是汇总路由22位的掩码.

R1的配置如下:

03-5 BGP 管理距离AD/路由过滤_管理距离_20

在R2上面可以学到5条从R1宣告过来的路由.

03-5 BGP 管理距离AD/路由过滤_路由过滤_21

四条24位掩码的路由,一条22位掩码的路由,一共5条。

目的是只通告聚合路由,不通告明细,对端的R2路由器应该只能收到一条掩码为22位的路由。

方法一,通过扩展访问列表的方式达到目的:

扩展访问列表,在通常情况下,只能对数据转发层面的东西进行控制,而不能对路由进行控制。

BGP4 命令与配置手册上面,光写了该访问列表的表达式,没有做任何讲解。

access-list 100 permit ip 182.16.0.0 0.0.3.255 255.255.252.0 0.0.0.0

|目的网段| |反掩码| |掩码的表达式| |掩码范围|

下面就通过扩展访问列表来进行一下验证:

在R1上面:

03-5 BGP 管理距离AD/路由过滤_CCIE_22

对于邻居R2进行路由过滤,out方向,这个时候本来R1应该对R2通告5条路由,4条是network进来的24位掩码的明细路由,一条是182.16.0.0/22的汇总路由,但是扩展访问列表只允许掩码为22位的汇总路由进行通告。

最后在R2上面得到的结果是:

03-5 BGP 管理距离AD/路由过滤_CCIE_23

方法二,通过前缀列表prefix达到过滤目的:

在R1上面通过前缀列表的方式来做相关的路由过滤:

router bgp 100

no synchronization

bgp log-neighbor-changes

network 182.16.0.0 mask 255.255.255.0

network 182.16.1.0 mask 255.255.255.0

network 182.16.2.0 mask 255.255.255.0

network 182.16.3.0 mask 255.255.255.0

aggregate-address 182.16.0.0 255.255.252.0

neighbor 172.17.1.2 remote-as 200

neighbor 172.17.1.2 prefix-list guolv out

no auto-summary

!

ip prefix-list guolv seq 5 permit 182.16.0.0/22

03-5 BGP 管理距离AD/路由过滤_BGP_24

最后在R2上面得到的是同样的结果:

03-5 BGP 管理距离AD/路由过滤_管理距离_25

R2只从R1学到了一条汇总路由,掩码为22位的。