问题标签 [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.

0 投票
1 回答
3343 浏览

c - Linux 上的经典 BPF:过滤器不起作用

我正在尝试通过将经典 BPF 附加到原始套接字来测试用于数据包过滤的经典 BPF。我想捕获源端口的第一个字节 == 8 (tcpdump 'tcp[1:1] = 0x50') 的 TCP 数据包,但我在套接字上看不到传入的数据包。没有过滤器,我的代码可以正常工作。

这是代码示例:

过滤器的代码由 bpf_asm -c 从以下内容生成:

我还尝试了以下说明:我还尝试了以下操作:

它仅适用于 tcpdump =(

0 投票
1 回答
1763 浏览

java - BPF 表达式仅捕获 arp-reply 数据包

是否存在只捕获 arp-reply 数据包的BPF表达式?目前,我正在使用 Pcap4J 和以下 BPF 表达式:

arp 和 dst 主机host和 ether dst mac

其中host是我的设备的 IP 地址,而mac是我的主网络接口的 MAC 地址。不幸的是,当数据包被捕获时,这个过滤器允许 ARP 广播请求也被捕获,所以我必须采取额外的步骤来检查 ARP 头的操作字段是 2 而不是 1。

0 投票
2 回答
2134 浏览

python - python中的BPF嗅探多个TCP端口的数据包

我从http://allanrbo.blogspot.in/2011/12/raw-sockets-with-bpf-in-python.html获得了代码。它工作正常,但我想嗅探多个 TCP 端口上的流量,如 port 9000, 80, 22...

所以我修改了filter_list类似的打击

问题是,有时它工作有时它不是,就像只在 9000 上获得流量而不是 80,有时在 80 上获得流量。我没有完全理解代码。有什么帮助吗?

0 投票
0 回答
205 浏览

linux - 如何使用 BPF 过滤查看原始套接字的 CPU 时间

假设我有一台linux机器,它在一个接口中有无限数量的数据包。我打开了一个原始套接字并设置了一个没有数据包通过的 bpf 过滤器。

现在,对于内核接收到的每个数据包,它都会运行 bpf 字节码并过滤掉数据。

如何查看内核占用的 CPU 使用率?它算作我的流程花费的时间吗?或者别的地方?我会用 top 看到这个吗?

谢谢

0 投票
1 回答
345 浏览

python - 当我使用 BPF 过滤器时 python 脚本的 CPU 利用率

我从这里得到代码。

我正在测试iperf3,通过以太网电缆生成从另一台笔记本电脑到我的笔记本电脑的流量。服务器(我的笔记本电脑)在 5021 上列出,客户端(另一台笔记本电脑)发送数据。

  • 如果我注释该行print 'got data from', addr, ':', hexlify(data)并运行脚本,脚本的 CPU 利用率会上升 30%,在 100MB 流量的情况下会上升 40%。
  • 如果我取消注释该行print 'got data from', addr, ':', hexlify(data)并再次运行,CPU 将下降到2%存在相同数量的流量。我登记了 htop

那么,这里发生了什么?

0 投票
0 回答
202 浏览

c - BPF 写入失败,1514 字节

我无法通过 to 写入 1514 字节(包括 L2 信息write/dev/bpf。我可以编写较小的数据包(这意味着我认为基本设置是正确的),但我看到全长数据包的“消息太长”。这是在 Solaris 11.2 上。

就好像写入将其视为 IP 数据包的写入。

根据规范,IP 部分有 1500 个字节,L2 标头有 14 个字节(如果标记为 18 个),校验和有 4 个字节。

我已经设置了我认为会阻止操作系统添加自己的第 2 层信息的功能(是的,我也觉得奇怪的是1 禁用它;下面的伪代码):

数据包永远不会超过 1514 字节(它们是通过端口跨度捕获的,并以源和目标 MAC 地址开始;我正在有效地重放它们)。

我确定我在这里遗漏了一些基本的东西,但我遇到了死胡同。任何指针将不胜感激!

部分答案此链接非常有帮助。

2017 年 3 月 20 日更新 代码适用于 Mac OS X,但在 Solaris 上会导致重复的“系统调用中断”(EINTR)。我开始阅读关于必须实现信号处理的可怕事情,我宁愿不这样做......

GitHub 上的示例代码基于我通过 Google 找到的各种代码。在大多数系统上,您必须以 root 权限运行它,除非您已将“net_rawaccess”授予用户。

仍在尝试找出 EINTR 问题。输出truss

编辑 2017 年 4 月 7 日 EINTR 问题是我放在 GitHub 上的示例代码中的错误的结果。代码没有将 bpf 设备与实际接口相关联,因此 Solaris 抛出了 EINTR。

现在我回到我还没有解决的“消息太长”问题。

0 投票
4 回答
4906 浏览

linux - eBPF 可以修改系统调用的返回值或参数吗?

为了模拟某些行为,我想将一个探针附加到系统调用并在传递某些参数时修改返回值。或者,在函数成为进程之前修改函数的参数也足够了。

BPF有可能吗?

0 投票
2 回答
1118 浏览

linux-kernel - 如何使用 BPF 访问内核变量?

例如,要访问skb函数中的变量ip_rcv

我搜索了互联网,但找不到任何示例。

0 投票
0 回答
137 浏览

reverse-engineering - BPF:将内存映射到 sock_filter 结构

我有一个运行 bpf 服务器的二进制文件。BPF“松散地”定义如下:

代码部分的片段是: 0x00000028 0x00000004 0x61000015 0x00000028 我正在通过 GDB 看这个。如何查看上述内存地址并确定哪些部分进入 sock_filter 结构?

如何确定哪个十六进制值映射到哪个特定 BPF 指令?

0 投票
1 回答
2654 浏览

python - How to filter packets for a list of IP using Scapy

I am trying to filter packets of a particular website in Python (using Scapy). I have a list of possible IPs (used for load balancing) of the website. I want to filter packets for all those IPs. How can I do that?

For a single IP, I am using the following code: