HCNP Routing&Switching之BGP防环机制和路由聚合

  前文我们了解了BGP路由宣告相关话题,回顾请参考//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,而非本地其他路由器;