我知道bpf程序可以通过tc / kprobe / socket的不同方式加载到内核中...
我想知道是否有接口或某种东西可以通过它获取我加载的所有bpf程序?如果没有,那么如果我留下一些可能会更改网络数据的bpf程序,是否有危险?
另一个小问题,如何卸载tc-bpf程序,我真的必须每次都删除qdisc吗?
答案 0 :(得分:1)
为了列出系统上的所有BPF程序,并且从Linux内核4.13开始,您可以使用bpf()
系统调用及其BPF_PROG_GET_NEXT_ID
命令来获取第一个程序的ID,然后再次重复调用它以获得以下ID,直到获得系统上已加载的所有BPF程序的ID列表。然后,您可以使用同一系统调用及其BPF_PROG_GET_FD_BY_ID
命令来检索每个程序的文件描述符,并第三次使用BPF_OBJ_GET_INFO_BY_FD
来获取给定程序的信息(例如程序类型)。我通常会将您重定向到bpf(2)
manual page,但是现在它已经严重过时,并且没有在我的系统上描述这些命令。
实际上,所有这些都已实现。您应该搜索 bpftool 程序:运行sudo bpftool prog
将列出系统上的所有程序。
bpftool sources are within the Linux kernel tree,并且可以轻松进行编译。它是为Fedora 28打包的,但在撰写本文时,尚未打包为Debian / Ubuntu或其他发行版。 (您还可以从this page获得带有静态链接二进制文件的Debian .deb软件包。它也包含了一个指南,其中包含有关构建bpftool的详细说明。免责声明:我在该公司工作。)
对于删除作为tc过滤器附加的程序,您可以简单地删除过滤器,而不必删除整个qdisc,如下所示:
tc filter del dev eth0 ingress