写点什么

BigBrother:UCloud 全链路大规模网络连通性检测系统详解(上)

  • 2019-11-07
  • 本文字数:2971 字

    阅读完需:约 10 分钟

BigBrother:UCloud全链路大规模网络连通性检测系统详解(上)

虚拟网络排查问题困难,传统的 traceroute 等工具很难起到太大作用,大部分情况下都需要到宿主机、混合云网关上抓包来 troubleshooting,耗时又费力。有些场景中包的传送路径比较长(如跨域、混合云等),可能丢包的地方比较多,更增加了故障排查的难度。


为此,我们设计了一款支持全链路大规模的网络连通性内部检测系统 BigBrother。基于 TCP 报文的染色可将检测报文和用户流量区分开,能支持物理云和跨地域的复杂场景,还打造了完整的检测框架,帮助运维同事直接定位故障点,或一键判断虚拟网络是否存在问题。


BigBrother 上线后即用于云主机迁移前后的连通性验证,保证出现异常后可以及时告警回滚。从 8 月初至今历时两个月,共迁移 2000 多台主机,及时发现迁移异常近 10 起。


一、第一代网络连通性工具的不足

在设计 BigBrother 这前,我们也有第一代的网络连通性检查工具,原理就是通过 SSH 跳转到目标宿主机上,利用 ovs 的 packet out 命令将构造的报文发出去,最后在对端的宿主机上 tcpdump 该报文,从而验证两端的连通性。但是从它的原理就不难看出,这种检测方式有着很大的缺点:


  • 检测效率低下,无论是 ssh、packet out,还是 tcpdump 都无法支持大规模的快速检查;

  • 适应的场景有限,对于部分 dpdk、p4 网关类产品,无法通过 tcpdump 进行抓包判断。


因此做一款支持全链路大规模的连通性检测系统是非常有必要的,我们的目标就是让运维、NOC 的同学能够迅速发现并解决网络不通的问题,同时为我们的虚拟网络服务变更保驾护航。

二、BigBrother 的实现原理

BigBrother(下文简称 BB)一词源自乔治奥威尔的小说《1984》,将此检测系统命名为 BigBrother 寓意就是可以将全网资源连通情况都实时监控起来。整个 BB 检测系统由若干个组件配合完成,mafia 提供 console 进行创建及展示 task 的结果,minitrue 用于将用户传入的参数转化为注包的范围,telescreen 用于构造报文及收发报文。

1 Entrypoint 和 Endpoint

在具体介绍 BB 的原理前,我们先来看两个概念。在我们的虚拟网络中,每个实例(uhost、umem、udb 等)都是通过接入点来接入虚拟网络,接入点由两部分组成:


  • Entrypoint: inbound/outbound 报文都是经由 Entrypoint 进行接受和发送的。

  • Endpoint:连接实例的端点,Endpoint 为最接近实例的网元。


例如在公有云场景中,entrypoint 和 endpoint 都是 openvswitch,而在物理云场景中,entrypoint 是我们的物理云转发网关(vpcgw、hybridgw),endpoint 则是物理云主机的上联 ToR。



以上就是各种场景中的接入点说明,之所以要明确这两个概念,是因为在 BB 系统中,我们将 Entrypoint 作为注包点,向其发送 GRE 探测报文,同时将 Endpoint 作为采样点,Endpoint 会识别并镜像特殊的探测报文至 BB。

2 检测流程

检测方案如图所示,可分为两部分组成,在图中的流向分为橙色和紫色。



以橙色流向部分为例(SRC->DST):


1)BigBrother 模拟 DST 向 Endpoint 发送探测报文;


2)SRC 端 Entrypoint 收到该探测报文后转发给 Endpoint;


3)Endpoint 将该报文镜像至 BigBrother;


4)Endpoint 将报文正常转发至实例;


5)实例回复报文给 Endpoint;


6)Endpoint 收到该回复报文后进行 GRE 封装,然后镜像至 BigBrother;


