XDP程序ip链接错误:Prog部分被拒绝:不允许操作

问题描述 投票:1回答:1

我尝试进入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.oxdp_sock部分

程序段'xdp_sock'被拒绝:不允许操作(1)!-类型:6-说明:2(超出限制0)-许可证:

验证者分析:

错误获取程序/映射!

内核版本:5.3.0-28-generic

这是我正在使用的Makefile:

OBJS = xdpsock_kern.o

LLC ?= 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

编辑:Alt+SysRq+x确实解决了问题-我终于可以加载XDP程序了!虽然有趣的复活节彩蛋。谢谢@Qeole!

linux networking bpf xdp-bpf
1个回答
2
投票

eBPF:不允许操作

使用eBPF时,权限错误有多种可能的原因(-EPERM返回的bpf(),您可以用strace -e bpf <command>观察到)。但是没有那么多。通常,它们属于以下项目之一:

  • 用户没有所需的功能CAP_SYS_ADMINCAP_NET_ADMIN,...通常取决于所使用程序的类型)。通常由具有所有必需功能的root身份运行解决。在您的情况下,您使用sudo运行,因此您被覆盖。

  • 用户创建BPF对象(新映射或加载程序)将超出可锁定在内核中的内存量的限制] >>。通常通过在终端中使用root或在C程序中使用ulimit -l <something_big>解决(对于setrlimit())。对于您而言,这是非常不可能的,您的程序非常小,并且您没有提到在系统上加载了很多BPF对象。

  • 还有一些可能性,例如试图在“冻结”或只读的地图上书写

  • ,等等,或者试图对非root用户使用函数调用 。这些通常用于更高级的用例,不应被像您这样简单的程序击中。

    bpf()限制的锁定,安全启动,EFI和(不幸的)反向端口

但是您似乎遇到的问题可能与其他原因有关。 “锁定”是一个安全模块,已合并到Linux 5.5内核中。它旨在防止用户修改正在运行的Linux映像。事实证明,有几个发行版决定将Lockdown移植到他们的内核,有时他们选择了在最终版本合并到主线Linux之前的补丁。

例如,Ubuntu和Fedora具有a bunch of custom patches,可以将该功能反向移植到Disco / 19.04和Eoan / 19.10(后者的内核5.3,我不记得Disco的内核)中使用的内核。它包含一个补丁,在激活“锁定”时会显示completely disables the bpf() system call,这意味着无法创建地图或加载BPF程序。另外,它们bpf(),我认为这是使用EFI引导的计算机的默认设置。

另请参阅enabled Lockdown by default when Secure Boot is activated:检查锁定是否影响您的BPF使用的一种好方法是尝试加载最少的程序,或运行this blog post以查看是否显示类似内容:

dmesg | grep Lockdown

因此,对于Ubuntu 19.04和19.10,例如

,您必须禁用锁定以使用eBPF。这可以通过Lockdown: systemd: BPF is restricted; see man kernel_lockdown.7 的物理笔划(我尚未测试)来完成,但不能通过写入SysRq key + x(此操作为Ubuntu SysRq)来完成。或者,您可以禁用安全启动(在BIOS或x中,在Internet上搜索相关选项,并且不要忘记检查安全隐患)。

[请注意,Linux内核5.4或更高版本具有/proc/sysrq-triggerdisabled it,它不会停用系统调用,因此Focal / 20.04和最新版本不会受到影响。 因此,升级到新内核可能是另一个解决方法

。我几天前mokutil要求将此更改回移植(而不是停用mainline restrictions),并且该工作正在进行中,因此,到新读者看到答案时,锁定对eBPF的影响可能会得到缓解。不确定其他发行版如何处理此问题。而且,它仍将具有bpf()
© www.soinside.com 2019 - 2024. All rights reserved.