如何通过网络数据包检测传入的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的检测与过滤实现思路
网络层TC eBPF拦截
- 编写TC类型的eBPF程序,挂载到服务器入口网卡的Ingress钩子。
- 先过滤目标端口为
9418、80、443的TCP数据包。 - 跟踪TCP连接状态(通过
bpf_map存储连接的分片数据),拼接分片的TCP payload,查找git-upload-pack关键字或HTTP请求特征。 - 匹配到Git请求后,根据自定义条件(如允许的仓库路径、客户端IP范围)决定是否放行:符合条件则正常转发,不符合则调用
bpf_tc_drop丢弃数据包。
应用层系统调用Hook
- 使用eBPF hook住Git服务进程(如
git-daemon、Nginx)的read/recv系统调用,捕获进程读取的明文数据。 - 这种方式更适合处理HTTPS流量(服务器进程已完成解密),直接在应用层解析请求内容,判断是否为git clone请求,并根据条件拦截。
- 使用eBPF hook住Git服务进程(如
关键注意事项
- TCP分片处理:单个Git请求可能被拆分为多个TCP数据包,eBPF程序需要维护连接上下文,拼接分片内容后再进行特征匹配,避免漏判。
- HTTPS流量限制:网络层的HTTPS数据包是加密的,无法直接解析特征,必须在应用层(进程读取阶段)捕获解密后的数据。
- 性能优化:字符串匹配尽量使用高效的
bpf_strstr函数,或把允许的仓库路径、IP范围预存在BPF_MAP_TYPE_HASH中,减少每次数据包处理的计算量。
内容的提问来源于stack exchange,提问作者Its Me
相关产品推荐
相关产品推荐

