我想参与数据包转发(不是路由)。例如,系统是主机与其网关之间的第 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 库中得到的只是逻辑和算法,而不是实际的代码本身,这本身可以证明是没有的给我用。