BSD数据包拦截(不复制)

时间:2013-07-28 10:21:23

标签: c freebsd packet intercept

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

也许我今天厌倦了所有阅读并错过了一些微不足道的事情。如果是的话,请原谅我。此外,对于那些关注该主题的人来说,这将是一个非常好的发现。

P.S。有一种方法可以通过检测数据包中的“foo”来控制“foo”的流量,并通过设置过滤器来回答该请求来拒绝回复。这不是我想要实现的目标。我不希望数据包离开系统,如果它不应该。

EDIT 2 P.S.在Linux上有一种很好的方法。我可以通过libnetfilter_queue实现我在Linux上提到的所有内容。我不打算在这里发布解决方案,因为有很多关于如何在Linux上做这个教程的教程。

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

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

查看OpenDPInDPI

答案 2 :(得分:0)

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