HCNP Routing&Switching之BGP路由宣告

2021-10-23

  前文我们了解了BGP报文结构、类型以及邻居状态相关话题,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/15422924.html;今天我们来聊一聊BGP路由宣告相关话题;

  BGP路由宣告和IGP路由宣告区别

  我们知道IGP路由协议,在宣告路由时,不同IGP路由协议,对应宣告路由的方式都各有不同;比如RIP宣告路由,只需要宣告对应网络主类地址即可;ospf宣告网络,只需要对应宣告的网络能够包含对应网络即可;只有宣告了网络,对应邻居关系才会建立,然后自动学习对端宣告和学习到的网络;对于BGP来说,它和IGP不一样;首先BGP的邻居关系建立和宣告网络是手动分开实现的,它不像IGP那么智能;IGP只要邻居关系正常建立,对应网络就会自动从对方那里学习到;而BGP只有明确、精确宣告了以后,对端才能学习到对应网络;其次BGP不同类型的邻居,对应路由传递规则也有所不同;再其次BGP宣告网络,后面直接跟子网掩码或者掩码位数;而IGP里ospf宣告网络,对应后面是跟的反掩码;RIP不需要跟掩码,直接宣告对应主类地址;

  BGP数据库

  BGP路由信息处理过程

  提示:BGP路由处理过程如上图所示,首先当BGP从邻居收到一条新的更新,首先会将对应路由存入Adj-RIB-in(未经处理的路由信息)这个数据库中,然后再将对应信息传入输入策略引擎中进行匹配,看看是否有入站策略,只有满足对应入站策略的路由才会被存入LOC-RIB(本地路由路由信息)表中,然后再通过计算将对应路由最终存入ip路由表中;如果本端要将一条路由发送给邻居,首先会看对应ip路由表是否存在对应路由,如果有,就把对应路由与出站策略进行匹配,只有满足出站策略的路由才会被放置到adj-RIB-Out(即将要发出去的RIB信息)这张表中,然后在发送给邻居;总的处理流程是先进adj-rib-in,这张表类似缓冲区,它会存放邻居发送到所有更新,然后根据入站策略进行过滤,把满足入站策略的路由存入Loc-RIB表中,这张表类似缓存表,然后根据loc-RIB中的内容进行计算,最终将路由存入ip路由表;对于发送给邻居的更新,首先它会从loc-RIB这张表中检索对应路由信息,通过出站策略过滤,将符合出站策略的路由存入adj-RIB-out表中,这张表类似缓存表,即这种表中的所有路由都是满足出站策略的路由,都是即将可以发送给邻居的路由;

  BGP路由宣告规则

  1、只有明确宣告的网络才会发送给邻居;

  2、宣告的网络必须能精确地在路由表中找到;

  3、多条路径时,只选最优的给自己使用;

  4、只把自己使用的最优路由宣告给邻居;

  5、从EBGP学习到的路由会宣告给所有邻居;

  6、从IBGP学习到的路由只传一跳;

  7、从IBGP学习到的路由会宣告给EBGP;

  实验:如下拓扑,分别使用回环口建立邻居

  分析:使用回环口建立BGP邻居,首先对应回环口的路由必须可达;在同一个AS内部,我们可以使用IGP路由协议,对应不再同一AS我们只能使用静态路由,让对应回环接口的路由互通;其次IBGP需要更改更新源为对应回环接口;EBGP除了要更改更新源以外,对应还要修改TTL值,原因是EBGP之间建立邻居,对应数据包的TTL值为1,所以为了能够正常建立邻居,我们需要将对应数据包的TTL值;

  ·R1的配置

sys
sys R1
int g0/0/0
ip add 12.0.0.1 24
int lo 1
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 123
router-id 1.1.1.1
peer 2.2.2.2 as 123
peer 2.2.2.2 con lo 1
View Code

  R2的配置

sys
sys R2
int g0/0/0
ip add 12.0.0.2 24
int lo 2
ip add 2.2.2.2 32
int g0/0/1
ip add 23.0.0.2 24

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
net 23.0.0.2 0.0.0.0

bgp 123
router-id 2.2.2.2
peer 1.1.1.1 as 123
peer 1.1.1.1 con lo 2
peer 3.3.3.3 as 123
peer 3.3.3.3 con lo 2
View Code

  R3的配置

