问题标签 [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 - Linux 上的经典 BPF:过滤器不起作用
我正在尝试通过将经典 BPF 附加到原始套接字来测试用于数据包过滤的经典 BPF。我想捕获源端口的第一个字节 == 8 (tcpdump 'tcp[1:1] = 0x50') 的 TCP 数据包,但我在套接字上看不到传入的数据包。没有过滤器,我的代码可以正常工作。
这是代码示例:
过滤器的代码由 bpf_asm -c 从以下内容生成:
我还尝试了以下说明:我还尝试了以下操作:
它仅适用于 tcpdump =(
java - BPF 表达式仅捕获 arp-reply 数据包
是否存在只捕获 arp-reply 数据包的BPF表达式?目前,我正在使用 Pcap4J 和以下 BPF 表达式:
arp 和 dst 主机host和 ether dst mac
其中host是我的设备的 IP 地址,而mac是我的主网络接口的 MAC 地址。不幸的是,当数据包被捕获时,这个过滤器允许 ARP 广播请求也被捕获,所以我必须采取额外的步骤来检查 ARP 头的操作字段是 2 而不是 1。
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 上获得流量。我没有完全理解代码。有什么帮助吗?
linux - 如何使用 BPF 过滤查看原始套接字的 CPU 时间
假设我有一台linux机器,它在一个接口中有无限数量的数据包。我打开了一个原始套接字并设置了一个没有数据包通过的 bpf 过滤器。
现在,对于内核接收到的每个数据包,它都会运行 bpf 字节码并过滤掉数据。
如何查看内核占用的 CPU 使用率?它算作我的流程花费的时间吗?或者别的地方?我会用 top 看到这个吗?
谢谢
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
那么,这里发生了什么?
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。
现在我回到我还没有解决的“消息太长”问题。
linux - eBPF 可以修改系统调用的返回值或参数吗?
为了模拟某些行为,我想将一个探针附加到系统调用并在传递某些参数时修改返回值。或者,在函数成为进程之前修改函数的参数也足够了。
BPF有可能吗?
linux-kernel - 如何使用 BPF 访问内核变量?
例如,要访问skb
函数中的变量ip_rcv
:
我搜索了互联网,但找不到任何示例。
reverse-engineering - BPF:将内存映射到 sock_filter 结构
我有一个运行 bpf 服务器的二进制文件。BPF“松散地”定义如下:
代码部分的片段是: 0x00000028 0x00000004 0x61000015 0x00000028 我正在通过 GDB 看这个。如何查看上述内存地址并确定哪些部分进入 sock_filter 结构?
如何确定哪个十六进制值映射到哪个特定 BPF 指令?
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: