分布式 L2 网关下的 OVS 未知单播泛洪

大家读完觉得有意义和帮助记得关注和点赞!!!

目录

1 问题描述

2 基础设施和环境信息

3 故障排除

3.1 确认:单播泛洪

3.2 确认:所有泛洪流量都以 L2 GW 为目标

3.3 验证:容器 ARP 处于活动状态时,OVS fdb 条目过时

3.4 分布式 L2 GW 行为:取决于供应商

有关物理交换机 ARP 老化的更多信息

3.5 修复

4 总结

引用


在分布式 L2 网关环境(例如 Spine-Leaf)中,ARP 老化时间配置错误可能会导致 OVS 单播泛洪。而且,的行为 分布式 L2 网关产品因供应商而异。

1 问题描述

一位内部用户报告说,他们注意到了一些实例 (docker containers)定期获得相对较大的怀疑入口流量 - 甚至 如果他们的实例没有提供服务,如下所示:

图 1.1 对实例的周期性入口流量持怀疑态度

2 基础设施和环境信息

本节提供了一些基本的基础设施信息,以帮助理解 问题。更多详细信息,请参考我之前的文章 携程 云计算时代的网络架构演进。

数据中心网络采用 Spine-Leaf 架构,具有 Leaf 节点 用作分布式 L2 和 L3 网关。

图 2.1 数据中心网络拓扑

在每个计算主机内部,所有连接到 OVS 网桥的实例以及 容器内的默认路由指向其自己的(分布式)网关。

图 2.2 主机内部的虚拟网络拓扑

别人:

  • OVS 版本: ,2.3.12.5.6
  • Linux 内核:4.14

3 故障排除

3.1 确认:单播泛洪

调用,并且不费吹灰之力,我们确认了这些流量 不是容器的目标,即这些定期数据包的 和 都不是实例的 IP/MAC。所以我们得到了第一个结论:OVS 正在进行单播泛洪 [1]。tcpdumpdst_ipdst_mac

单播泛洪意味着 OVS 不知道数据包的位置,因此 它复制了此数据包,并将此数据包的副本发送到所有接口 具有相同的 VLAN 标记。例如,在图 2.2 中,的出口流量将 复制到 ,但不是 和 。dst_macinst1inst2inst3inst4

3.2 确认:所有泛洪流量都以 L2 GW 为目标

接下来的问题是,为什么 OVS 不知道 .dst_mac

这些泛洪数据包的日志各不相同,它们来自不同的 IP 地址,并且 也选择了不同的 IP 地址。

但进一步研究捕获的数据包,我们发现所有这些数据包都泛滥了 共享同一dst_mac的数据包,假设 .我们花了 过了一会儿,才弄清楚这是我们的 Spine-Leaf 网络(此 MAC 是手动编码的,由另一个团队负责, 这就是为什么我们一开始没有确定它)。00:11:22:33:44:55

3.3 验证:容器 ARP 处于活动状态时,OVS fdb 条目过时

OVS fdb 是什么样子的:

<span style="color:#333333"><span style="background-color:#f8f8f8"><span style="background-color:#f6f8fa"><code><span style="color:#008080">$ </span>ovs-appctl fdb/show br-int
 port  VLAN  MAC                Age
    1     0  c2:dd:d2:40:7c:15    1
    2     0  04:40:a9:db:6f:df    1
    2     4  00:11:22:33:44:55    16
    2     9  00:11:22:33:44:55    6
</code></span></span></span>

接下来,我们想验证我们的假设:L2 GW 在 OVS fdb 中的条目将是 此问题发生时已过时。

幸运的是,问题每 20 分钟发生一次(结果发现有一些 产生流量的周期性作业),因此我们很容易捕获 我们想要的任何东西。我们使用以下命令来检查该条目是否存在。在 在本例中,实例具有 VLAN 标记 ,因此我们 grep pattern 。4" 4 00:11:22:33:44:55"

<span style="color:#333333"><span style="background-color:#f8f8f8"><span style="background-color:#f6f8fa"><code><span style="color:#000000"><strong>for </strong></span>i <span style="color:#000000"><strong>in</strong></span> <span style="color:#000000"><strong>{</strong></span>1..1800<span style="color:#000000"><strong>}</strong></span>; <span style="color:#000000"><strong>do
    </strong></span><span style="color:#0086b3">echo</span> <span style="color:#dd1144">$(</span><span style="color:#0086b3">date</span><span style="color:#dd1144">)</span> <span style="color:#dd1144">" "</span> <span style="color:#dd1144">$(</span>ovs-appctl fdb/show br-int | <span style="color:#0086b3">grep</span> <span style="color:#dd1144">" 4 00:11:22:33:44:55"</span><span style="color:#dd1144">)</span> <span style="color:#000000"><strong>>></strong></span> fdb.txt;
    <span style="color:#0086b3">sleep </span>1;
