XDP程序ip链接错误:Prog部分被拒绝:不允许操作
我尝试进入XDP
,为此,我有一个非常小的程序:
// SPDX-License-Identifier: GPL-2.0#include <linux/bpf.h>
#include "bpf/bpf_helpers.h"
#include "xdpsock.h"
struct {
__uint(type, BPF_MAP_TYPE_ARRAY);
__uint(max_entries, MAX_SOCKS);
__uint(key_size, sizeof(int));
__uint(value_size, sizeof(int));
} xsks_map SEC(".maps");
SEC("xdp_sock") int xdp_sock_prog(struct xdp_md *ctx) {
return XDP_DROP;
}
但是,如果我尝试将其加载到虚拟接口中veth-basic02
,则会出现此错误:
$ sudo ip -force链接集dev veth-basic02 xdp对象xdpsock_kern.o部分xdp_sock
编节“ xdp_sock”被拒绝:不允许操作(1)!-类型:6-说明:2(超出限制0)-许可证:
验证者分析:
提取程序/地图时出错!
内核版本: 5.3.0-28-generic
这是我正在使用的Makefile:
OBJS = xdpsock_kern.oLLC ?= llc
CLANG ?= clang
INC_FLAGS = -nostdinc -isystem `$(CLANG) -print-file-name=include`
EXTRA_CFLAGS ?= -O2 -emit-llvm
# In case up-to-date headers are not installed locally in /usr/include,
# use source build.
linuxhdrs ?= /usr/src/linux-headers-5.1.0-050100
LINUXINCLUDE = -I$(linuxhdrs)/arch/x86/include/uapi \
-I$(linuxhdrs)/arch/x86/include/generated/uapi \
-I$(linuxhdrs)/include/generated/uapi \
-I$(linuxhdrs)/include/uapi \
-I$(linuxhdrs)/include \
-I/bpf
prefix ?= /usr/local
INSTALLPATH = $(prefix)/lib/bpf
install_PROGRAM = install
install_DIR = install -dv
all: $(OBJS)
.PHONY: clean
clean:
rm -f $(OBJS)
INC_FLAGS = -nostdinc -isystem `$(CLANG) -print-file-name=include`
$(OBJS): %.o:%.c
$(CLANG) $(INC_FLAGS) \
-D__KERNEL__ -D__ASM_SYSREG_H \
-Wno-unused-value -Wno-pointer-sign \
-Wno-compare-distinct-pointer-types \
-Wno-gnu-variable-sized-type-not-at-end \
-Wno-address-of-packed-member -Wno-tautological-compare \
-Wno-unknown-warning-option \
-I../include $(LINUXINCLUDE) \
$(EXTRA_CFLAGS) -c $< -o -| $(LLC) -march=bpf -filetype=obj -o $@
install: $(OBJS)
$(install_DIR) -d $(INSTALLPATH) ; \
$(install_PROGRAM) $^ -t $(INSTALLPATH)
uninstall: $(OBJS)
rm -rf $(INSTALLPATH)
封锁:
$ dmesg | grep Lockdown[ 1.283355] Lockdown: swapper/0: Hibernation is restricted; see man kernel_lockdown.7
[ 11.313219] Lockdown: systemd: /dev/mem,kmem,port is restricted; see man kernel_lockdown.7
[ 11.337794] Lockdown: systemd: BPF is restricted; see man kernel_lockdown.7
[ 17.147844] Lockdown: Xorg: ioperm is restricted; see man kernel_lockdown.7
编辑:
回答:
eBPF:不允许操作
使用eBPF时,有几种可能的原因导致权限错误(-EPERM
由返回bpf()
,您可以通过观察到strace -e bpf
<command>)。但是没有那么多。通常,它们属于以下项目之一:
(
CAP_SYS_ADMIN
,,CAP_NET_ADMIN
…,通常取决于所使用程序的类型)。通常可以通过 具有所有必要功能的来解决。在您的情况下,您可以使用sudo
,因此可以满足要求。创建BPF对象(新映射或加载程序)将 。这通常可以
root
通过 在终端或 使用来解决。在您的情况下,您的程序非常小,并且您没有提到在系统上加载了很多BPF对象。还有更多的可能性,例如 等的 ,或 。这些通常用于更高级的用例,不应被像您这样简单的程序所破坏。
锁定,安全启动,EFI和(不幸的)反向端口的bpf()
限制
但是,您似乎遇到的问题可能与其他原因有关。“锁定”是一个安全模块,已合并到Linux
5.5内核中。它旨在防止用户修改正在运行的Linux映像。事实证明,有几个发行版决定将Lockdown移植到他们的内核中,有时他们选择了在最终版本合并到主线Linux之前的补丁。
例如,Ubuntu和Fedora有许多自定义补丁程序可以向后移植,以适应Disco / 19.04和Eoan /
19.10(后者为5.3,我不记得Disco的内核)中使用的内核。它包含一个修补程序,当锁定功能被激活时,该修补程序将完全禁用bpf()
系统调用,这意味着无法创建地图或加载BPF程序。另外,它们在激活安全启动时默认情况下启用了锁定,我认为这是使用EFI引导的计算机的默认设置。
另请参见此博客文章:检查锁定是否影响您的BPF使用的一种好方法是尝试加载最少的程序,或者运行dmesg |
grep Lockdown以查看是否显示类似以下内容:
Lockdown: systemd: BPF is restricted; see man kernel_lockdown.7
因此 对于 必须
。可以通过SysRq
按键+x
的物理笔划来完成此操作(我尚未测试),但不能通过写操作来完成/proc/sysrq-trigger
。另外,您可以禁用安全启动(在BIOS中或通过mokutil
,在Internet上搜索相关选项,并且不要忘记检查安全隐患)。
需要注意的是Linux内核5.4或最新的有主线限制的bpf()
,不取消的系统调用,所以焦/
20.04和最新不会受到影响。
。我几天前提交了一份票证,要求将此更改回移植(而不是停用bpf()
),并且该工作正在进行中,因此,到新读者看到答案时,锁定对eBPF的影响可能会得到缓解(应该已在内核5.3.0-43的Ubuntu19.10上修复)。不确定其他发行版如何处理此问题。但是,它对于使用eBPF进行跟踪仍然具有重要意义。
以上是 XDP程序ip链接错误:Prog部分被拒绝:不允许操作 的全部内容, 来源链接: utcz.com/qa/422598.html