2

我想参与数据包转发(不是路由)。例如,系统是主机与其网关之间的第 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 专家,但我很擅长。

也许我今天读完所有的书都累了,错过了一些琐碎的事情。如果是,请原谅我。另外,对于那些研究这个主题的人来说,这将是一个很好的发现。

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

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

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

4

3 回答 3

1

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

如果有人对此需要任何商品参考,请参考man netmap (4)

于 2013-08-16T08:48:35.857 回答
0

看看OpenDPInDPI

于 2013-08-11T23:11:36.820 回答
0

还可以查看 BSD 实现中的“转移套接字”。与 Netmap 不同,它不是零拷贝(恕我直言),但它可以与 ipfw 一起使用,以实现必要的过滤器,以便过滤您想要处理的包。

于 2016-01-18T15:00:11.397 回答