gpt4 book ai didi

c - BSD 数据包拦截(不复制)

转载 作者:太空宇宙 更新时间:2023-11-03 23:52:01 25 4
gpt4 key购买 nike

我想参与数据包转发(不是路由)。例如,系统是主机与其网关之间的第 2 层网桥。我想检查第 7 层的字符串或任何“foo”并根据结果转发/丢弃/延迟数据包。我遇到的问题是拦截数据包。

目前我读到的内容:

我知道我可以从 BPF 设备获取数据包的副本(Steven McCanne 和 Van Jacobson 的 Usenix 论文 http://www.tcpdump.org/papers/bpf-usenix93.pdf )。这对嗅探有好处,但不适合我。

我可以访问 PF 设备并设置过滤规则,这有利于转发或丢弃决策,但不适用于检查。男人 pf (4)

我可以让数据包进入 ALTQ 队列,但我不知道如何访问位于队列中的单个数据包。男人 altq(9)

我还查看了 PF(/usr/src/sys/contrib/pf/net)、PFCTL (/usr/src/contrib/pf/pfctl) 和 ALTQ(/usr/src/sys) 的源代码/contrib/altq/altq)。在 FreeBSD 9.1 机器上

我不是 C 专家,但我很擅长。

也许我今天阅读所有内容感到厌倦并且错过了一些微不足道的事情。如果是这样请原谅我。另外,对于研究该主题的人来说,这将是一个很好的发现。

附言有一种方法可以控制“foo”的流量,方法是检测数据包中的“foo”,并通过设置过滤器来回答该请求,从而拒绝对该问题的回答。这不是我想要达到的目标。如果不应该,我不希望数据包离开系统。

编辑 2在 Linux 上有一种很好的方法可以做到这一点。我可以使用 libnetfilter_queue 在 Linux 上实现我在这里提到的一切。我不会在这里发布解决方案,因为有很多很多关于如何在 Linux 上执行此操作的教程。

总而言之,我仍在寻找有关如何在 BSD 上执行此操作的答案。据我所知,我需要编写一个基于 pf 的包装器/库(因为网上没有这样的东西——否则我应该已经找到了),它与 libnetfilter 的 libnetfilter_queue 库做同样的事情。或者我可以以某种方式深入研究 libnetfilter 并将其移植到 FreeBSD,但由于它是基于 iptables 的,所以我从深入研究 libnetfilter 库中得到的唯一东西是逻辑和算法,而不是实际的代码本身,它本身可以证明是没有的对我有用。

最佳答案

FreeBSD 9.1 有一个用于数据包访问的用户空间框架,称为 netmap。它是最近推出的,具有惊人的性能规模。它做的事情非常简单但功能强大 - 只需将 NIC 缓冲区映射到内存的用户空间部分,并将数据包处理与主机堆栈分离,这正是我所需要的,剩下的就交给我了。

如果有人需要这方面的货品引用,请引用man netmap (4)

关于c - BSD 数据包拦截(不复制),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17907222/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com