<span style="color:#000000"><strong>done</strong></span>
</code></span></span></span>

通常,打印是这样的:

<span style="color:#333333"><span style="background-color:#f8f8f8"><span style="background-color:#f6f8fa"><code>2     4  00:11:22:33:44:55    16
2     4  00:11:22:33:44:55    17
2     4  00:11:22:33:44:55    18
2     4  00:11:22:33:44:55    19
2     4  00:11:22:33:44:55    0
...
</code></span></span></span>

在测试过程中,我们发现打印消失了几分钟,并且这个 period 与有问题的 period 完全匹配。所以第二个结论: fdb 条目确实在容器内的 ARP 条目之前失效(因为 容器使用此 ARP 条目传输这些数据包)。

但仍然存在一个问题:容器的流量不是 在泛洪期间中断,这意味着从网关到 Container 已经成功地被 Container 接收,所以从 Container 的角度来看, 它不受此泛洪行为的影响(但如果泛洪流量 非常大,容器可能会受到影响,因为 这个案例)。

简而言之:gateway 已经回复了它从容器收到的每一个请求,为什么 OVS 没有刷新网关的 fdb 条目?理论上,OVS 会这样做,因为 回复是源自 Gateway 的单播数据包。我们错过了什么吗?

3.4 分布式 L2 GW 行为:取决于供应商

云中,来自网关的单播回复可能是 与在容器中看到的不同?src_macGW_MAC

为了验证,我调用了一个非常简单的流量,从容器 ping GW,打印每个数据包的 和 MAC 地址:srcdst

<span style="color:#333333"><span style="background-color:#f8f8f8"><span style="background-color:#f6f8fa"><code><span style="color:#008080">$ </span>tcpdump <span style="color:#000080">-n</span> <span style="color:#000080">-e</span> <span style="color:#000080">-i</span> eth1 host 10.60.6.1 and icmp
fa:16:3e:96:5e:3e <span style="color:#000000"><strong>></strong></span> 00:11:22:33:44:55, 10.6.6.9 <span style="color:#000000"><strong>></strong></span> 10.60.6.1: ICMP <span style="color:#0086b3">echo </span>request, <span style="color:#0086b3">id </span>7123, <span style="color:#0086b3">seq </span>1, length 64
70:ea:1a:aa:bb:cc <span style="color:#000000"><strong>></strong></span> fa:16:3e:96:5e:3e, 10.6.6.1 <span style="color:#000000"><strong>></strong></span> 10.60.6.9: ICMP <span style="color:#0086b3">echo </span>reply, <span style="color:#0086b3">id </span>7123, <span style="color:#0086b3">seq </span>1, length 64
fa:16:3e:96:5e:3e <span style="color:#000000"><strong>></strong></span> 00:11:22:33:44:55, 10.6.6.9 <span style="color:#000000"><strong>></strong></span> 10.60.6.1: ICMP <span style="color:#0086b3">echo </span>request, <span style="color:#0086b3">id </span>7123, <span style="color:#0086b3">seq </span>2, length 64
70:ea:1a:aa:bb:cc <span style="color:#000000"><strong>></strong></span> fa:16:3e:96:5e:3e, 10.6.6.1 <span style="color:#000000"><strong>></strong></span> 10.60.6.9: ICMP <span style="color:#0086b3">echo </span>reply, <span style="color:#0086b3">id </span>7123, <span style="color:#0086b3">seq </span>2, length 64
</code></span></span></span>

就是这样!为什么应答数据包具有 MAC 地址而不是 ?谁是 ?我们收到通知 这是分布式 L2 GW 的真实 MAC 之一,而后者 是虚拟 MAC。这就是问题所在!GW 使用与 00:11:22:33:44:55 不同的 MAC 进行回复,因此 OVS fdb 永远不会刷新此条目,因此 洪水仍在继续70:ea:1a:aa:bb:cc00:11:22:33:44:5570:ea:1a:aa:bb:cc

