BGP在数据中心的应用3——构建自动化的BGP配置

news2024/12/31 6:35:14

注:

  • 本文根据《BGP in the Datacenter》整理,有兴趣和英文阅读能力的朋友可以直接看原文:https://www.oreilly.com/library/view/bgp-in-the/9781491983416/
  • 上一部分笔记请参考:https://blog.csdn.net/tushanpeipei/article/details/128526841

一、自动化配置基础

在数据中心规模的网络下,自动化是必须的。否则我们只会因为太低的效率而无法实现目标。当然,实现自动化的方式有很多,例如最基础的使用Python脚本多线程配置设备,或者是通过一些开源自动化工具例如Nornir、Ansible对设备进行运维,乃至可以利用基于意图的网络(IBN)等方式实现自动化。总的来说,自动化的方式很多,在这里不会过多的去解释,我们需要将重点集中在BGP本身。

进一步说,任何自动化都需要具体的配置模版,对BGP来说也不例外。我们需要找到BGP的模版,并且该模版需要满足如下需求:

  • 健壮性(robust):足够的健壮性才能减少变动带来的危险;
  • 避免重复:长期的实践证明,重复的配置容易导致错误。

二、数据中心架构举例

后续的知识点涉及到配合拓扑进行说明,在这里我们使用的拓扑如图1所示:
在这里插入图片描述

图1:数据中心网络架构图

在我们的网络中,我们配置了以下内容:

  • Leaf,Leaf01到Leaf04;
  • Spine,Spine01到Spine02;
  • Exit01,Exit01到Exit02;
  • Server,Server01到Server04除服务器;
  • 设备之间统一运行eBGP。

三、BGP自动化中存在的痛点

首先我们来看一下一个常见的BGP配置。这里以图1中的Leaf01的BGP配置为例子

router bgp 65000 //该Speaker的ASN
	bgp router-id 10.0.254.1 //通告Router-id来唯一标识一台Speaker
	bgp log-neighbor-changes //自动log邻居状况的改变
	bgp no default ipv4-unicast //默认不在ipv4-unicast地址簇中建立邻居
	timers bgp 3 9 //设置的keepalive和hold定时器
	neighbor peer-group ISL //定义具有相同策略的对等体组
	neighbor ISL remote-as 65500 //该对等体组的ASN
	neighbor ISL advertisement-interval 0 //设置Update消息的通告时间
	neighbor ISL timers connect 5 //设置connect定时器的时间
	neighbor 169.254.1.0 peer-group ISL //将目标地址加入对等体组
	neighbor 169.254.1.64 peer-group ISL //同上
	address-family ipv4 unicast //进入ipv4-unicast地址簇中
		neighbor ISL activate //在该地址簇中与所有ISL对等体的成员建立邻居关系
		network 10.0.254.1/32 //通告网关网络进入BGP
		network 10.1.1.0/26 //通告下连服务器的子网地址进入BGP
		aximum-paths 64 //设置最大的mutipath数量
  	exit-address-family 

根据上述的配置我们可以看到首先其中出现了重复(duplication)。例如,例如,10.1.254.1被指定两次,一次有/32(网络通告),一次没有(router-id)。如果代码经验丰富的话,我们能可以很清楚在编写代码时需要避免重复的代码。这是因为如果重复点出现问题,我们需要同时修改多处。但是通常,我们容易忽略一些其他的重复点。例如,在上面点BGP配置中,如果我们节点配置的网关IP地址10.0.254.1已经被分配给了其他设备,但是我们仅仅修改了network部分,却忽略了修改router-id,这当导致一些邻居建立的故障(在peering iBGP邻居时)。

进一步说,这种配置还假设每个Leaf下行只有一个VLAN或子网。如果有多个子网,将它们全部列出的个将是不可扩展的,并且无法读取。接下来再来看看Spine01上的配置:

