V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
imianba2zz
V2EX  ›  分享创造

历时 1 年 3 个月,从零学习 eBpf 到写了一个 HTTP 接口生成器

  •  
  •   imianba2zz · 227 天前 · 1782 次点击
    这是一个创建于 227 天前的主题,其中的信息可能已经有所发展或是发生改变。

    如题,去年 6 月一次偶然的机会从同事口中得知了 DPDK 可以高性能处理网络数据(非常感谢这位同事,哈哈),然后进行了一番搜索发现了 ebpf 这个黑科技,从此踏入 ebpf 的不归路(又掉了不少头发)。

    首先从 xdp 开始学起,了解到了 https://github.com/xdp-project/xdp-tutorial 这个项目,安装编译环境就是一个大坑,直接劝退 3 个月,直到去年 9 月份又重新捡起来,把环境搭建成功,开始专研 xdp-tutorial 中的每个实验。

    后面又接触到 cilium/ebpf 这个库,然后把 xdp-tutorial 中的实验用这个库抄袭实现了一遍,顺便还把其它几个库的实验也抄了一遍,感兴趣的可以看看 https://github.com/Zhouchaowen/ebpf_labs

    在后面接着断断续续的了解 xdp 的一些知识,有一次想通过 xdp 实现 L4 层的负载均衡功能,搞了几天也没有成功(好像是校验和的问题),再次被劝退,后面也陆陆续续在了解,但是相关资料还是太少了。

    直到今年 4 月开始学习 k8s ,接触到 cilium 这个网络插件,看了看它的源码,简直爆鸡儿难(这是人能看懂的吗?)。后来经过反复放弃,慢慢的看懂了一点点,了解到了 tc ebpf 和如何加载它的知识。碰巧又看到了 https://github.com/gojue/ecapture 这个项目,发现很有趣,交流群里 cfc4n 大佬非常热心,问了不少问题都回答了(非常感谢),又结合刚了解的 tc ebpf 然后产生了实现一个 http 接口生成器的想法(其实是我们内部一直缺少接口文档,全靠手撸,我懒就不想写这个接口文档,哈哈哈哈),然后立刻动手建立项目,一个星期后写了第一版代码简单测试修改了一些 bug 发了第一个版本 v0.0.1 。

    目前在 Linux 5.4.0-156-generic x86_64 以上的内核版本应可以使用,但项目还非常初始,可能会有许多问题,希望使用的过程中有问题可以反馈,哈哈哈。

    项目地址: https://github.com/Zhouchaowen/prism

    直接运行:

    prism -n <device_name> # device_name 网卡名称
    

    Docker 方式运行:

    docker run --net host --privileged --name prism -itd zmosquito/prism:v0.0.1 ./prism -n <device_name>
    

    演示视频: https://www.bilibili.com/video/BV1tK4y1c7rh/

    感谢 star ,哈哈

    12 条回复    2023-10-25 19:08:19 +08:00
    asmoker
        1
    asmoker  
       227 天前 via Android
    👍👍👍
    1423
        2
    1423  
       227 天前
    有点硬核
    代码有用到 gopacket(libpcap). gopacket 也能抓包,不知道跟 ebpf 性能能差多少
    hanxiV2EX
        3
    hanxiV2EX  
       227 天前 via Android   ❤️ 1
    http 接口生成器是干啥的呢?
    zhs227
        4
    zhs227  
       226 天前
    技术是 NB 的,说明没写太好。大概看了一下,是通过 ebpf 底层抓包并解析网络上的 http 请求,生成类似于接口说明一类的东西。演示视频里比较清楚
    wheat0r
        5
    wheat0r  
       226 天前 via iPhone
    @zhs227 行为审计感觉
    imianba2zz
        6
    imianba2zz  
    OP
       226 天前
    @1423 这个没有对比过,主要是刚好想用 ebpf 实现,按理来说 ebpf 性能应该会更高的(当然这是我的猜测,哈哈)
    imianba2zz
        7
    imianba2zz  
    OP
       226 天前
    @hanxiV2EX 类似生成 api 接口文档这种东西
    imianba2zz
        8
    imianba2zz  
    OP
       226 天前
    @zhs227 是的,就是生成 api 说明文档这种东西。个人想法是用在自测卡点,自测完接口 api 就生成完,然后就可以转给测试了。自己懒得写 api 文档。
    Pi10t
        9
    Pi10t  
       225 天前
    有没有考虑过,除了除了抓出 http 请求和响应之外,把这条请求的详细处理过程都给抓出并关联起来呢?比如说执行的 SQL 语句、执行的系统命令、发起的网络请求等等。这些可以用于做安全审计之类的。我最近也在关注 ebpf 在这个方向的应用。
    sbilly
        10
    sbilly  
       202 天前
    楼主不错,加油。
    RedisMasterNode
        11
    RedisMasterNode  
       193 天前
    @Pi10t DeepFlow ?
    xi4ohui
        12
    xi4ohui  
       185 天前
    不错的想法,👍
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1062 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 18:27 · PVG 02:27 · LAX 11:27 · JFK 14:27
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.