所以BPF
程序是内核实体,因为它们在内核空间中运行。另一方面,Linux名称空间也称为容器,提供应用程序级隔离,在这种情况下,它们共享主机的内核,内核模块等。
所以我想每个容器加载一个bpf
程序是没有意义的,因为它也会在主机上显示出来?
因此,我猜想bpf
程序会加载主机和监视器/ mangle / etc。到/来自命名空间的数据包。鉴于struct sock
有关于名称空间id的信息,我认为只有某些类型的bpf
程序才能做到这一点?
所以我想每个容器加载一个
bpf
程序是没有意义的,因为它也会在主机上显示出来?
如果您的意思是从容器加载BPF程序,那么它也会在主机上可见(并且您需要一个特权容器才能这样做)。
鉴于
struct sock
有关于名称空间id的信息,我认为只有某些类型的bpf
程序才能做到这一点?
我找不到任何可以直接访问struct sock
的BPF程序类型。 BPF programs of type sockops可以访问struct bpf_sock
,但它包含的实际信息很少。
你可以使用BPF programs of type cgroup/skb。这些附加到cgroup并且可以对入口和出口数据包起作用。他们收到一个struct __sk_buff
对象作为参数,是收到/发送的数据包的qazxswpoi的镜像。他们只能使用sk_buff
(除了公共基础),并且似乎没有对数据包的写访问权限。
a few helpers可以访问任何可以附加kprobes的内核函数。因此,您可以通过探测适当的函数来检索命名空间信息,然后将其发送到您的monitor / mangle / etc.通过bpf地图编程。虽然不是最简单的选择。