sys
sys R3
int g0/0/0
ip add 23.0.0.3 24
int lo 3
ip add 3.3.3.3 32
int g0/0/1
ip add 34.0.0.3 24

ospf 1 router-id 3.3.3.3
area 0
net 23.0.0.3 0.0.0.0
net 3.3.3.3 0.0.0.0

ip route-s 4.4.4.4 32 34.0.0.4

bgp 123
router-id 3.3.3.3
peer 2.2.2.2 as 123
peer 2.2.2.2 con lo 3
peer 4.4.4.4 as 4
peer 4.4.4.4 con lo 3
peer 4.4.4.4 ebgp-max-hop
View Code

  R4的配置

sys
sys R4
int g0/0/0
ip add 34.0.0.4 24
int lo 4
ip add 4.4.4.4 32

ip route-s 3.3.3.3 32 34.0.0.3

bgp 4
router-id 4.4.4.4
peer 3.3.3.3 as 123
peer 3.3.3.3 con lo 4
peer 3.3.3.3 ebgp-max-hop
View Code

  验证:查看所有路由器,看看是否是两两建立起BGP邻居?

  提示:可以看到对应邻居关系都established,邻居关系正常;

  BGP路由宣告--->本地宣告

  在R1上宣告8.8.8.8 32的网络,看看是否能够正常宣告?

  提示:BGP宣告网络的方式有两种,一种是network本地宣告,另外一种是引入宣告,即引入外部路由进bgp;从上面的实验可以看到,我们本地没有8.8.8.8/32网络的路由,对应在bgp里也是无法正常宣告;即在bgp里宣告网络,首先对应网络要存在自己的ip路由表;

  在R1上添加Lo 2 接口,并配置ip地址为8.8.8.8/32

  在bgp里宣告8.8.8.8网络

  提示:可以看到对应宣告网络,默认不跟掩码,它会按对应网络的主类掩码进行宣告;但它会提示我们对应网络不存在;如果后面的掩码和路由表中的掩码不匹配,也会提示我们对应网络不存在;这也意味着bgp宣告网络不能像ospf那样,只要宣告的网络能够包含对应网络即可;在bgp里必须精确宣告;所谓精确宣告就是指路由表中的路由掩码是多少对应在bgp里宣告时掩码就必须是对应的掩码;其次bgp的掩码是正掩码或者掩码的位数;这是和ospf不一样的地方;

  查看R2是否能够正常学习到R1宣告的网络呢?

  提示:可以看到只要R1精确宣告对应网络以后,R2是能够正常学习到对应路由;

  验证:查看R3是否能够正常学习到R1发布的路由呢?

  提示:可以看到R3并没有通过BGP学习到任何路由;说明R1宣告的路由R3没有学习到;这是因为R1和R2建立的是IBGP类型邻居,IBGP路由只传一跳;

  在R1上查看宣告的8.8.8.8路由传递给那些路由器学习过?

  提示:可以看到R1只把8.8.8.8宣告给R2,并没有宣告给R3,所以对应R3是肯定收不到对应R1的宣告;解决办法是R1和R3建立邻居;

  在R2上新建lo22接口,并配置ip地址为192.168.22.22/24 ,然后宣告进bgp,看看对应那些路由器能够正常学习到?

  在R2查看192.168.22.22/24的路由宣告给那些路由器了呢?

  提示:可以看到对应R2宣告的网络,对应R1和R3都能正常学习到;

  验证:查看R1和R3是否学习到R2宣告的网络?

  提示:可以看到对应R2宣告的网络,R1和R3都能正常学习到,对应下一跳都是2.2.2.2;这是因为R2和R1和R3建立的是IBGP类型邻居,对应路由只传一跳;

  验证:查看R4的路由,看看是否能够正常学习到R2发布的路由呢?

  提示:可以看到在R4上能够正常学习到R2发布的路由,对应路由的下一跳为3.3.3.3;这是因为R2发布的路由被R3学习到;而R3和R4建立的是EBGP类型邻居;在BGP里EBGP类型邻居,它是可以互传路由的;并且也会自动修改下一跳地址;所有R4能够正常学习到R2发布的路由,对应下一跳为R3;

  验证:在R4上新建lo44 ,并将接口地址配置为44.44.44.44/32,在bgp里宣告

  验证:在R3上查看是否学习到R4发布的路由呢?

  提示:在R3上查看bgp路由表,对应R3能够正常学习到R4发布的路由;其下一跳为4.4.4.4;

  验证:在R2上查看bgp路由表,看看是否能够学习到R4发布的路由呢?

  提示:可以看到虽然R2能够正常学习到R4发布的路由,但是对应路由是不可用的(没有星号,表示路由不可用);R2之所以能够学习到R4发布的路由,是因为R4发布的路由被R3学习到(EBGP间路由可以互传);而R2和R3由属于IBGP邻居(IBGP邻居关系,路由只传一跳),所以R2能够学习到R4发布的路由;在R2上看到R4发布的路由之所以不可用,原因是IBGP类型邻居,传递路由时不会自动修改下一跳地址为自己;所以在R3上学习到的路由下一跳是多少,对应R2学习到的下一跳地址就是多少;不可用的原因是R2没有去往4.4.4.4的路由;所以它不知道怎么去往下一跳,当然对应路由也就无法正常使用;解决办法,在R3上强制更改下一跳为自己;

  在R3上修改传递给2.2.2.2的路由,下一跳修改为自己

  验证:再次在R2上查看对应bgp路由表,看看44.44.44.44/32的路由是否可用了?

  提示:可以看到现在R2学习到的路由,其下一条为R3,对应路由也从原来的不可用变为可用(有星号了);

  总结:通过上述实验我们可以看到bgp宣告路由,首先宣告的路由在本地路由表中可以查看到,即对于宣告者来说,宣告的路由必须是最优的路由(存放在ip路由表中的路由对于本地路由器来说就是最优路由),其次默认情况下BGP建立起邻居不会宣告任何网络,只有宣告者手动明确、精确宣告以后,对应路由才会被邻居学习到;邻居类型为IBGP,对应路由只传一跳(为了防止环路);EBGP邻居类型,是可以正常互相传递路由;EBGP类型邻居,在互传路由时会自动修改路由为自己,然后再宣告给对端邻居;而IBGP类型邻居,不会自动修改下一跳为自己,只有手动使用命令强制将对应路由修改为自己,然后传递给邻居;

  BGP路由宣告--->引入宣告

  引入宣告其实就是将外部路由引入只BGP,其命令为import-route

  示例:在R1上新建静态路由,然后将对应静态路由引入至bgp

  提示:引入路由通常结合路由策略使用;

  查看R1引入的5.5.5.5的路由

  提示:引入路由至BGP对应在bgp路由表中表现的为OGN为问号,表示引入的路由;其下一跳为0.0.0.0表示下一跳为自己;

  验证:查看R2是否学习到R1引入宣告的5.5.5.5的路由呢?

  提示:可以看到对应R2能够正常学习到R1引入的路由;其下一跳为1.1.1.1;引入宣告和本地宣告只是宣告的方式不同,两者都遵循上述的路由宣告规则和传递规则;

  BGP宣告缺省路由

  BGP和ospf一样,默认情况下都不会引入缺省路由,只有手动使用命令允许

  示例:在R2上新建一条缺省路由,然后在bgp里发布

  提示:上述命令只是表示允许将缺省路由引入至BGP;默认是不允许引入缺省路由;

  在R2上引入静态至bgp

  验证:在R1或R3上查看,是否学习到R2发布的缺省路由呢?

  提示:可以看到R1和R3都能正常学习到R2发布的缺省路由;其实R4也能正常学习到R2的缺省路由;是因为R3学习到的路由会传递给R4(EBGP),并且还会将下一跳修改为自己再传递给R4;如下

  除了上述通过命令允许引入缺省路由的方式发布缺省路由,还可以直接向邻居宣告一条缺省路由,不管本地是否存在缺省路由

  验证:在R2上取消缺省路由发布,删除缺省路由,然后直接使用命令向R3发布一条缺省路由

  验证:查看R3是否学习到一条缺省路由?

  提示:可以看到R3学习到一条缺省路由,其学习到的方式是通过IGP内部学习到的;和上面引入的方式不同;这条命令是向指定路由发送缺省路由,不管本地是否有缺省路由,对应邻居收到都会生成一条缺省路由,将下一跳指向对端;