这是 Cisco 设备的行为,我们进一步检查了我们的 H3C 设备, 令人惊讶的是,在相同条件下,H3C 的回复是一致的: 它始终用于发送和接收。 到目前为止,我还没有关于什么是分布式 L2(和 L3)的明确答案 应该表现得好。00:11:22:33:44:55

有关物理交换机 ARP 老化的更多信息

Cisco 交换机为每个 IP 维护一个 ARP 计时器,默认为 ( 分钟) [4]。1500s25

<span style="color:#333333"><span style="background-color:#f8f8f8"><span style="background-color:#f6f8fa"><code>LEAF <span style="color:#999988"><em># show ip arp vrf test | in 2001</em></span>
10.6.2.227 00:01:12 fa16.xxxx.97c7 Vlan2001
10.6.2.228 00:01:15 fa16.xxxx.97c8 Vlan2001
10.6.2.229 00:01:33 fa16.xxxx.97c9 Vlan2001
</code></span></span></span>

如果几分钟内没有来自此 ARP 的帧,它将向此 IP(主机)发送免费 ARP。19

<span style="color:#333333"><span style="background-color:#f8f8f8"><span style="background-color:#f6f8fa"><code>Host <span style="color:#008080">$ </span>tcpdump <span style="color:#000080">-en</span> <span style="color:#000080">-i</span> eth0 ether src 00:11:22:33:44:55
15:26:31.650401 00:11:22:33:44:55 <span style="color:#000000"><strong>></strong></span> fa:16:xx:67, vlan 2001, ARP, Request who-has 10.6.2.241 <span style="color:#000000"><strong>(</strong></span>fa:16:xx:67<span style="color:#000000"><strong>)</strong></span> tell 10.6.2.1
15:27:06.023959 00:11:22:33:44:55 <span style="color:#000000"><strong>></strong></span> fa:16:xx:c5, vlan 2001, ARP, Request who-has 10.6.2.73  <span style="color:#000000"><strong>(</strong></span>fa:16:xx:c5<span style="color:#000000"><strong>)</strong></span> tell 10.6.2.1
15:27:07.594005 00:11:22:33:44:55 <span style="color:#000000"><strong>></strong></span> fa:16:xx:aa, vlan 2001, ARP, Request who-has 10.6.2.7   <span style="color:#000000"><strong>(</strong></span>fa:16:xx:aa<span style="color:#000000"><strong>)</strong></span> tell 10.6.2.1
</code></span></span></span>

3.5 修复

这个问题是由分布式 L2 GW 行为引发的,但实际上它是一个 host 内部的配置错误:我们应该始终确保 intermediate 转发设备(在本例中为 OVS 网桥)的老化时间比 实例本身和物理交换机 ARP 老化时间

Linux 内核的 ARP 老化机制真的很复杂,而不是一个或 多个参数,它由参数和状态的组合控制 机器,请参考这篇文章 [3] 如果你是 感兴趣。将 OVS fdb aging 设置为 对我们来说足够安全:1800s

<span style="color:#333333"><span style="background-color:#f8f8f8"><span style="background-color:#f6f8fa"><code><span style="color:#008080">$ </span>ovs-vsctl <span style="color:#0086b3">set </span>bridge br-int  other_config:mac-aging-time<span style="color:#000000"><strong>=</strong></span>1800
<span style="color:#008080">$ </span>ovs-vsctl <span style="color:#0086b3">set </span>bridge br-bond other_config:mac-aging-time<span style="color:#000000"><strong>=</strong></span>1800
</code></span></span></span>