router bgp 65534
	bgp router-id 10.0.254.254
	bgp log-neighbor-changes
	bgp no default ipv4-unicast
	timers bgp 3 9
	neighbor peer-group ISL
	neighbor ISL advertisement-interval 0 
	neighbor ISL timers connect 5 
	neighbor 169.254.1.1 remote-as 65000 
	neighbor 169.254.1.1 peer-group ISL 
	neighbor 169.254.1.3 remote-as 65001 
	neighbor 169.254.1.3 peer-group ISL 
	neighbor 169.254.1.5 remote-as 65002 
	neighbor 169.254.1.5 peer-group ISL 
	neighbor 169.254.1.5 remote-as 65003 
	neighbor 169.254.1.7 peer-group ISL 
	bgp bestpath as-path multipath-relax 
	address-family ipv4 unicast
		neighbor ISL activate 
		network 10.0.254.254/32 
		maximum-paths 64
  exit-address-family

可以看到,在Leaf节点上出现的问题也存在于Spine节点的配置中。当然,结合Leaf和Spine的配置,我们也可以看到一些配置正确的点:

  • 每一条链路使用/31位的网络号,能节约IP地址;
  • 网关地址以32位路由的形式被单独通告了出来,和服务器所在子网不同;
  • 假设每一个机架有40台服务器,我们需要给每个机架分配的子网为/26,其覆盖64-2个IP地址,可以满足现状和拓展需求。

总结一下BGP配置中遇到的困难。配置中存在了太多的IP地址,这意味着我们在多个地方有重复信息。因此随着新IP地址的添加和删除,配置变得脆弱和不可扩展。

四、重分发路由

我们可以看到IP地址主要出现在标识邻居以及network路由条目的配置中。首先我们来解决network路由时出现的IP路由信息。我们知道,BGP“发现路由”目前主要通告两种方式,一是通告network命令将本地已经存在的路由通告进入BGP中,还有一种则是通告重分发(redistribute)的方式将路由通告进入BGP。重发布命令如下所示(不同厂商可能会不同):redistribute protocol route-map route-map-name。

其中的协议(protocol)关键字段指的是静态(static)、直连(connected)、ospf、isis、bgp等不同种类的路由。例如,我们想要将直连路由重分发进入到BGP可以在节点上输入:使用redistribute connected命令即可。这种情况下,我们在BGP的配置中就代替了network+IP网段。然而,这种不加修饰的重分发通常会将额外的一些路由发布到BGP,所以这里我们需要通告路由策略(routing policy)来限制重分发的路由,仅仅允许我们需要的路由进入BGP中。

五、路由策略

路由策略(routing policy)可以最直接的功能就是帮助我们允许和拒绝路由。此外,它还可以匹配对应的路由,并调整路由的属性。进一步说,Route-maps是路由策略的一个普遍的实现方式,当然不同厂商的命令可能不同,但是大体都是按照如下的格式进行配置的:

route-map NAME (permit|deny) [sequence_number] 
	match classifier
	set action

其中,NAME关键字这为策略分配了一个名称,permit|deny关键字则指示匹配的路由是被允许还是拒绝,sequence_number则是该规则的执行顺序(同一个route-map下可以有多个策略)。接下来进入match子句,如果匹配子句成功匹配分类器(classifer),则该集合子句对路由起作用。这时,当我们在该语句使用的是permit关键字时,则执行set子句后的动作(action)并放行,如果没有动作,则默认放行。但当我们使用deny关键字时,match失败时会应用set后的动作。换句话说,拒绝函数作为“非(not)”运算符:如果有匹配,请拒绝路由;没有匹配,则执行动作并放行。最后,所有route-map的末尾有一个隐式的“拒绝”。因此,如果没有匹配的条目,结果就是拒绝输入。

此外,支持BGP协议的Classifiers十分丰富,如下所示:

  • as-path:匹配BGP的AS_PATH属性;
  • community:匹配BGP路由的团体属性;
  • ext- community:匹配BGP路由的拓展团体属性;
  • interface:匹配路由下一跳的接口的名称;
  • ip/ipv6:匹配人任意的IP地址,下一跳以及原地址(前缀列表);
  • local- preference:匹配BGP路由的本地优先级;
  • metric:匹配路由的metric;
  • origin:匹配路由的ORIGIN属性;
  • peer:匹配对等体。

在这里我们给出一个route map的配置案例,如下所示:

route-map EXCEPT_ISL_ETH0 deny 10
   match interface swp51
route-map EXCEPT_ISL_ETH0 deny 20
   match interface swp52
route-map EXCEPT_ISL_ETH0 deny 30
   match interface eth0
route-map EXCEPT_ISL_ETH0 permit 40
redistribute connected route-map EXCEPT_ISL_ETH0

可以看到,该route-map允许其他所有的直连路由重分发进入BGP,但是拒绝来上行swp51,swp52接口以及管理接口eth0的网段被通告进入BGP。但是这是不安全的,因为在最后一步允许了所有的路由进入BGP,违反了安全route map的设计方式:永远拒绝那些不是明确允许的路由。因此我们需要使用的route-map是明确允许可以放行的路由,然后拒绝其他不是明确允许的路由。也就是在多个permit节点后拒绝所有其他的路由,这与上述演示正好相反。当然如果需要允许的节点太多,我们可以通过一些聚合的方式批量匹配路由。

接下来,我们继续探索一些route-map的使用点。不仅仅在重发布的时候我们可以调用route-map,我们还可以在指定对等体时,在出方向和入方向过滤路由、改变路由属性,如下所示:

eighbor 169.254.1.1 route-map NBR_RT_ACCEPT in
neighbor 169.254.1.1 route-map NBR_RT_ADV out

或者在network时对其进行调用:

network 10.1.1.1/24 route-map ADV_NET

最后,我们需要注意的是使用route-policy时候的性能调优。BGP是一种路径向量(path-vector)路由协议,因此在运行最佳路径算法之前,它不会宣布路由更新。route-map通常应用于数据包接收和数据包发送。如果一个BGP Speaker有数十个或数百个邻居,并且这些邻居都附有route-map,那么他会在通告路由之前之前为每个邻居运行route-map,将会在很大程度上降低设备CPU处理转发流量的性能。

因此,我们通常使用peer-groups技术来解决这个问题。peer-group中的所有成员(必须具有统一的功能)具有一个统一的route map。因此,对于整个peer-group的所有成员执行路由通告或者撤销的时,我们仅仅只需要执行一次route-map。

六、使用接口名字作为邻居标识

在上述两个小节中,我们探索了使用重分发+路由策略的方式减少了BGP配置中由于network命令引入的IP网段信息。接下来,我们可以使用接口名字作为邻居标识,进一步的减少在BGP配置中指定对端设备地址时配置的IP地址信息。

可以看到在Clos网络架构中,每一层设备之间建立了大量的连接,但是这些连接都是点到点(P2P)的形式。因此我们可以使用/31位掩码来覆盖每条链路的2个IP地址。同时,一台设备肯定是知道自己接口上的IP地址,那么就能快速推导出对端的IP地址为该网段的另外一个。在这种情况下,我们可以不指定对等体IP地址,而通过指定本地接口的形式与对端建立BGP邻居关系。(注:这种方式仅仅能使用在/30或者/31掩码的情况下)。

例如,我们可以将Leaf01的BGP配置进行如下的修改:

neighbor 169.254.1.0 peer-group ISL
neighbor 169.254.1.64 peer-group ISL

上面是使用IP地址指定对等体的情况,接下来我们可以将IP地址替换为本地的接口名称:

neighbor swp51 interface peer-group ISL
neighbor swp52 interface peer-group ISL

最终,通过上述优化后,Leaf01和Spine01的配置分别变为了下面这种形式:

Leaf01:

ip prefix-list DC_LOCAL_SUBNET 5 permit 10.1.0.0/16 le 26
ip prefix-list DC_LOCAL_SUBNET 10 permit 10.0.254.0/24 le 32

route-map ACCEPT_DC_LOCAL permit 10
	match ip-address DC_LOCAL_SUBNET
  
router bgp 65000
	bgp router-id 10.0.254.1
	bgp log-neighbor-changes
	bgp no default ipv4-unicast
	timers bgp 3 9
	neighbor peer-group ISL
	neighbor ISL remote-as 65500
	neighbor ISL advertisement-interval 0
	neighbor ISL timers connect 5
	neighbor swp51 peer-group ISL
	neighbor swp52 peer-group ISL
	address-family ipv4 unicast
		neighbor ISL activate
		redistribute connected route-map DC_LOCAL
		maximum-paths 64
	exit-address-family

Spine01:

ip prefix-list ACCRT 5 permit 10.1.0.0/16 le 26
ip prefix-list ACCRT 10 permit 10.0.254.0/24 le 32
    
