前文我们了解了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

  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

  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

  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

  验证:查看所有路由器,看看是否是两两建立起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内部学习到的;和上面引入的方式不同;这条命令是向指定路由发送缺省路由,不管本地是否有缺省路由,对应邻居收到都会生成一条缺省路由,将下一跳指向对端;

HCNP Routing&Switching之BGP路由宣告的更多相关文章

  1. HCNP Routing&Switching之BGP路由属性和优选规则

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

  2. HCNP Routing&Switching之BGP路由控制

    前文我们了解了BGP的路由属性和优选规则相关话题,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/15489497.html:今天我们来聊一聊BGP路由控制相关话 ...

  3. HCNP Routing&Switching之BGP路由过滤和AS-Path-Filter

    前文我们聊了下通过修改BGP路由属性来影响路由,从而达到控制BGP路由的目的:回顾请参考https://www.cnblogs.com/qiuhom-1874/p/15495585.html:今天我们 ...

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

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

  5. HCNP Routing&Switching之BGP团体属性和团体属性过滤器

    前文我们了解了BGP的路由过滤已经as-path过滤器的使用相关话题,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/15542559.html:今天我们来聊一聊 ...

  6. HCNP Routing&Switching之BGP基础

    前文我们了解了路由注入带来的问题以及解决方案相关话题,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/15362604.html:今天我们来学习下新的路由协议BG ...

  7. HCNP Routing&Switching之BGP邻居建立条件、优化和认证

    前文我们了解了BGP相关概念.AS相关概念以及BGP邻居类型.基础配置等,相关回顾请参考https://www.cnblogs.com/qiuhom-1874/p/15370838.html:今天我们 ...

  8. HCNP Routing&Switching之IS-IS路由聚合和认证

    前文我们了解了IS-IS路由渗透和开销相关话题,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/15302382.html:今天我们来聊一聊IS-IS路由聚合和认 ...

  9. HCNP Routing&Switching之BGP报文结构、类型和状态

    前文我们了解了BGP的邻居建立条件.优化以及BGP认证相关话题,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/15395723.html:今天我们来聊一聊BGP ...

随机推荐

  1. Redis的持久化机制与内存管理机制

    1.概述 Redis的持久化机制有两种:RDB 和 AOF ,这两种机制有什么区别?正式环境应该采用哪种机制? 我们的服务器内存资源是有限的,如果内存被Redis的缓存占满了怎么办?这就要看Redis ...

  2. Selenium系列(十九) - Web UI 自动化基础实战(6)

    如果你还想从头学起Selenium,可以看看这个系列的文章哦! https://www.cnblogs.com/poloyy/category/1680176.html 其次,如果你不懂前端基础知识, ...

  3. MongoDB 常见问题 - 解决 brew services list 查看 MongoDB 服务 status 显示 error 的问题

    问题背景 将 MongoDB 作为服务运行 brew services start mongodb-community@4.4 也显示运行成功了,但是查看服务列表的时候,发现 MongoDB 服务的还 ...

  4. VMware Vsphere 虚拟化

    总体架构 主要组件: 1)ESXi 底层虚拟化层,用于将物理服务器虚拟成资源池,提供管理接口,方便其他的管理组件进行管理,其实体形态是iso文件,刻成启动光盘可直接安装在服务器裸机上: 安装在实体服务 ...

  5. word域实现动态填充信息附件下载

    1.问题描述:在页面上一些下载附件功能,点击触发执行下载操作时候,有些电脑的浏览器可以,有些电脑的浏览器下载不了,电脑打开弹出的下载框下载的不是一个文件,而是一个如jspx后缀名的页面,jspx后缀是 ...

  6. nacos配置中心模块详解

    本文已收录 https://github.com/lkxiaolou/lkxiaolou 欢迎star. 配置中心 业务上的配置,功能开关,服务治理上对弱依赖的降级,甚至数据库的密码等,都可能用到动态 ...

  7. python库--tensorflow--数学函数

    官方API(需FQ) 中文API 方法 返回值类型 参数 说明 算数运算符 .add() Tensor x, y, name=N 加法(若x,y都为tensor, 数据类型需一致, 以下所有x,y都如 ...

  8. Tomcat配置支持war包部署

    Tomcat配置支持war包部署 #cat /data/tomcat/conf/server.xml <?xml version='1.0' encoding='utf-8'?> < ...

  9. 5-21python数据类型

    一.字符串,是不可变数据类型,所有字符串的方法都不会修改字符串的值,使用字符串的方法后都是生成了一个新的字符串.就因为字符串是不可变变量! 字符串的方法 1. strip(),默认去空格,但是当()中 ...

  10. C++课后习题

    一.设计一个类people,有保护数据成员:age(年龄,整型),name(姓名,string),行为成员:两个构造函数(一个默认,另一个带参数):析构函数:void setValue(int m, ...