问题标签 [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.
python - How can I re-filter a scapy packet using BPF?
I'm writing a program that needs to re-filter the packets captured by sniff().I want to apply BPF filer to each packet and if it matches, return true, else return false.
Could any one give me some hints?Thanks!
trace - 是否可以使用 eBPF 或 perf 来计算在单个跟踪函数中花费的时间?
目前,我可以告诉trace-cmd
(一个 ftrace 前端)使用 ftrace 的函数图基础结构来跟踪指定的工作负载。使用一些跟踪数据处理工具,我可以查看调用函数的频率以及每个函数调用的相应总持续时间。示例输出可能如下所示,其中我跟踪工作负载生成的 ext4 函数调用:
我已经看到可以通过、、等生成的令人难以置信的火焰图,这让我相信我应该能够实现与使用or的输出相似的输出。但是,有一些障碍:eBPF
systemtap
perf
trace-cmd
perf
eBPF
- 我的工作负载最多可以运行 15 分钟,如果我使用
perf
. 作为参考,您可以查看在更短的时间内跟踪 bash 的示例输出。 - 我不够熟悉,
eBPF
无法确定我是否可以实现与我trace-cmd
的后处理示例输出类似的数据/输出。
对于那些比我更熟悉eBPF
或perf
比我更熟悉的人,我想知道:
- 是否可以使用
eBPF
或perf
实现我的目标? - 如果是这样,为什么可能?
如果您感觉特别慷慨,将不胜感激可以帮助我实现目标的示例代码/命令。
linux-kernel - 无法附加 eBPF blob
我刚刚从内核编译了 BPF 示例tools/testing/selftests/bpf
并尝试按照http://cilium.readthedocs.io/en/v0.10/bpf/中的说明进行加载:
这发生在内核 4.4.0-98 的 Ubuntu 16.04.3 LTS 上,llvm
并且clang
从包安装的版本 3.8iproute2
是来自 github 的最新版本。
我怀疑我遇到了一些工具链/内核版本/功能不匹配的问题。
我究竟做错了什么?
c# - Berkeley Packet Filter 到高级过滤表达式
我有一个 C 程序,它通过 Berkeley Filter 手动设置 WinPcap 会话的过滤器。现在我想用 Pcap.Net 在 C# 中传输这个工具。Pcap.Net 不提供原始伯克利过滤器作为参数,而是提供高级过滤表达式(也用于例如 wireshark/tcpdump 等ip and tcp
)
有没有办法
- 将伯克利包过滤器“反编译”为高级过滤表达式
- 在 pcap.net 中为过滤器使用原始字节流
原始 bpf_program:
编辑澄清:Berkeley Packet Filter是基于 unix 的系统的接口。WinPcap 使用这个 BPF,Pcap.Net 也是如此。Pcap.Net 有一个类来处理 BPF,也称为BarkeleyPacketFilter
. 该类只接受高级过滤表达式(如tcp port 80
)。
我寻找一种使用原始过滤器(参见上面的代码块)而不是高级表达式来提供 BPF 类的方法。
linux-kernel - 简单的 eBPF 操作不与 tc 一起生效
samples/bpf/pare_simple.c
我从(来自 Linux 内核树)编译了 BPF 示例,并进行了非常简单的更改:
所以我希望丢弃任何数据包。我安装它如下:
这发生在 Ubuntu 16.04.3 LTS 上,内核为 4.4.0-98,llvm 和从软件包安装的 3.8 版本的 clang,iproute2 是来自 github 的最新版本。
所以它似乎安装成功,但是这个过滤器/ebpf 不会丢弃数据包,我在eth0
接口上生成入口流量,例如 ICMP,它会继续。我究竟做错了什么?
linux-kernel - 如何从内核树中构建 BPF 程序
内核在samples/bpf
. 我有兴趣在树之外构建一个示例,就像我们构建一个内核模块一样,它Makefile
可以足够简单。是否可以对 bpf 做同样的事情?我尝试通过删除不必要的部分samples/bpf/Makefile
并保持对libbpf
和其他部分的依赖关系,但结果并不是那么容易。
例如,尝试samples/bpf/bpf_tcp_kern.c
使用以下命令行在内核树之外构建(我查看了 samples/bpf/Makefile 以及 的输出make samples/bpf V=1
):
这是与clang-llvm 3.8.0
而且我需要libbpf
构建用户端 bpf 应用程序。这部分工作得很好。
我错过了什么吗?我相信这项任务应该相当容易;-)
linux-kernel - bpf_printk() 的输出
在运行一些示例时,samples/bpf
我注意到bpf_printk
输出前面带有一些额外的信息,例如:
BPF command: 2
是传递给bpf_printk
bpf 程序的实际字符串,但其余的是什么?我假设这来自内核的 JIT ?
我在哪里可以更仔细地查看这些位的含义?谢谢。
debugging - 在 netlink 消息上调试 bpf 代码
我正在编写一个 bpf 过滤器来防止某些网络链接消息。我正在尝试调试 bpf 代码。有没有可以帮助我的调试工具?
我最初是在考虑使用 nlmon 来捕获 netlink 消息:
来自https://jvns.ca/blog/2017/09/03/debugging-netlink-requests/
# 创建网络接口
sudo ip link add nlmon0 type nlmon
sudo ip link set dev nlmon0 up
sudo tcpdump -i nlmon0 -w netlink.pcap # 捕获你的数据包
然后使用 ./bpf_dbg ( https://github.com/cloudflare/bpftools/blob/master/linux_tools/bpf_dbg.c )
1)./bpf_dbg
进入shell(用'>'表示的shell cmds):
2)>加载bpf 6,40 0 0 12,21 0 3 20...(这是我打算调试的bpf代码)
3)>加载pcap netlink.pcap
4) > run /disassemble/dump/quit (self-explanatory)
5) > breakpoint 2 (在加载的 BPF insns 2 处设置 bp,run
然后执行;可以设置多个 bps,当然,调用breakpoint
w/ o args 显示当前加载的bps,breakpoint reset
用于重置所有断点)
6)>选择3(run
等将从pcap中的第三个数据包开始)
7)>步骤[-,+](通过BPF执行单步执行)
以前有人试过吗?
另外,我无法让 nlmon 模块加载到我的 linux 内核上(有这个文档吗?)
我正在运行内核版本 Linux 版本 4.10.0-40-generic nlmon 模块似乎存在于内核源代码中:
https://elixir.free-electrons.com/linux/v4.10/source/drivers/net/nlmon.c#L41
但是,当我在 /lib/modules/ 中搜索 nlmon.ko 时,我什么也没找到。
linux-kernel - 无法使用密件抄送工具将 eBPF `kretprobes` 附加到 `napi_poll()`
想法是用来argdist
测量延迟时间,napi_poll()
其中返回处理的数据包数量(称为工作)。执行延迟与napi_poll()
处理的数据包数量的比率将为我提供以直方图形式处理每个数据包所需的平均时间。
我正在使用以下命令
argdist -H 'r:c:napi_poll():u64:$latency/$retval#avg time per packet (ns)'
这最终给了我错误Failed to attach BPF to kprobe
,在 dmesg 我收到类似的消息Could not insert probe at napi_poll+0: -2
我只是好奇为什么当类似的技巧适用时kretprobes
我不能附加?napi_poll()
net_rx_action()
linux-kernel - 谁在 BPF 中创建地图
在阅读man bpf
和其他一些文档来源之后,我的印象是 amap
只能由用户进程创建。然而,下面的小程序似乎神奇地创建了bpf
地图:
所以我用内核加载程序,tools/bpf/bpftool
并验证程序是否已加载:
当然地图是空的。但是,bpf_map_lookup_elem
从程序中删除会导致不创建地图。
更新
我用它调试它,strace
发现在这两种情况下,即有bpf_map_lookup_elem
和没有它,bpftool 确实调用bpf(BPF_MAP_CREATE, ...)
并且它显然成功了。然后,如果 bpf_map_lookup_elem 被遗漏,我 strace onbpftool map show
并bpf(BPF_MAP_GET_NEXT_ID, ..)
立即返回ENOENT
,它永远不会转储地图。所以很明显有些东西没有完成地图的创建。
所以我想知道这是否是预期的行为?
谢谢。