zoukankan      html  css  js  c++  java
  • HCNP Routing&Switching之BGP防环机制和路由聚合

      前文我们了解了BGP路由宣告相关话题,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/15440860.html;今天我们来聊一聊BGP防环机制和路由聚合相关话题;

      BGP防环机制

      我们知道BGP的邻居类型分IBGP和EBGP,对于不同类型邻居关系,它们宣告路由的规则各有不同,对于邻居类型为IBGP,它们宣告路由只会传递一跳;对于邻居类型为EBGP,它们宣告路由是可以传递多跳和IGP传递路由相似,同时IBGP传递路由时,它们不会更改更新源,即宣告者是谁,对应学习的路由下一跳就是谁,我们可以通过命令强制修改更新源为自己,即对端学习到相关路由的下一跳指向自己;对于EBGP来说,EBGP之间传递路由,会自动修改更新,即从哪里学习到对应路由,其下一跳会自动修改为对端;对于BGP防环来说,我们也是从两种邻居类型分别来讨论;

      AS内(IBGP)防环机制

      水平分割,从IBGP收到的更新不会发布给IBGP(IBGP更新只传递一跳)

      提示:如上图所示,对于在同一AS内的4个路由器,RTA,RTB,RTC,RTD,它们手拉手建立邻居,对于RTA发布的更新,对于RTD来说它是学习不到的,原因是IBGP邻居关系,对应更新只传一跳;同样的道理,RTD发布更新,RTA也是学习不到的,对于RTB和RTC来说,是能够正常学习到;

      解决水平分割带来的路由学习不完整方案

      1、IBGP邻居全互联

      提示:如上图所示,RTA,RTB,RTC,RTD两两相互建立邻居,这样实现邻居全互联,不管哪个路由器发布更新,对应其他路由器都能够收到更新;这样虽然理论上解决了水平分割带来的路由学习不完整,但同时这样也给管理员带来很多不便,比如我们要增加一台路由,对应所有路由器都要更改配置,这样配置和维护的开销太大;一般路由器众多的情况下不推荐使用这样方式;

      2、路由反射器(Route Reflector)

      提示:路由反射器(Route Reflector),这个技术有点类似ospf里的DR;即在一个AS内,其中一台路由器作为路由反射器RR(Route Reflector),其它路由器作为客户端(Client)与路由反射器之间建立IBGP连接。路由反射器在客户机之间传递(反射)路由信息,而客户端之间不需要建立BGP连接。这样一来相比全互联就大大简化了配置和维护上的开销;

      3、联盟(confederation)

      提示:联盟就是将一个大的AS分割成多个小的AS,AS之间建立EBGP邻居,从而实现一个路由器发布更新,能够传递个其他所有路由器(其他小AS之间建立EBGP);

      AS间(EBGP)防环机制

      AS间建立的都是EBGP邻居,它的防环机制主要依靠AS_PATH这个属性,as_path是BGP更新内的一个重要属性,它主要用来描述一条路由所经过的AS;如果接受路由器发现AS_PATH里有与本地AS号,则对应路由就会被丢弃;

      提示:如上图所示,RTB发送一条更新,对应AS_PATH就会记录对应的AS号,对应RTC收到RTB的更新,首先要看看AS_PATH里是否有自己as号,如果没有则接受此更新,如果有就丢弃;RTC接受了RTB的更新后,它会继续向它的其他EBGP发送此更新,即RTC会向RTA和RTB发送此更新;同样的道理RTA和RTB都会检查对应更新中as_path里是否有自己的as号,如有,则丢弃,如果没有则接收;这样一来发出去的路由就不可能回到发出更新路由器所在as,即环路也就无法产生;

      总结:BGP的防环机制主要从两种邻居类型来说,对于IBGP来说,主要依靠水平分割机制,即IBGP间,路由更新只传递一跳;对于EBGP来说,主要依靠AS_Path这个属性来防止环路,即收到路由更新的BGP路由器,发现AS_Path 里有自己的AS号,则对应路由会被丢弃;

      BGP路由聚合

      BGP的路由聚合有三种方式,分别是静态聚合、自动聚合和手动聚合;聚合的目的就是精简路由表,从而优化路由器的性能;

      BGP静态路由聚合

      所谓静态聚合是指我们手动在BGP路由器上手动配置一条聚合后的静态路由,其出接口指向NULL0口,然后在通过network在BGP里进行宣告;我们知道对于BGP路由宣告规则中,对应宣告的路由必须存在路由表才可以被宣告;为了解决这样的限制,我们手动配置一条聚合后的静态路由,这样一来就解决了路由不存在路由表的限制,然后通过network宣告聚合后的路由即可;其他路由器收到的更新就只有聚合后的路由,从而实现路由聚合;

      BGP自动路由聚合

      BGP自动路由聚合,只能对引入的IGP路由进行主类掩码聚合,而原引入的明细路由被抑制,不会被有选和发布给BGP邻居;开启自动聚合命令summary automatic;

      BGP手动路由聚合

      手动路由聚合是指通过命令对引入和本地路由进行聚合,聚合命令aggretage;优先级顺序是手动聚合大于自动聚合;

      实验:如下拓扑配置BGP,分别对明细路由进行静态路由聚合、自动路由聚合和手动路由聚合;

      R1的配置

    sys
    sys R1
    int g0/0/0
    ip add 12.0.0.1 24
    int lo 1
    ip add 172.16.0.1 24
    int lo 2
    ip add 172.16.1.1 24
    int lo 3
    ip add 172.16.2.1 24
    int lo 4
    ip add 172.16.3.1 24
    int lo 11
    ip add 1.1.1.1 32
    
    ospf 1 router-id 1.1.1.1 
    area 0
    net 12.0.0.1 0.0.0.0
    net 1.1.1.1 0.0.0.0
    
    bgp 12
    router-id 1.1.1.1
    peer 2.2.2.2 as 12
    peer 2.2.2.2 con lo 11
    View Code

      R2的配置

    sys
    sys R2
    int g0/0/0
    ip add 12.0.0.2 24
    int g0/0/1
    ip add 23.0.0.2 24
    int lo 22
    ip add 2.2.2.2 32
    
    ospf 1 router-id 2.2.2.2
    area 0
    net 12.0.0.2 0.0.0.0
    net 2.2.2.2 0.0.0.0
    
    ip route-s 3.3.3.3 32 23.0.0.3
    
    bgp 12
    router-id 2.2.2.2
    peer 1.1.1.1 as 12
    peer 1.1.1.1 con lo 22
    peer 3.3.3.3 as 3
    peer 3.3.3.3 con lo 22
    peer 3.3.3.3 ebgp-max-hop
    View Code

      R3的配置

    sys
    sys R3
    int g0/0/0
    ip ad 23.0.0.3 24
    int lo 33 
    ip add 3.3.3.3 32
    int lo 1
    ip add 192.168.0.1 24
    int lo 2
    ip add 192.168.1.1 24
    int lo 3
    ip add 192.168.2.1 24
    int lo 4
    ip add 192.168.3.1 24
    
    ip route-s 2.2.2.2 32 23.0.0.2
    
    bgp 3
    router-id 3.3.3.3
    peer 2.2.2.2 as 12
    peer 2.2.2.2 con lo 33
    peer 2.2.2.2 ebgp-max-hop 
    View Code

      验证BGP邻居状态

      提示:可以看到BGP邻居都正常建立起来;

      在R1上使用静态聚合的方法将172.16网段路由聚合后宣告

      1、创建聚合后的静态路由,出接口指向NULL 0 口

      2、通过network在bgp里宣告聚合后的路由

      验证:在R2和R3上查看bgp路由表,看看是否学习到R1聚合后的路由呢?

      提示:可以看到R2和R3上都能正常学习到R2聚合后的路由;不同的是R2学习聚合后的路由其下一跳指向R1,而R3学习到聚合后的路由下一跳指向R2,原因是R2和R3是EBGP类型邻居,在同步路由时会自动修改更新源为自己,即下一跳会自动修改为自己;

      在R1上使用自动聚合的方法将172.16网段路由聚合

      在R1上取消将172.16网段聚合后在bgp里宣告

      在R1上开启自动聚合

      提示:开启自动聚合时,系统会提示我们自动聚合只能对引入的路由进行聚合,本地宣告的路由是不能聚合的;

      验证:在R1上将172.16网段路由引入至BGP

      验证:在R1上查看引入的路由

      提示:可以看到开启自动聚合后,对应引入的172.16网段路由,自动被聚合为172.16.0.0/16,而明细路由被抑制;

      验证:在R2和R3上查看bgp路由表,看看是否学习到R1自动聚合后的路由呢?

      提示:可以看到R2和R3都能正常学习到R1自动聚合后的路由;

      在R3上使用手动聚合聚合192.168网段路由

      1、将直连路由引入只bgp

      验证:查看R3bgp路由表,看看192.168网段路由是否引入至BGP

      提示:可以看到192.168.网段路由已经引入至BGP;

      2、手动聚合192.168网段路由

      验证:查看bgp路由表,看看对应明细路由是否被聚合?

      提示:可以看到bgp路由表中多了一条被聚合后端路由;但明细路由没有被抑制;这是因为默认情况下,手动聚合明细路由不会被抑制;必须手动使用detail-suppressed参数来抑制明细路由;

      使用detail-suppressed参数来抑制明细路由

      验证:查看bgp路由表,看看明细路由是否被抑制?

      提示:可以看到加了detail-suppressed参数以后,对应明细路由就被抑制了;

      验证:在R2和R1上查看bgp路由表,看看是否学习到R3手动聚合的路由呢?

      提示:可以看到R1和R2都能正常学习到R3手动聚合后的路由,但R1上不可用,原因是R3没有去往3.3.3.3的路由;解决办法在R2上开启修改更新源为自己;

      在R2上开启修改更新源为自己

      验证:在R1上查看bgp路由表,看看对应路由是否可用?

      提示:可以看到现在R1学习到192.168.0.0/22的路由是可用最优状态;

      as-set参数:保留原有as号码属性;该参数主要用来防止环路产生;默认情况下手动聚合路由后,它会以本端为起始点向周围邻居宣告,对应as号码是本端bgp路由器所在as号,这样一来就可能产生环路;如上,我们不在R3上手动聚合路由,只是在R3上引入路由,然后在R2上做手动聚合,看看对应聚合后的路由是否会照常发送给R3呢?

      在R3上取消手动路由聚合

      在R2上验证看看是否正常学习到R3引入的直连路由呢?

      提示:可以看到R3引入的路由R2能够正常学习到;

      在R2上做手动路由聚合,并抑制明细路由

      验证:查看R2bgp路由表,看看是否生成了聚合后的路由?明细路由是否被抑制?

      提示:可以看到在R2上生成了一条聚合后的路由,对应明细路由也都抑制了;

      验证:在R1上查看bgp路由表,看看是否正常学习到R2聚合后的路由?

      提示:可以看到现在R1学习到底192.168.0.0/22这条路由,对应的没有记录as号,说明这条路由是有同一as内部的其他路由器发布;和刚才看到的不一样,刚才R3手动聚合,对应R1学习到的路由,对应as号为3,而现在没有了;很显然不应该这样;

      再来看看R3是否学习到R2手动聚合后的路由呢?

      提示:可以看到R3也正常学习到R2手动聚合后的路由;对应as号为12;本来是R3发布的明细路由,被R2聚合后变为了再次发给了R3,这很不合理呀,正常情况R3是始发地,就不应该收到R2聚合后的路由;解决办法,在R2上做路由聚合时,加上as-set参数,保留原有as号

      在R2上手动聚合加上as-set

      验证:在此在R3上查看bgp路由表,看看R2聚合后的路由是否会被收到呢?

      提示:可以看到R3现在就没有接收R2发布的聚合后的路由,原因是R2发布的聚合后的路由中as_path里包含R3的as号,所以对应路由会被R3丢弃;

      验证:在R2上查看192.168.0.0/22这条路由通告给那些路由器,是否有R3在内呢?

      提示:可以看到R2是通告给R3,只不过R3查看对应路由里as-path里包含自己所在as,所以R3拒绝接收R2发布的聚合后的路由;

      验证:在R1上查看对应路由,看看对应路由现在as号是多少?

      提示:现在可以看到R1学习到的路由和R3发布手动聚合的路由一样,对应path属性为3,这说明该条路由的始发地as号为3,而非本地其他路由器;

    作者:Linux-1874
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.
  • 相关阅读:
    “sockaddr”: “struct”类型重定义的错误的解决办法《转》
    2019年车险
    tinylib
    命令行利用ffmpeg实现rtmp推流《转》
    Inno setup 判断系统32位还是64位
    vs2015编译OBS-Studio21.1.12
    啃OBS源码-界面汉字
    百年孤独人物关系1
    windows命令行查看文件MD5
    python 玩爬虫安装了一大堆第三方库
  • 原文地址:https://www.cnblogs.com/qiuhom-1874/p/15458110.html
Copyright © 2011-2022 走看看