外部BGP的基础配置(上)

简介: 文章目录系列文章目录实验目的实验拓扑实验步骤

实验目的

通过对外部BGP邻居的建立的两种情况的实验,从而学习到BGP外部邻居建立所需要关注的知识点。同时还将对如何将路由插入到BGP表中对BGP表和对BGP表的查看进行实验验证。

实验拓扑


本次实验拓扑由两台路由器搭建,R1和R2之间连接有两条以太网线缆。其中e0/0口采用12.0/24网段,而e0/1接口采用21.0/24网段。并且R1和R2上都存在地址为X.X.X.X/24的环回口。

实验步骤

  1. 首先配置好R1和R2各个接口的IP地址,保证直连接口可达。
  2. 开启R1和R2之间的E0/0接口,然后R1和R2之间通过该接口建立外部BGP邻居关系,并且R1的AS号为1,R2的AS号为2。
R1#conf t
R1(config)#int e0/0
R1(config-if)#ip add 10.10.12.1 255.255.255.0
R1(config-if)#no sh
R1(config-if)#int e0/1
R1(config-if)#ip add 10.10.21.1 255.255.255.0
R1(config-if)#no sh
R1(config-if)#int loo0
R1(config-if)#ip add 1.1.1.1 255.255.255.0
R1(config-if)#no sh
R1(config-if)#router bgp 1    //指明自己所属的AS号
R1(config-router)#neighbor 10.10.12.2 remote-as 2   //对端邻居路由器的IP地址和AS号
R1(config-router)#exit 
R2#conf t
R2(config)#int e0/0
R2(config-if)#ip add 10.10.12.2 255.255.255.0
R2(config-if)#no sh
R2(config-if)#int e0/1
R2(config-if)#ip add 10.10.21.2 255.255.255.0
R2(config-if)#no sh
R2(config-if)#int loo0
R2(config-if)#ip add 2.2.2.2 255.255.255.0  
R2(config-if)#no sh
R2(config-if)#router bgp 2
R2(config-router)#neighbor 10.10.12.1 remote-as 1
R2(config-router)#exit

注意上述配置命令中,R1和R2之间的AS号码必须相互对照。则R1所指定的邻居的AS号码和R2本地配置的BGP的AS号码一致,反之亦然。等待一段时间,则发现路由器产生BGP日志,则表示邻居建立成功。

*Mar 1 00:26:37.175: %BGP-5-ADJCHANGE: neighbor 10.10.12.1 Up

此处总结一下建立外部BGP邻居所需要注意的:

  • 两端路由器的AS号码必须相互对照一致
  • BGP路由器的RID必须唯一
  • 如果配置了认证,那么MD5认证必须一致
  • BGP所需要建立的TCP连接必须能够正常建立

由于上面的配置并没有对BGP路由器的RID进行手工配置,所以按照选取RID的顺序,两台路由器的RID分别为环回口地址 1.1.1.1 和 2.2.2.2。

R1#
R1#show ip bgp summary
BGP router identifier 1.1.1.1, local AS number 1
BGP table version is 1, main routing table version 1
Neighbor        V    AS MsgRcvd MsgSent   TblVer  InQ OutQ Up/Down  State/PfxRcd
10.10.12.2      4     2      28      28        1    0    0 00:25:02        0
R2#show ip bgp summary
BGP router identifier 2.2.2.2, local AS number 2
BGP table version is 1, main routing table version 1
Neighbor        V    AS MsgRcvd MsgSent   TblVer  InQ OutQ Up/Down  State/PfxRcd
10.10.12.1      4     1      28      28        1    0    0 00:25:24        0

但是为了RID的可预测性,推荐在BGP进程下手工指定RID。

R1#conf t
R1(config)#router bgp 1
R1(config-router)#bgp router-id 1.1.1.1
R1(config-router)#exit
R2#conf t
R2(config)#router bgp 2
R2(config-router)#bgp router-id 2.2.2.2
R2(config-router)#exit


同时我们还可以在R1和R2之间对BGP邻居关系配置MD5认证。

R1(config)#router bgp 1
R1(config-router)#neighbor 10.10.12.2 password cisco
R1(config-router)#exit
R2(config)#router bgp 2
R2(config-router)#neighbor 10.10.12.1 password cisco
R2(config-router)#exit

