问题标签 [bcc-bpf]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c - 标头在 eBPF 代码的内核级别上不起作用
所以我正在eBPF上开发一些东西。
我需要使用 unistd.h 标头,因为我想使用睡眠功能。
然而,我意识到当我输入
这些标头不包含在内,我会收到一条错误消息:
我以为我在代码的其他地方做错了,所以我尝试在教程的示例中包含该标题,但它也没有那样工作。
因此,从我在下面附加的代码中,我尝试在消息发布之前延迟一秒钟。
有没有人遇到过同样的问题,并且以某种方式找到了在 c 代码中使用该标头的方法?
如果有人能给我一些帮助,我将不胜感激!
太感谢了!
我尝试更新内核并将所有头文件移动到ёusr/local/includeё目录,因为它在互联网上说这是编译器首先检查头文件但仍然无法工作的地方。
所以这是我试过但没有用的代码。
ebpf - 从事件中分离 bpf 对象?
我希望能够从附加事件中分离我的 BPF 对象。是从事件中分离以销毁 BPF 对象的唯一方法吗?
我试图避免每次启动我要跟踪的新程序和/或跟踪的事件发生更改时都必须创建/销毁对象。
提前感谢您的帮助!
c - eBPF:连接到 security_socket_connect 时如何读取 sockaddr 结构
正如演示文稿Security Monitoring with eBPF中所建议的那样,我正在尝试连接security_socket_connect。
虽然我的基于gobpf / bcc的代码部分有效,但我似乎无法读取sockaddr
结构中的 IP 地址。
相关部分如下所示:
之后,我尝试读取 addr2 中的 IP 地址。第一次尝试是:
第二次尝试是bpf_probe_read
:
两个选项都出现相同的错误:
可以在此处找到带有可构建示例的 repo:socket-connect-bpf
networking - 来自内核空间和用户空间的 eBPF(BCC) 目标 IP 地址不匹配
我正在使用 eBPF 和 BCC 打印出我收到的数据包的 IP 地址。
对于内核,我编写了一个从 ip_t -> dst 打印出来的代码;我认为它是目的地的地址。
对于用户空间,我编写了一个代码来从字节码中打印出用户地址。
我已经用其他变量检查了很多次,看看我的程序是否向我显示了数据包头中存储的正确数据值,并且除了地址之外它都运行良好。
因此,对于用户级别,我得到:目标 ip 地址 = 203.237.53.121
这是我给服务器的静态 IP 地址。
但是,当我打印出 ip_t -> dst 时,我得到:3421320703
我不明白为什么他们会有不同的输出。
我正在尝试最终构建一个程序,我的目标是仅从特定的发件人 IP 地址等获取数据包。
如果有人可以帮助我,那就太好了。
谢谢 :)
linux - 尝试学习eBPF尾调用,无法附加kprobe
嗨,我正在尝试学习如何使用 eBPF 地图,因此我尝试运行在 BCC 文档上找到的简单代码。
这是我使用的 c 代码,名称为 :tailcall_test.c :
我不太确定需要包含哪些头文件或库,所以我把所有东西都扔在那里了。对脏代码感到抱歉:(
无论如何,当我尝试运行它时它给了我这个错误:
任何帮助..?非常感谢你。
另外,如果你们有任何建议可以检查以了解如何使用 eBPF 尾调用,如果你们能与我分享,我将不胜感激。
提前非常感谢。
linux - 从内核树编译 eBPF C 代码时出错
我正在尝试将用 C 编写的 BPF 程序构建到加载它所需的 bpf 字节码中。我用这篇文章试图让我开始:https ://blogs.oracle.com/linux/notes-on-bpf-4
由于库依赖性,我不想使用 BCC。我正在使用 ubuntu 18.04(Linux bpf-ubuntu 4.15.0-1036-gcp #38-Ubuntu SMP Mon Jun 24 13:49:05 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux)
目前我的文件非常简单(并且可能不正确),因为我仍在尝试编译工作:
用于构建和结果的命令是:
我不确定如何解决这个问题。我只能假设我包含标题的方式不正确。
ebpf - 异常:执行 sudo opensnoop-bpfcc 时无法将 BPF 附加到 kprobe
当我尝试执行时,sudo opensnoop-bpfcc
我收到此消息:
我不明白如何解决它。我刚刚使用此命令安装了密件抄送工具
正如github页面上的建议https://github.com/iovisor/bcc/blob/master/INSTALL.md#ubuntu---binary
正在运行的操作系统是 18.04.2 LTS(仿生海狸)。
python - 为什么我被迫使用原始套接字来编写带有 BCC 的 ebpf 程序?
目标:编写一个不需要高权限的 eBPF 包过滤程序。
问题:据我了解,我必须使用attach_raw_socket
函数将过滤器附加到接口。此函数调用bpf_open_raw_sock
libbpf 函数,该函数打开需要高权限的 raw_socket ( https://github.com/iovisor/bcc/blob/10dae9eac33287c1df9e6645933b608c2d2c5640/src/cc/libbpf.c#L674-L678 )。
问题:有没有办法将 ebpf 过滤器附加到另一种套接字类型,例如 SOCK_DGRAM(可以使用 cBPF)?
python - eBPF:读取 getaddrinfo 的结果
与 BPF 编译器集合 (bcc) 中的gethostlatency.py工具类似,我想跟踪对getaddrinfo
. 另外,我想收集返回值(IP 地址、地址族)
但是,我似乎无法通过 BPF 验证程序返回正确结果的解决方案。
getaddrinfo 函数:
结果以struct addrinfo **res
.
此代码示例直接基于gethostlatency.py至少不会返回任何错误,而是返回错误的结果:
可能出错的事情:
- 我复制了
addrinfo
类型定义,netdb.h
因为它在密件抄送中似乎无法访问。 - 我收集结果的方式:
currres.update(&pid, &res);
- 我从结果中读取的方式:
bpf_probe_read(&data.af, sizeof(data.af), &resx->ai_family);
在这个示例中,程序只是试图读取地址族(AF)。因此,预期值将是 2 (AF_INET) 或 10 (AF_INET6),而不是显示像 32xxx 这样的数字。
要触发输出,必须发出 DNS 请求。
上面的这个程序版本也显示了一个警告:
解决警告会导致 BPF 验证器中出现更多神秘错误。
使用内核版本 4.18 在 x64 上测试。
bpf - XDP 卸载模式标志集不适用于密件抄送
我正在尝试运行密件抄送中提供的本教程 XDP 代码。
我使用的代码是这个脚本:bcc/examples/networking/xdp/xdp_drop_count.py。
据我了解,XDP 标志的工作方式如下(来自那个问题):
那么,这是否意味着如果我将标志位更改为
我应该能够以硬件加速模式(卸载)运行此代码吗?
我有一个支持 XDP HW 加速模式的网卡,当我只用一行代码附加一个简单的程序时它工作正常:
ip link set dev interface xdpoffload
并通过使用等以卸载模式附加它。
所以我已经确认我的 NIC 能够加载卸载的 XDP 程序,但是当我尝试上述操作时,它给了我一个错误:
另外,当我将标志设置为:
我不确定这是否真的在驱动程序模式下运行 XDP 程序。
我错过了什么吗?
先感谢您。