route-map DC_LOCAL permit 10
	match ip-address ACCRT
    
router bgp 65500
	bgp router-id 10.0.254.254
	bgp log-neighbor-changes
	bgp no default ipv4-unicast
	timers bgp 3 9
	neighbor peer-group ISL
	neighbor ISL advertisement-interval 0
	neighbor ISL timers connect 5
	neighbor swp1 remote-as 65000
	neighbor swp1 peer-group ISL
	neighbor swp2 remote-as 65001
	neighbor swp2 peer-group ISL
	neighbor swp3 remote-as 65002
	neighbor swp3 peer-group ISL
	neighbor swp4 remote-as 65003
	neighbor swp4 peer-group ISL
	bgp bestpath as-path multipath-relax
	address-family ipv4 unicast
		neighbor ISL activate
		redistribute connected route-map DC_LOCAL
		maximum-paths 64
	exit-address-family

到此,我们已经可以通过route-map加上重分发,以及接口代替IP地址的方式让整个BGP配置模版更加的通用和减少了重复点。但是,我们还是可以看到,在BGP的配置中依然存在大量的ASN,以及在链路的两端依然配置了IP地址。那么,我们能否用一些方法去替代ASN和接口IP地址的配置?这将是我们下一个笔记中探讨的内容。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/137988.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【回答问题】ChatGPT上线了!推荐20个姿态估计深度学习模型

推荐20个姿态估计深度学习模型 好的,这里是 20 个深度学习模型用于姿态估计的推荐: 2D/3D Convolutional Neural Networks Recurrent Neural Networks Self-supervised Learning Generative Adversarial Networks Attention-based Networks Graph Neur…

git add .卡住不动

问题描述 代码修改完了准备上传到github,使用 git add . 命令发现一直卡住不动了。没办法只能强行退出,如下图所示。 解决办法 研究了一番,发现了这类问题的套路,在此给大家提供一个debug的思路。 首先需要知道,git a…

保姆级手把手图文并茂教你配置MAC系统Flutter环境

Flutter 是什么 Flutter是Google开源的构建用户界面(UI)工具包,帮助开发者通过一套代码库高效构建多平台精美应用,支持移动、Web、桌面和嵌入式平台。Flutter 开源、免费,拥有宽松的开源协议,适合商业项目…

返回一个数组中所有元素的小数部分、整数部分为两个数组 numpy.modf()

【小白从小学Python、C、Java】 【计算机等级考试500强双证书】 【Python-数据分析】 返回一个数组中所有元素的 小数部分、整数部分 为两个数组 numpy.modf() [太阳]选择题 关于以下python代码表述错误的一项是? import numpy as np anp.array([-0.5,1,1.5]) print…

《对线面试官》| 高频计算机网络面试题

目录1、说说 OSI 七层模型和 TCP/IP 四层模型的关系和区别2、说说 TCP 与 UDP 的区别3、TCP 是如何实现数据的可靠性?4、 TCP 协议如何提高传输效率?5、你知道 TCP 如何处理拥塞吗?6、为什么 TCP 链接需要三次握手,两次不可以么&a…

小程序后台数据交互-个人中心

目录 一,获取用户昵称和头像 登录过程 二,登录-小程序 三,后台 小程序服器配置 一,获取用户昵称和头像 登录过程 小程序登录 小程序可以通过微信官方提供的登录能力方便地获取微信提供的用户身份标识,快速建立小…

SOFARegistry | 聊一聊服务发现的数据一致性

文|肖健(花名:昱恒)蚂蚁集团技术专家专注于服务发现领域,目前主要从事蚂蚁注册中心 SOFARegistry 设计、研发工作。本文 9492 字 阅读 24 分钟PART. 1前言1.1 什么是服务发现在微服务的体系中,多个应用程序…

Hydra(九头蛇)工具使用

Hydra工具使用1.Hydra简介1.1.Hydra介绍1.2.Hydra支持协议1.3.Hydra下载2.Hydra使用2.1.Hydra基本使用方式2.2.Hydra常用参数2.3.Hydra注意事项2.4.Kail字典2.5.Hydra密码生成器3.Hydra案例3.1.创建账号密码文件3.2.SSH协议爆破3.2.1.靶机信息3.2.2.开始爆破3.2.2.1.不知账号3.…

