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 映射编程。虽然不是最简单的选择。
所以 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 ofbpf
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 映射编程。虽然不是最简单的选择。