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

C BSD数据包截获(不复制) 我想进入分组转发(不是路由)的中间。例如,该系统是主机与其网关之间的第2层桥梁。我想检查第7层的字符串或任何“foo”,并根据结果转发/丢弃/延迟数据包。我遇到的问题是拦截数据包,c,freebsd,packet,intercept,C,Freebsd,Packet,Intercept,到目前为止,我读到的是: 我知道我可以从BPF设备(Steven McCanne和Van Jacobson的Usenix paper)获得数据包的副本。这对嗅探有好处,但对我没有好处 我可以访问PF设备并设置过滤规则,这有利于转发或丢弃决策,但不利于检查。男警(4) 我可以将数据包放入ALTQ队列,但我不知道如何访问队列中的各个数据包。文员助理(9) 我还研究了PF(/usr/src/sys/contrib/PF/net)、PFCTL(/usr/src/contrib/PF/PFCTL)和ALT

到目前为止,我读到的是:

我知道我可以从BPF设备(Steven McCanne和Van Jacobson的Usenix paper)获得数据包的副本。这对嗅探有好处,但对我没有好处

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

我可以将数据包放入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_队列在Linux上实现我在这里提到的一切。我不会在这里发布解决方案,因为有很多关于如何在Linux上实现它的教程


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

看一看,或者。

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


如果有人需要任何商品参考,请参阅BSD实施中的“转移插座”。与Netmap不同,它不是零拷贝(IMHO),但是它可以与ipfw一起工作,以实现必要的过滤器,从而过滤您想要处理的包。

PCAP只是BPF的一个不错的接口,它有一个涉及汇编宏的可怕语法(尽管我不知何故通过了它)。您只能使用PCAP嗅探数据包。PCAP是数据包捕获库,由tcpdump编写。它不是用于数据包操作的,您可能将PCAP过滤器与实际流量过滤混淆了。PCAP筛选器用于筛选要捕获的流量,而不是实际的数据包。哎哟,nvm,很抱歉之前的评论被删除了,以免让更多的读者感到困惑。谢谢你的努力,但这些都是基于libpcap的流量嗅探器。我已经找到了问题的答案,并将更新帖子以包含答案。