You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过网络数据包检测传入的git clone请求?(基于eBPF场景)

检测并过滤传入的Git请求(基于eBPF)

Git请求的核心识别特征

要判断数据包是否属于Git请求,可根据传输协议区分核心特征:

  • 原生Git协议(git://)
    • 默认目标端口为9418,可先以此作为基础过滤条件。
    • 客户端发起clone请求时,第一个明文数据包会包含git-upload-pack关键字,完整格式类似:git-upload-pack /target-repo\0host=your-server\0,其中/target-repo为仓库路径。
  • HTTP/HTTPS协议上的Git请求
    • 目标端口通常为80(HTTP)或443(HTTPS)。
    • HTTP请求特征:GET请求路径包含/info/refs?service=git-upload-pack,或是POST请求路径为/target-repo/git-upload-pack;HTTPS流量需在应用层(服务器进程解密后)才能读取这些明文内容。

基于eBPF的检测与过滤实现思路

  1. 网络层TC eBPF拦截

    • 编写TC类型的eBPF程序,挂载到服务器入口网卡的Ingress钩子。
    • 先过滤目标端口为9418、80、443的TCP数据包。
    • 跟踪TCP连接状态(通过bpf_map存储连接的分片数据),拼接分片的TCP payload,查找git-upload-pack关键字或HTTP请求特征。
    • 匹配到Git请求后,根据自定义条件(如允许的仓库路径、客户端IP范围)决定是否放行:符合条件则正常转发,不符合则调用bpf_tc_drop丢弃数据包。
  2. 应用层系统调用Hook

    • 使用eBPF hook住Git服务进程(如git-daemon、Nginx)的read/recv系统调用,捕获进程读取的明文数据。
    • 这种方式更适合处理HTTPS流量(服务器进程已完成解密),直接在应用层解析请求内容,判断是否为git clone请求,并根据条件拦截。

关键注意事项

  • TCP分片处理:单个Git请求可能被拆分为多个TCP数据包,eBPF程序需要维护连接上下文,拼接分片内容后再进行特征匹配,避免漏判。
  • HTTPS流量限制:网络层的HTTPS数据包是加密的,无法直接解析特征,必须在应用层(进程读取阶段)捕获解密后的数据。
  • 性能优化:字符串匹配尽量使用高效的bpf_strstr函数,或把允许的仓库路径、IP范围预存在BPF_MAP_TYPE_HASH中,减少每次数据包处理的计算量。

内容的提问来源于stack exchange,提问作者Its Me

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 06:25:17