C#语言实例源码系列-游戏-实现华容道

专栏分享点击跳转>Unity3D特效百例点击跳转>案例项目实战源码点击跳转>游戏脚本-辅助自动化点击跳转>Android控件全解手册 👉关于作者 众所周知,人生是一个漫长的流程,不断克服困难,不断反思前进的过程。在这个过程中…

Rust个人学习之聊聊Rust的变量

今天看了Rust的变量相关内容,Rust变量很重要的一个设计点是: Rust变量默认是不可变的。 很难理解? 我们接下来一起研究一下Rust的变量, 在Rust中变量是通过关键字let进行声明的 let x 5; 上述语句就是定义了一个名称为x的变量,变量的值为…

修改esp idf hello_world_main.c,验证Strategy 策略基类。出现一个问题,加以解决

修改esp32 idf hello_world_main.c,验证Strategy 策略基类。出现几个问题,加以解决: 错误: …/main/hello_world_main.cpp: In function ‘void test01()’: …/main/hello_world_main.cpp:77:12: error: deleting object of ab…

入门力扣自学笔记228 C++ (题目编号:2042)

2042. 检查句子中的数字是否递增题目:句子是由若干 token 组成的一个列表,token 间用 单个 空格分隔,句子没有前导或尾随空格。每个 token 要么是一个由数字 0-9 组成的不含前导零的 正整数 ,要么是一个由小写英文字母组成的 单词…

很好用的gRPC和WebSocket调试工具Apipost!强烈推荐

随着软件开发行业的发展,越来越多的公司和开发人员在工作中会涉及到gRPC和WebSocket等接口类型,但是目前市面上能支持这种接口的调试工具却几乎没有,国外的工具大都晦涩难懂,不符合我们的开发习惯,很难上手使用。 经过…

Android开发——APP ANR治理

一、背景介绍 ANR(Application Not Response)指应用程序无响应,通常出现在主线程被阻塞时,并伴随ANR弹窗出现。ANR发生时要么关闭当前app,要么等待,等待的结果大概率还是继续ANR,最终需要杀掉应…

在msys2上安装武汉大学的开源PPP解算软件-PRIDE PPP-AR

最近一篇文章《免费提供POSMV的GNSS数据解算服务,验潮仪丢失的一种补救》发表了以后,有一位相识的网友提供了一个重要信息:武汉大学PPP解算软件名字为PRIDE PPP-AR 开源了,其GUI自动下载星历文件进行自主解算。PRIDE PPP-AR 的官网…

2022年中小企业数字化转型路径报告(附下载链接)

省时查报告-专业、及时、全面的行研报告库省时查方案-专业、及时、全面的营销策划方案库【免费下载】2022年11月份热门报告盘点罗振宇2023年跨年演讲PPT原稿吴晓波2022年年终秀演讲PPT原稿2023年,如何科学制定年度规划?《底层逻辑》高清配图清华大学256页…

(机器学习深度学习常用库、框架|Pytorch篇)第三节:Pytorch之torchvision详解

文章目录一:torchvision概述二:torchvision.datasets(1)官方数据集(2)自定义数据集类(3)ImageFolder手动实现三:torchvision.transforms四:torchvision.model…

【元宇宙欧米说】左手追星,右手造富——用Web3加持娱乐行业

娱乐圈如何才能与资本市场保持步调一致?Web3浪潮来袭,文娱行业如何才能踏上Web3世界的巨轮? 1月4日下午三点,VegaIdol联合创始人Linnea将以**“左手追星,右手造富——用Web3加持娱乐行业”为题,与大家共同…

界面组件DevExpress WinForms v22.2 -全新升级的皮肤和矢量图标

DevExpress WinForms拥有180组件和UI库,能为Windows Forms平台创建具有影响力的业务解决方案。DevExpress WinForms能完美构建流畅、美观且易于使用的应用程序,无论是Office风格的界面,还是分析处理大批量的业务数据,它都能轻松胜…

RabbitMQ的简单介绍与使用

前言:大家好,我是小威,24届毕业生,曾经在某央企公司实习,目前入职某税务公司。本篇文章将记录和分享RabbitMQ相关的知识点。 本篇文章记录的基础知识,适合在学Java的小白,也适合复习中&#xff…