首页 > 其他分享 >观测云核心技术解密:eBPF Tracing 实现原理

观测云核心技术解密:eBPF Tracing 实现原理

时间:2024-09-03 18:30:20浏览次数:13  
标签:__ eBPF int Tracing eSpan 解密 网络 线程

前言

eBPF 是一种强大的内核技术,允许在内核中安全地执行自定义代码。通过 eBPF,开发者可以在不修改内核源码的情况下,对内核功能进行扩展和监控。eBPF Tracing 利用这一技术,对系统调用、内核函数等进行跟踪,从而实现对应用行为的深入洞察。

与传统的监控方式相比,eBPF Tracing 具有以下优势:

  • 无侵入性:无需修改应用代码即可进行监控。
  • 高性能:在内核层面执行,减少了对应用性能的影响。
  • 细粒度:可以精确到单个系统调用或内核函数的监控。

eBPF(网络)链路实现

实现由三部分构成:

  1. eBPF 探针程序
  2. 解析来自 BPF Map 的网络请求数据、线程(协程)跟踪与 eBPF Span 生成
  3. 链接来自所有节点的汇总 eBPF Span (以下简称 eSpan) 生成链路

eBPF 探针程序

eBPF 探针用于获取程序读写 socket fd 的网络数据,并通过 BPF Map 发送给用户空间的程序进行协议解析。

Linux syscall 函数触发时 eBPF 探针将读取 buf 参数的内容写入 BPF Map,参考 syscall 如下:

ssize_t read(int fd, void *buf, size_t count);
ssize_t write(int fd, const void *buf, size_t count);
ssize_t readv(int fd, const struct iovec *iov, int iovcnt);
ssize_t writev(int fd, const struct iovec *iov, int iovcnt);
ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,
                        const struct sockaddr *dest_addr, socklen_t addrlen);
ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,
                        struct sockaddr *src_addr, socklen_t *addrlen);
...

写入 BPF Map 的数据将记录触发的 syscall 函数及时间、TCP 连接信息、线程/协程信息以及 Linux syscall 的 buf 参数的部分 payload,以下为结构体:

struct network_data
{
    struct
    {
        __u64 ts;                        // 函数调用开始时间
        __u64 ts_tail;                   // 函数调用结束时间
        __u64 tid_utid;                  // 内核线程、用户线程 id
        __u8 comm[KERNEL_TASK_COMM_LEN]; // task comm
        struct
        {
            __u64 sk;      // sock addr
            __u32 ktime;   // kernel time
            __u32 prandom; // random number
        } uni_id;          // 该网络连接的唯一标识 id
        struct
        {
            __be32 saddr[4]; // src(proc self) ip address; Use the last element to store the IPv4 address
            __be32 daddr[4]; // dst ip address
            __u16 sport;     // src(proc self) port
            __u16 dport;     // dst port
            __u32 pid;
            __u32 netns; // network namespace inode. (`stat -L /proc/<pid>/ns/net` or `lsns -t net`)
            __u32 meta;  // first byte: 0x0000|IPv4 or 0x0001|IPv6; second byte 0x0000|TCP or 0x0100|UDP; ...
        } conn;          // 连接信息
        __u32 tcp_seq;   // first byte tcp seq

        __u16 _pad0;   // 内存对齐填充
        __u16 func_id; // 函数编号

        __s32 fd;       // socket fd
        __s32 buf_len;  // 读写的网络数据字节数
        __s32 act_size; // 实际采集的 payload 的字节数
        __u32 index;    // 自增,用于标记进程对 socket fd 读写函数调用顺序
    } meta;                       // 网络数据 meta
    __u8 payload[L7_BUFFER_SIZE]; // 网络数据 payload
};

由第二部分的 Agent 实现 eBPF 探针程序的加载和卸载,工作示意图:

图片

网络请求解析、线程跟踪与 eSpan 生成

DataKit-eBPF 程序从 BPF Map 获取网络数据,解析网络协议,根据进程和线程信息构建线程跟踪模型。

其构成主要包含:

  • 采集: 收集来自 BPF Map 的网络数据等;加载 eBPF 探针程序,attach 到相应的 syscall 函数
  • 解析:
    • 建立进程的线程-网络请求时序模型,通过为应用内关联网络请求(IN/OUT)提供线程跟踪 ID 实现进程内跟踪;
    • 检测网络数据里的网络协议,识别到 HTTP、Redis、MySQL 等协议后进入解析模式,并进行网络协议/进程过滤等;
    • 解析网络协议,采集网络请求,生成请求数据,附加根据 TCP 序列号生成跨进程网络跟踪 ID、附加 Otel/DDTrace 等的链路传播信息(如果有);
  • 生成: 向生成请求数据中注入线程跟踪 ID,进一步生成 eBPF Span 和生成网络请求聚合数据。
  • 发送: 由于当前 eBPF Span 中没有建立跨进程调用的父子关系,需要将所有节点的 eSpan 发送至同一个用于 eSpan 链接的 DataKit 或 DataKit-ELinker 服务, 如图:

图片

eSpan 链接

该部分接收来自所有节点的 eSpan 数据,用于建立这些来自多个节点的 eSpan 的跨进程应用调用关系,实现生成完整的链路。

其构成主要包含:

  • 接收 eSpan 并缓存 N 个链接周期(该周期可根据单次应用调用链路的总耗时调参)的 eSpan 数据
  • 按链接周期取数据,加工 eSpan,根据 eSpan 中的进程内跟踪 ID 和跨进程网络跟踪 ID 完成 eSpan 间的链接
  • 采样,该采样为尾部采样;同时,可根据 Otel/DDtrace 等通过网络传播的链路信息中的采样信息进行采样
  • 上传 eBPF 链路数据到观测云

图片

实现效果

图片

标签:__,eBPF,int,Tracing,eSpan,解密,网络,线程
From: https://blog.51cto.com/u_16582883/11909583

相关文章

  • 勒索病毒解密宝典第6篇:云服务器被勒索病毒攻击
    随着数字化转型的加速,越来越多的企业会倾向于把业务搬到云上。云服务器已成为企业和个人存储和处理数据的重要平台。然而,这种便利性也带来了新的安全挑战,尤其是勒索病毒的威胁。本文将深入探讨近期非常多的云服务器被勒索病毒加密的原因,如何解密以及预防手段。这些被攻击的云服......
  • ShardingSphere-JDBC实现数据加解密
    一、什么是ShardingSphere?        ShardingSphere定位为轻量级Java框架,在Java的JDBC层提供的额外服务。它使用客户端直连数据库,以jar包形式提供服务,无需额外部署和依赖,可理解为增强版的JDBC驱动,完全兼容JDBC和各种ORM框架。ApacheShardingSphere旨......
  • Lecture 13 Real-time Ray Tracing 2
    Lecture13Real-TimeRayTracing2Implementingaspatialfilter这里想做的是低通滤波移除高频信号会不会丢失高频中的信息?噪声不一定只在高频中集中在频域这些filtering可以应用在PCSS、SSR上的降噪用$$\widetildeC$$表示有noise的图像\[K$$表示滤波核kernel,比......
  • Lecture 12 Real-time Ray Tracing
    Lecture12Real-TimeRayTracingBasicideasampleperpixelPPS1SPPpathtracing=$$\downarrow$$camera出发打到求出第一个交点(像素上看到的点),这一步是primaryray(工业上实际用rasterization)工业上这一步有一个技巧将这一步改为光栅化因为每个像素都要从camera出......
  • 学习爬虫day26-kanzhun请求加密与逆向解密
    找到入口之后,在主js文件中,模拟入口函数,生成需要的参数:functiontest(n){letM=window.loader(12210)//console.log(M._A())lets=M.A()//letn='{"cityCode":"","salaryId":"403","experienceId":"","pageNum......
  • 35岁危机解密:AI产品经理如何突破职场天花板
    01被裁的35岁朋友去年,一家知名公司大裁员,很多35岁的非高管员工被牵连,包括我的一位朋友。我第一时间联系了他,看看有没有能够帮上忙的地方。我:传闻XX公司要收购你们?朋友:是的。我要失业了。我:咱有技术,不缺一份工作。不行咱就去杭州和上海。朋友:年纪大了,比较尴尬。再......
  • 解密5款大厂人都在用的AI搜索神器,早下班搞副业都靠它!
    大家好,我是凡人小哥。是一个不黑、不吹、不跟风、有知识、有骨气的五好小号主。昨天我弟打电话给我,行业不景气,公司业绩不行,他的很多同事不是被裁掉了,就是离职了,他也被领导烦的不行了,现在公司人少杂事多,一个人得干三个人的活儿,不停的写报告,他快撑不下去了,让我给出出主意。听......
  • python实现RC4加解密算法
    目录RC4算法简介RC4算法的加密和解密流程RC4算法的Python实现代码解释RC4算法的应用场景RC4的安全性分析总结RC4(RivestCipher4)是一种流加密算法,由RonRivest于1987年设计。RC4广泛应用于各种加密协议,如SSL/TLS和WEP/WPA等。RC4算法因其简单、高效的特点受到广泛关......
  • Python实现SM4加解密算法
    目录SM4算法简介SM4算法的加密和解密流程SM4算法的Python实现代码解释总结SM4算法是中国国家密码局设计的块密码算法,广泛应用于无线局域网标准和其他安全通信系统中。以下是SM4算法的详细介绍,包括加密解密流程和Python的完整实现。SM4算法简介SM4是一种对称分组......
  • 解密华为问界M7 Pro:智能出行的全新里程碑与技术亮点
    解读华为问界M7Pro的智能里程碑引言2024年8月,智能出行领域迎来了一个激动人心的时刻——问界M7Pro的重磅发布。这款智能SUV,不仅是华为在汽车领域的又一次大胆尝试,更是鸿蒙智行系统的一次全面进化。伴随着全球智能化浪潮的推进,问界M7Pro将会带来怎样的惊喜?在这篇文章中,我们将......