【问题标题】:eBPF program to forward HTTP requests to different porteBPF 程序将 HTTP 请求转发到不同的端口
【发布时间】:2018-12-20 18:31:45
【问题描述】:

我正在尝试实现一项功能,根据 HTTP 请求的路径,我可以将请求转发到不同的端口。

例如如果请求GET /foo,我想转发到81端口,如果是/bar我想转发到82端口。如果是别的,我想继续传入时将其转发到端口 80。

有这样的 eBPF 程序示例吗?

我试图弄清楚我将如何确定 HTTP 请求是什么,因为 eBPF 将应用于数据包级别

【问题讨论】:

    标签: bpf ebpf


    【解决方案1】:

    我目前不知道这样的例子。我知道Cilium 项目使用 BPF 在 HTTP API 级别创建过滤器,但它们会动态生成 BPF 程序,我不相信 repo 有预编译的示例。

    如您所述,eBPF 程序处理整个数据包,包括 L2/L3/L4 标头。因此,为了确定您的 HTTP 请求,您必须执行以下操作:

    • 获取以太类型
    • 如果 ethertype 不是 IPv4 或 IPv6,则退出(例如传递或丢弃数据包),否则,继续
    • 获取 IP 协议类型
    • 如果 IP 协议类型不是 TCP,则退出
    • 获取 TCP 目标端口
    • 如果这个端口不是80,退出
    • 获取应用层的前 4 个字节
    • 那些字节是GET␣吗?如果没有,请退出。
    • 如果是,请尝试将以下字节与您的路径匹配 /foo/bar
    • 如果匹配,则相应地将目标端口更改为 81 或 82

    至少对于第一步(以太网、IP、TCP 的处理),您在网络上有可用的示例。从 parse_simple.c in kernel samples 到更复杂的,例如 Netronome 示例存储库中的 this L4 load balancer

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-19
      • 1970-01-01
      • 1970-01-01
      • 2019-09-27
      • 1970-01-01
      • 2012-12-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多