7)Endpoint 将报文正常转发至 Entrypoint;


8)SRC Entrypoint 将回复报文发送至 DST Entrypoint;


9)DST Entrypoint 收到回复报文后发送给 Endpoint;


10)DST Endpoint 将回复报文镜像至 Bigbrother。


至此,单边的检测结束。在检测过程中,BigBrother 发送了 1 个探测报文,共收到了 3 个采样报文,通过分析这 3 个采样点可以确认 SRC->DST 方向是否通信正常。


反之亦然,紫色部分原理相同。全部检测结束后,BigBrother 共可以收到 6 个探测报文,如果 6 个报文均收到则表示连通性正常。

3 探测报文设计

上文中介绍了 BB 的检测流程,下面我们再来看下探测报文及转发面的设计实现。公有云和混合云的设计存在很多不同。公有云转发面需要在全局 hook 点(table_1),分别 hook 探测报文的 request 和 response,然后进行染色、镜像至 BB 等步骤。而混合云转发面则需要 ToR、PE 交换机开启 ERSPAN 功能,将染色的报文镜像至 BB 即可。


整体数据包交互如下图所示:



而一个合格的探测报文首先应该具备以下特征:


  • 染色信息与主机、OS 无关;

  • ovs2.3、ovs2.6 版本(现网主要版本)可以识别并处理此种染色信息。


因此我们详细比较了如下两种候选方案。


1)icmp + tos 方案


第一种方案以 icmp 报文为载体,使用 tos 对 icmp_request 进行染色,采集时将此 tos 的 icmp 报文镜像至 BB 即可。


cookie=0x20008,table=1,priority=40000,metadata=0x1,icmp,icmp_type=8,icmp_code=0,nw_tos=0x40 actions=Send_BB(),Learn(),Back_0()
复制代码


对于 hook icmp_request 的 flow 可以简化为如下逻辑:


action 部分主要由三部分组成:


  • Send_BB() 将报文镜像给 BB;

  • Learn() 通过 icmp_request 报文学习到一条用于匹配 icmp_reply 报文的 flow,该条 flow 的主要动作包括:染色、镜像至 BB;


# 1. 􏲌􏳳REG3 􏱛64200# (global hook) reg3 load:64200->NXM_NX_REG3[], # 2. learn action learn(table=31,idle_timeout=2,hard_timeout=4,priority=30000,dl_type=0x0800,ip_proto=1,icmp_type=0,icmp_code=0,NXM_OF_IP_SRC[]=NXM_OF_IP_DST[],NXM_OF_IP_DST[ ]=NXM_OF_IP_SRC[],Stain(),Send_BB()),# 3. REG3 0load:0->NXM_NX_REG3[] 
复制代码


  • Back_0() 将该报文送回 table_0,进行常规的转发操作。


对于 hook icmp_reply 的 flow 可以简化为如下逻辑:


cookie=0x20008,table=1,priority=40000,metadata=0x1,icmp,icmp_type=0,icmp_code=0,nw_tos=0x40
复制代码


action 部分主要由四部分组成:


  • Save(in_port, tun_src) 将报文中的 in_port 和 tun_src 保存下来;

  • Resubmit(table=31) 跳转至 table31,匹配 icmp_request learn 生成的 flow;

  • Restore(in_port, tun_src) 恢复 in_port 和 tun_src;

  • Back_0() 将该报文送回 table_0,进行常规的转发操作。


以上讨论的是公有云侧 ovs 的染色及镜像方法,而混合云侧就需要交换机 ERSPAN 来进行支持,为了使 ERSPAN 规则可以镜像 tos 染色报文,需要 GRE 外层 Ip Header 中的 tos 继承 overlay Ip Header 中标记的 tos,所以需要全网对 GRE 隧道设置继承内层 tos 的隧道属性,执行命令如下:


ovs-vsctl set in <gre_iface_name> options:tos=inherit
复制代码


此种方案虽然可以实现染色及镜像的功能,但是 hook 点预埋的 flow 过于复杂,不容易维护,最关键的一点在于,混合云网络中,该方案无法支持 learn flow,所以无法对反向的流量进行染色。


2)tcp 方案


第二种方案以 tcp 报文为载体,使用特定的端口作为染色条件,采集时将此源目端口的 tcp 报文镜像至 BB 即可。


cookie=0x20008,table=1,priority=40000,tcp,metadata=0x1,tp_src=[port],tp_dst=[port] actions=Send_BB(),Back_0()
复制代码


对于 hook tcp_request 的 flow 可以简化为如下逻辑:


action 部分主要由两部分组成:


  • Send_BB() 将报文镜像给 BB;

  • Back_0() 将该报文送回 table_0,进行常规的转发操作。


以上两种方案进行对比不难看出,第一种方案依赖较多并且适用场景受限,所以 BB 采用的是第二种方案。但是 tcp 方案也有一定的缺陷,如何选择染色的 port 并且要与用户的流量区分开来,这是一个难点。经过我们几次踩坑后分析,最后决定使用 tcp 源目 port=11 来进行染色,报文如下图所示。



2019-11-07 23:13667

评论

发布
暂无评论
发现更多内容

TOB产品需求调研

lenka

5月日更

网络攻防学习笔记 Day20

穿过生命散发芬芳

5月日更 网络攻防

数据挖掘从入门到放弃(六):K-means 聚类

数据社

机器学习 5月日更

网络攻防学习笔记 Day19

穿过生命散发芬芳

5月日更 网络攻防

Hibernate的get和load区别学习笔记

风翱

hibernate 5月日更

浅谈前端异常监控平台实现方案

devpoint

异常处理 indexedDB leveldb

Node.js学习 —— 简介

空城机

JavaScript 大前端 Node 5月日更

写给丫头

小天同学

情人节 5月日更 520单身福利 情书 告白

平台化服务的基石(四):再议用户权限,更优雅的模型

孤岛旭日

用户权限 企业建模

520 属于程序员的诗

荩沫

520单身福利

GraalVM系列(三):GraalJS多线程实践

孤岛旭日

GraalVM

人工智能基础2 - DAY10

Qien Z.

人工智能 基础 5月日更

520单身福利|女朋友又找我要礼物

孙叫兽

程序员 520单身福利 520 单身福利

Dubbo 并发控制

青年IT男

dubbo

初探图像二值化

CagyJ

算法 CV OpenCV 图像处理

5分钟速读之Rust权威指南(五)

wzx

rust

GraalVM系列(二):GraalVM核心特性实践

孤岛旭日

GraalVM

中台反思:提质增效

孤岛旭日

效率 中台 企业中台

IDEA 这么设置 Maven,再也不用担心依赖下载失败了

楼下小黑哥

Java IDEA

Flutter开发:Warning:CocoaPods minimum required version 1.6.0 or greater not installed…的解决方法

三掌柜

5月日更

实现私域流量的长效积累,一场医美直播背后的数字营销密码

脑极体

分布式架构的根基:深入浅出一致性算法

孤岛旭日

分布式 一致性算法 PAXOS 共识算法

中台反思:技术中台设计架构

孤岛旭日

中台 企业中台 技术中台

学习笔记之:知识地图

Nydia

学习

如何制定战略?

石云升

创业 战略 职场经验 5月日更

今日喜事

IT蜗壳-Tango

5月日更

北京市级预付费资金监管平台正式上线试运行 内嵌区块链存证技术

CECBC

低代码“骗局”

ES_her0

5月日更

闲言碎语:为什么阿里做不好业务中台

孤岛旭日

中台反思:技术中台的未来

孤岛旭日

中台 低代码 中台架构

区块链与资产数字化

CECBC

BigBrother:UCloud全链路大规模网络连通性检测系统详解(上)_文化 & 方法_徐欢_InfoQ精选文章