(上述配置在 OVS 和系统重启后仍然存在。

配置完成后,问题消失了:

图 3.1 问题消失

4 总结

内核通常有一个 ARP 老化时间比 OVS fdb 长(默认为 300 秒),因此在某些情况下,当 网关的 MAC 条目在 ARP 表中仍然有效,它在 OVS fdb 中已过时。 因此,网关的下一个出口数据包 (with ) 将触发 OVS 单播泛洪。dst_mac=GW_MAC

当从网关收到正确响应的数据包时,OVS fdb 将刷新 网关的 MAC 条目,则后续的单播泛洪将停止(转换为 正常的 L2 转发,因为 OVS 知道 其中 is)。GW_MAC

确切地说,真正的灾难是 gateway 响应错误:

  1. 网关是一个分布式 L2 网关,具有一个虚拟 MAC 和许多实例 MAC(与负载均衡器中的 VIP 和实例 IP 的概念相同)
  2. 从容器到网关的出口流量使用网关的虚拟 MAC
  3. 从网关到容器的响应流量使用其真实 MAC 之一 (实例 MAC)

在这种情况下,OVS fdb 不会被刷新,因此 OVS 将每 egress 数据包,直到 网关主动将其虚拟 MAC 通告给容器或容器 向网关发起主动 ARP 请求 - 此泛洪期可能会持续 几分钟,并且同一 VLAN 中的所有流量(如果 VLAN 未使用)将累积/复制到连接到 OVS 的每个实例。

如果您将 QoS 设置为 容器正在使用的 OVS 接口。

引用

  1. Cisco Doc:单播泛洪
  2. 云计算时代的携程网络架构演进
  3. Linux 实现的 ARP 老化时间原理分析
  4. Cisco Doc:ip arp 超时设置

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

天猫推荐数据集实践

参考自 https://github.com/xufengtt/recom_teach_code&#xff0c;学习记录。 环境配置&#xff08;maxcomputedataworks&#xff09; 下载天猫推荐数据集&#xff1b;开启 aliyun 的 maxcompute&#xff0c;dataworks&#xff0c;pai&#xff1b;使用 odpscmd 上传本地数据…

库的概念:动态库与静态库

在软件开发中&#xff0c;库是代码复用的核心工具&#xff0c;它帮助开发者避免重复造轮子&#xff0c;提升开发效率。库可以分为动态库和静态库&#xff0c;这两者在程序开发中的使用方式、链接过程和性能上存在显著区别。本文将详细讲解动态库与静态库的定义、区别、链接过程…

Flink源码解析之:如何根据JobGraph生成ExecutionGraph

Flink源码解析之&#xff1a;如何根据JobGraph生成ExecutionGraph 在上一篇Flink源码解析中&#xff0c;我们介绍了Flink如何根据StreamGraph生成JobGraph的流程&#xff0c;并着重分析了其算子链的合并过程和JobGraph的构造流程。 对于StreamGraph和JobGraph的生成来说&…

风力涡轮机缺陷检测数据集,91.4%准确识别率,18912张图片,支持yolo,PASICAL VOC XML,COCO JSON格式的标注

风力涡轮机缺陷检测数据集&#xff0c;91.4&#xff05;准确识别率&#xff0c;18912张图片&#xff0c;支持yolo&#xff0c;PASICAL VOC XML&#xff0c;COCO JSON格式的标注 数据集下载&#xff1a; &#xff59;&#xff4f;&#xff4c;&#xff4f; &#xff56;&#…

系统设计——大文件传输方案设计

摘要 大文件传输是指通过网络将体积较大的文件从一个位置发送到另一个位置的过程。这些文件可能包括高清视频、大型数据库、复杂的软件安装包等&#xff0c;它们的大小通常超过几百兆字节&#xff08;MB&#xff09;甚至达到几个吉字节&#xff08;GB&#xff09;或更大。大文…

linux中执行命令

1.1 命令格式 命令格式&#xff1a; 主命令 选项 参数&#xff08;操作对象&#xff09; 命令分为两类&#xff1a; 内置命令&#xff08; builtin &#xff09;&#xff1a;由 shell 程序自带的命令 外部命令&#xff1a;有独立的可执行程序文件&#xff0c;文件名即命令…

Elasticsearch:当混合搜索真正发挥作用时

作者&#xff1a;来自 Elastic Gustavo Llermaly 展示混合搜索何时优于单独的词汇或语义搜索。 在本文中&#xff0c;我们将通过示例探讨混合搜索&#xff0c;并展示它与单独使用词汇或语义搜索技术相比的真正优势。 什么是混合搜索&#xff1f; 混合搜索是一种结合了不同搜索…

Python pyside6 设置的一个《广告图片生成器》

一、图&#xff1a; 二、说明书&#xff1a; 广告图片生成器使用说明 软件功能 这是一个用于生成广告图片的工具&#xff0c;可以快速制作包含产品图片和文字的广告图片。 主要特点 自定义广告尺寸&#xff08;默认620420像素&#xff09; 智能去除产品图片背景 自动排版&…

Spark基本介绍

一&#xff0c;Spark是什么 1.定义&#xff1a;Aache Spark是用于大规模数据处理的统一分析引擎。 二&#xff0c;Spark的发展 三&#xff0c;Spark的特点 高效性 计算速度快 提供了一个全新的数据结构RDD&#xff08;弹性分布式数据集&#xff09;。整个计算操作&#xff0c;…

Elasticsearch操作笔记版

文章目录 1.ES索引库操作(CRUD)1.mapping常见属性(前提)2.创建索引库3.查询&#xff0c;删除索引库4.修改索引库 2.ES文档操作(CRUD)1.新增文档2.查询、删除文档查询返回的数据解读&#xff1a; 3.修改文档 3.RestClient操作(索引库/文档)(CRUD)1.什么是RestClient2.需要考虑前…

EFEVD: Enhanced Feature Extraction for Smart Contract Vulnerability Detection

假设&#xff0c;攻击者在合约 Dao 内存放有 1 Ether 攻击者调用 withdraw 函数&#xff0c;提取 1 Ether&#xff1b; 函数执行到 require 之后&#xff0c; balances 之前时&#xff0c;6789-6789-6789- contract Dao {function withdraw() public {require(balances[msg.…

我的线代观-秩(向量,矩阵)

都说秩是线代中不可避免的一环&#xff0c;当然&#xff0c;它其中最重要的一环。 我在学习线代之后&#xff0c;也有这种感受&#xff0c;它有着一种很绕的感受。 1.矩阵中 在矩阵中&#xff0c;它的秩是怎么定义的呢。它常常与行列式扯上关系&#xff0c;我们拿三阶矩阵为例…

ES IK分词字典热更新

前言 在使用IK分词器的时候&#xff0c;发现官方默认的分词不满足我们的需求&#xff0c;那么有没有方法可以自定义字典呢&#xff1f; 官方提供了三种方式 一、ik本地文件读取方式 k插件本来已为用户提供自定义词典扩展功能&#xff0c;只要修改配给文件即可&#xff1a; …

基于Spring Boot的电影网站系统

一、技术架构 后端框架&#xff1a;Spring Boot&#xff0c;它提供了自动配置、简化依赖管理、内嵌式容器等特性&#xff0c;使得开发者可以快速搭建起一个功能完备的Web应用。 前端技术&#xff1a;可能采用Vue.js、JS、jQuery、Ajax等技术&#xff0c;结合Element UI等组件库…

C#运动控制系统:雷赛控制卡实用完整例子 C#雷赛开发快速入门 C#雷赛运动控制系统实战例子 C#快速开发雷赛控制卡

雷赛控制技术 DMC系列运动控制卡是一款新型的 PCI/PCIe 总线运动控制卡。可以控制多个步进电机或数字式伺服电机&#xff1b;适合于多轴点位运动、插补运动、轨迹规划、手轮控制、编码器位置检测、IO 控制、位置比较、位置锁存等功能的应用。 DMC3000 系列卡的运动控制函数库功…

android studio 写一个小计时器(版本二)

as版本&#xff1a;23.3.1patch2 例程&#xff1a;timer 在前一个版本的基本上改的&#xff0c;增加了继续的功能&#xff0c;实现方法稍微不同。 动画演示&#xff1a; activity_main.xml <?xml version"1.0" encoding"utf-8"?> <androidx…

python-leetcode-轮转数组

189. 轮转数组 - 力扣&#xff08;LeetCode&#xff09; class Solution:def rotate(self, nums: List[int], k: int) -> None:"""Do not return anything, modify nums in-place instead."""n len(nums)k % n # 如果 k 大于 n&#xff0c;…

亚马逊云科技 | Amazon Nova:智能技术新势力

在2024年亚马逊云科技re:invent大会上&#xff0c;Amazon Nova 系列自研生成式 AI 多模态模型重磅登场&#xff0c;新一代的AI产品-Amazon Nova&#xff0c;隶属于 Amazon Bedrock&#xff0c;一共发布6款大模型&#xff0c;精准切入不同领域&#xff0c;解锁多元业务可能&…

记录第一次跑YOLOV8做目标检测

今天是24年的最后一天&#xff0c;终于要向新世界开始破门了&#xff0c;开始深度学习&#xff0c;YOLO来敲门~ 最近做了一些皮肤检测的功能&#xff0c;在传统的处理中经历了反复挣扎&#xff0c;终于要上YOLO了。听过、看过&#xff0c;不如上手体会过~ 1、YOLO是什么&#x…

从授权校验看SpringBoot自动装配

背景 最近需要实现一个对于系统的授权检测功能&#xff0c;即当SpringBoot应用被启动时&#xff0c;需要当前设备是否具有有效的的授权许可信息&#xff0c;若无则直接退出应用。具体的实现方案请继续看下文。 环境 Ruoyi-Vue SpringBoot3 RuoYi-Vue: &#x1f389; 基于Spr…