所以BPF程序是内核实体,因为它们在内核空间中运行。另一方面,Linux命名空间(即容器)提供应用程序级隔离,在这种情况下,它们都共享主机的内核、内核模块等。
所以,我想每个容器加载一个bpf程序是没有意义的,因为它也会在主机上可见吗?
因此,我猜想bpf程序将加载到主机上,并监视/mangle/等数据包到/从名称空间。考虑到struct sock有关于名称空间id的信息,我认为只有某些类型的bpf程序才能做到这一点?
发布于 2018-02-19 14:08:21
所以,我想每个容器加载一个
bpf程序是没有意义的,因为它也会在主机上可见吗?
如果您的意思是从容器中加载一个BPF程序,那么是的,它在主机上也是可见的(为此您需要一个特权容器)。
考虑到
struct sock有关于名称空间id的信息,我认为只有某些类型的bpf程序才能做到这一点?
我找不到任何可以直接访问struct sock的BPF程序类型。sockops型BPF程序可以访问struct bpf_sock,但它包含的实际信息很少。
不过,你可以使用cgroup/skb型BPF程序。这些连接在cgroup上,并且可以同时作用于入口和出口数据包。它们接收一个struct __sk_buff对象作为参数,作为接收/发送的数据包的sk_buff镜像。他们只能使用几个帮手 (除了公共基础之外),而且似乎没有对数据包的写访问权。
K探针BPF程序可以访问任何可以附加到的内核函数。因此,您可以通过探测适当的函数来检索命名空间信息,然后通过bpf映射将其发送到监视器/mangle/等程序。不过,这不是最简单的选择。
https://stackoverflow.com/questions/48815633
复制相似问题