最后,由于BGP是建立在TCP连接之上的。因此要能够正确的建立BGP邻居关系,TCP连接正常是先决条件。

默认BGP建立TCP连接的方式是:

和目的地址为neighbor X.X.X.X命令中的X.X.X.X命令中的X.X.X.X尝试建立TCP连接

源地址为出接口的IP地址

因此,必须保证两端TCP的源目的的IP地址的相互一致性。

删除对BGP邻居配置的命令,然后开启R1和R2之间的E0/1接口。

现在R1和R2之间存在冗余链路,如果R1和R2之间需要建立外部BGP邻居的话,应该如何建立呢?

第一种方案是,在每条链路上都建立一个邻居关系,从而形成两个邻居关系。

第二种方案是,R1和R2上分别以环回口建立邻居关系,而底层可以采用静态路由使得去往各自的环回口的路由负载均衡。

很显然,使用第二种方案更加合理。因为每建立一个BGP连接都会消耗一定的系统资源,因此减少BGP邻居关系数量将有利于路由器的资源最大化利用。

我们用R1和R2的环回口相互建立邻居关系,但首先保证环回口可达性。

在R1和R2上配置静态路由,并且使之负载均衡。

R1(config)#ip route 2.2.2.0 255.255.255.0 10.10.12.2  
R1(config)#ip route 2.2.2.0 255.255.255.0 10.10.21.2
R2(config)#ip route 1.1.1.0 255.255.255.0 10.10.12.1 
R2(config)#ip route 1.1.1.0 255.255.255.0 10.10.21.1

接着进入BGP进程中,利用环回口建立邻居关系。

R1(config)#router bgp 1
R1(config-router)#bgp router-id 1.1.1.1
R1(config-router)#neighbor 2.2.2.2 remote-as 2
R1(config-router)#exit
R2(config)#router bgp 2
R2(config-router)#bgp router-id 2.2.2.2
R2(config-router)#neighbor 1.1.1.1 remote-as 1
R2(config-router)#exit

但是在完成上述配置之后,并没有发现邻居成功建立。

这是因为默认外部BGP邻居之间所发送的所有数据包的TTL值,都为1。

由于此时我们利用环回口建立邻居,所以跳数大于1,因此必须修改TTL值。


R1(config)#router bgp 1
R1(config-router)#neighbor 2.2.2.2 ebgp-multihop 2    //将TTL值修改为2
R1(config-router)#exit 
R2(config)#router bgp 2
R2(config-router)#neighbor 1.1.1.1 ebgp-multihop 2
R2(config-router)#exit

然后等待一段时间,依然发现BGP邻居无法建立,结合上个步骤中总结的BGP邻居建立的注意点,我们发现,应该是TCP连接建立的IP地址无法对应。

R1尝试和2.2.2.2建立TCP,源IP为10.10.12.1 或者 10.10.21.1

R2尝试和1.1.1.1建立TCP,源IP为10.10.12.2 或者 10.10.21.2

因此,必须修改建立TCP的源地址。


R1(config)#router bgp 1
R1(config-router)#neighbor 2.2.2.2 update-source loo0
R1(config-router)#exit 
R2(config)#router bgp 2
R2(config-router)#neighbor 1.1.1.1 update-source loo0
R2(config-router)#exit

终于,R1和R2之间的BGP邻居关系正常。

*Mar 1 02:35:05.535: %BGP-5-ADJCHANGE: neighbor 2.2.2.2 Up

这种冗余物理链路的BGP邻居关系,我们可以采用建立环回口的方式,这是一条逻辑的邻居关系,下层位IGP。因此如果冗余的话需要由IGP来决定。

下面给出R1和R2之间的所有邻居配置:

