eBPF:Linux 命名空间中的 运行

eBPF: running in Linux namespaces

所以 BPF 程序是内核实体,因为它们 运行 在内核 space 中。另一方面,Linux名称space又名容器,提供应用程序级隔离,在这种情况下它们都共享主机的内核、内核模块等

所以我想为每个容器加载一个 bpf 程序没有意义,因为它也会在主机上可见?

因此我猜测 bpf 程序会加载到主机上并且 monitor/mangle/etc。数据包 to/from 名称spaces。鉴于 struct sock 有关于 namespace id 的信息,我认为只有某些类型的 bpf 程序能够做到这一点?

So I guess it doesn't make sense to load a bpf program per container, as it will become visible on the host as well?

如果你的意思是从容器加载一个BPF程序,那么是的,它在主机上也是可见的(你需要一个特权容器才能做到这一点).

Given that struct sock has the information about namespace id, I think only certain types of bpf programs would be able to do that?

我找不到任何可以直接访问 struct sock 的 BPF 程序类型。 BPF programs of type sockops have access to struct bpf_sock,但它包含的实际信息很少。

您可以使用 BPF programs of type cgroup/skb though. Those are attached to cgroups and can act on both ingress and egress packets. They receive a struct __sk_buff object as argument, a mirror of the sk_buff for the packet received/sent. They can only use a few helpers(除了公共基础),而且似乎没有对数据包的写入权限。

kprobe BPF programs 可以访问 kprobes 可以附加的任何内核函数。因此,您可以通过探测适当的函数来检索命名空间信息,然后将其发送到您的 monitor/mangle/etc。通过 bpf 映射编程。虽然不是最简单的选择。