天天看点

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

该文档涉及的命令有:

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路由优先,因为管理距离小。

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

<b>3-5-1 distance [admin-distance] [ip-source-address] [ip-adress-mask]</b>

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

<b>loopback 0 : 10.10.10.10/24</b>

<b>loopback 1 : 11.11.11.11/24</b>

<b>R1</b><b>与</b><b>R2</b><b>建立</b><b>EBGP</b><b>邻居</b><b>,</b><b>将两个接口</b><b>network</b><b>到</b><b>BGP</b><b>进程</b><b>1</b><b>中</b><b>,</b><b>那么</b><b>R1</b><b>会通过</b><b>EBGP</b><b>传递</b><b>2</b><b>条路由到</b><b>R2,</b><b>管理距离为</b><b>20.</b>

<b>在</b><b>R3</b><b>上面</b><b>,</b><b>有一个</b><b>loopback</b><b>接口</b><b>:</b>

<b>loopback0: 30.30.30.30/24</b>

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

<b>在</b><b>R2</b><b>上面首先先检查一下结果是否是默认情况:</b>

这个时候,在一个拓扑图中有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

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

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

no auto-summary

!

<b>access-list 1 permit 10.10.10.0 0.0.0.255</b>

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

<b>最后来总结一下这个命令的用法</b><b>.</b>

<b>distance [</b><b>修改后的</b><b>AD] [</b><b>邻居的</b><b>IP</b><b>地址</b><b>]</b>

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

<b>distance 50 10.10.10.10</b>

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

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

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

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

<b>3-5-2 distance bgp external internal local</b>

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

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

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

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

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

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

首先看看R2的配置:

最后在R2上面结果是:

<b>总结:</b>

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

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

如果想仅仅针对某个邻居的某条路由在本地修改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.

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

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

用途:过滤接收自特定的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是一个本地行为,仅本地有效,会接受到对端通告过来的所有路由信息,然后在本地进行过滤。

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

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

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

<b>access-list 100 permit ip 182.16.0.0 0.0.3.255 255.255.252.0 0.0.0.0</b>

<b>|</b><b>目的网段</b><b>| |</b><b>反掩码</b><b>| |</b><b>掩码的表达式</b><b>| |</b><b>掩码范围</b><b>|</b>

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

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

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

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

<b>R1</b><b>的配置</b><b>:</b>

router bgp 100

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

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

neighbor 172.17.1.2 remote-as 200

<b>R2</b><b>的配置</b><b>:</b><b>(</b><b>用扩展访问列表方式</b><b>)</b>

router bgp 200

neighbor 172.17.1.1 remote-as 100

<b>neighbor 172.17.1.1 distribute-list 100 in</b>

distance 15 172.17.1.1 0.0.0.0

<b>access-list 100 permit ip 182.16.0.0 0.0.3.255 host 255.255.252.0</b>

<b>R2</b><b>的配置:(用前缀列表的方式)</b>

<b>neighbor 172.17.1.1 prefix-list guolv in</b>

<b>ip prefix-list guolv seq 5 permit 182.16.0.0/22</b>

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

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

<b>case 1 : </b><b>阻挡特定的路由</b><b>.</b>

这个拓扑图中,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上面可以看到:

<b>case 2 : </b><b>阻挡明细路由,放行汇总路由</b><b>.</b>

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

R1的配置如下:

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

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

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

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

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

在R1上面:

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

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

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

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

aggregate-address 182.16.0.0 255.255.252.0

<b>neighbor 172.17.1.2 prefix-list guolv out</b>

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

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

本文转自 hny2000 51CTO博客,原文链接:http://blog.51cto.com/361531/714305

继续阅读