R1(config)#router bgp 1
R1(config-router)#no synchronization
R1(config-router)#bgp router-id 1.1.1.1
R1(config-router)#bgp log-neighbor-changes
R1(config-router)#neighbor 2.2.2.2 remote-as 2 
R1(config-router)#neighbor 2.2.2.2 ebgp-multihop 2
R1(config-router)#neighbor 2.2.2.2 update-source loo0
R1(config-router)#no auto-summary
R2(config)#router bgp 2
R2(config-router)#no synchronization
R2(config-router)#bgp router-id 2.2.2.2 
R2(config-router)#bgp log-neighbor-changes
R2(config-router)#neighbor 1.1.1.1 remote-as 1
R2(config-router)#neighbor 1.1.1.1 ebgp-multihop 2
R2(config-router)#neighbor 1.1.1.1 update-source loo0
R2(config-router)#no auto-summary

验证BGP邻居关系。

BGP邻居建立要经历以下几个状态:

ldle:BGP被管理性down或者在尝试下一次建立

Connect:BGP进程在等待down或者尝试下一次建立。这个状态无法判断TCP连接是否建立成功。

Active:TCP连接正在建立,同时BGP还未发出BGP数据包。

Opensent:TCP连接建立完成,同时BGP发出BGP数据包。

Openconfirm:收到了邻居的Open数据包,接着BGP只需要发送keeplive数据包保活。

Established:BGP邻居连接建立完成。

目录
相关文章
|
缓存 Kubernetes API
K8S 性能优化 - K8S APIServer 调优
K8S 性能优化 - K8S APIServer 调优
|
Windows
Keil5中恢复默认布局-解决左边栏,底部栏位置不是默认布局
Keil5中恢复默认布局-解决左边栏,底部栏位置不是默认布局
1747 0
|
Java
SpringBoot 配置 Swagger
SpringBoot 配置 Swagger
425 0
|
SQL 监控 关系型数据库
深入解析MySQL死锁:原因、检测与解决方案
深入解析MySQL死锁:原因、检测与解决方案
|
机器学习/深度学习 大数据 算法框架/工具
【Python-Keras】keras.fit()和keras.fit_generator()的解析与使用
本文解析了Keras中的`fit()`和`fit_generator()`方法,解释了两者在训练神经网络模型时的区别和使用场景,其中`fit()`适用于数据集较小且无需数据增强时,而`fit_generator()`适用于大数据集或需要数据增强的情况。
329 2
|
SQL 关系型数据库 MySQL
解决 MySQL 5.7 及以上版本中的 “ONLY_FULL_GROUP_BY“ 错误
解决 MySQL 5.7 及以上版本中的 “ONLY_FULL_GROUP_BY“ 错误
2258 3
|
存储 SQL 关系型数据库
MySQL事务日志奥秘:undo log大揭秘,一文让你彻底解锁!
【8月更文挑战第24天】本文深入探讨了MySQL中undo log的关键作用及其在确保事务原子性和一致性方面的机制。MySQL通过记录事务前的数据状态,在需要时能回滚至初始状态。主要介绍InnoDB存储引擎下的undo log实现,包括undo segment和record的结构,而MyISAM则采用redo log保障持久性而非一致性。通过一个简单的SQL回滚示例,展示了undo log如何在实际操作中发挥作用,帮助读者更好地理解并运用MySQL事务管理功能。
772 0
|
前端开发 Java Spring
10个SpringMVC的核心组件详解
Spring MVC 核心组件包括 DispatcherServlet(前端控制器)、Controller(处理请求)、HandlerMapping(映射请求到方法)、HandlerAdapter(调用不同处理器)、ViewResolver(解析视图)、ModelAndView(传递数据到视图)、数据绑定、异常处理器、消息转换器和主题解析器。这些组件协同工作,支持基于 MVC 的 Web 应用开发,使请求处理、业务逻辑和视图渲染得以有序进行。了解并掌握这些组件有助于深入理解 Spring MVC 的工作原理。【5月更文挑战第2天】
714 4
|
机器学习/深度学习 存储 计算机视觉
基于YOLOv8深度学习的野外火焰烟雾检测系统【python源码+Pyqt5界面+数据集+训练代码】深度学习实战、目标检测(2)
基于YOLOv8深度学习的野外火焰烟雾检测系统【python源码+Pyqt5界面+数据集+训练代码】深度学习实战、目标检测
|
存储 编译器 C语言
【C语言】结构体的大小是如何计算的?(结构体对齐)
【C语言】结构体的大小是如何计算的?(结构体对齐)
419 0