该文档涉及的命令有:
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路由器会使用管理距离来选择最优的路由。
管理距离值越小,路由的优先级就越高.
这就是管理距离,同样在路由表中有EBGP和OSPF,那么EBGP路由优先,因为管理距离小。
关于修改管理距离的命令,相当灵活,而且很强大。
3-5-1 distance [admin-distance] [ip-source-address] [ip-adress-mask]
在这个拓扑图中,R1上面有两个loopback接口:
loopback 0 : 10.10.10.10/24
loopback 1 : 11.11.11.11/24
R1与R2建立EBGP邻居,将两个接口network到BGP进程1中,那么R1会通过EBGP传递2条路由到R2,管理距离为20.
在R3上面,有一个loopback接口:
loopback0: 30.30.30.30/24
在R3上面将该接口network到bgp 2进程中,那么R3会通过IBGP邻居传递给R2,最后默认的管理距离是200.
在R2上面首先先检查一下结果是否是默认情况:
这个时候,在一个拓扑图中有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上面:
最后来总结一下这个命令的用法.
distance [修改后的AD] [邻居的IP地址]
我先犯了一个错误,我在想如果R2想要把10.10.10.10/24的路由加上AD 50,我在R2上面用的命令是:
distance 50 10.10.10.10
实际上最后一看show ip route bgp,管理距离任然是20,EBGP通告过来的,没有改变。然后才看清楚这个命令的用法:
使用掩码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为多少的话,这条命令更为实用。
首先看看R2的配置:
最后在R2上面结果是:
总结:
关于修改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邻居来说,入站分发列表所起的作用相同。
在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的配置:
最后在R2上面看看学习到的bgp路由呢?
这里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应该会把四条路由都传递给对端邻居:
这里可以看到,我打开了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
|目的网段| |反掩码| |掩码的表达式| |掩码范围|
其实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那里得到的结果是:
3-5-4 路由过滤 neighbor [ip-address] distribute-list ACL out
case 1 : 阻挡特定的路由.
这个拓扑图中,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的路由通告出去)
最后在R2上面,我们发现只有2条路由过来了,182.16.0.0/24和182.16.2.0/24.
后者说放行特定的路由,阻挡其他所有的路由。
现在的需求是R1只放行182.16.0.0/24的路由通告给R2,其他所有的路由全部在本地deny掉。
对于R1的配置为下面的情况:
在R2上面或者R1上面将邻居清除,clear ip bgp * soft.
最后在R2上面可以看到:
case 2 : 阻挡明细路由,放行汇总路由.
现在在R1上面宣告5条路由给R2,四条是明细路由,一条是汇总路由22位的掩码.
R1的配置如下:
在R2上面可以学到5条从R1宣告过来的路由.
四条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上面:
对于邻居R2进行路由过滤,out方向,这个时候本来R1应该对R2通告5条路由,4条是network进来的24位掩码的明细路由,一条是182.16.0.0/22的汇总路由,但是扩展访问列表只允许掩码为22位的汇总路由进行通告。
最后在R2上面得到的结果是:
方法二,通过前缀列表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
最后在R2上面得到的是同样的结果:
R2只从R1学到了一条汇总路由,掩码为22位的。