eBPF程序将HTTP请求转发到其他端口

时间:2018-12-20 18:31:46

标签: bpf ebpf

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

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

有没有这样的示例eBPF程序?

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

1 个答案:

答案 0 :(得分:0)

我目前不知道这样的例子。我知道Cilium项目使用BPF在HTTP API级别上创建过滤器,但是它们是在运行时生成BPF程序的,我不认为该存储库已经预先编译了示例。

如前所述,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