【发布时间】:2013-07-28 10:21:23
【问题描述】:
我想参与数据包转发(不是路由)。例如,系统是主机与其网关之间的第 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 P.S.在 Linux 上有一个很好的方法可以做到这一点。我可以使用 libnetfilter_queue 在 Linux 上实现我在这里提到的所有内容。我不会在这里发布解决方案,因为有很多很多关于如何在 Linux 上执行此操作的教程。
总之,我仍在寻找有关如何在 BSD 上执行此操作的答案。据我所知,我需要编写一个基于 pf 的包装器/库(因为网络上没有这样的东西——否则我应该已经找到它了),它与 libnetfilter 的 libnetfilter_queue 库做同样的事情。或者我可以以某种方式深入研究 libnetfilter 并将其移植到 FreeBSD,但由于它基于 iptables,所以我可以从研究 libnetfilter 库中得到的只是逻辑和算法,而不是实际代码本身,这本身可以证明是没有的给我用。
【问题讨论】:
-
PCAP 只是 BPF 的一个很好的接口,它有一个涉及汇编宏的可怕语法(尽管我以某种方式通过它)。你只能用 PCAP 嗅探数据包。
-
PCAP 是数据包捕获库,由 tcpdump 研究员编写,它不是用于数据包处理的,您可能会将 PCAP 过滤器与实际的流量过滤混淆。 PCAP 过滤器用于过滤要捕获的流量而不是实际数据包。 here is the link
-
ouch nvm,很抱歉之前的 cmets 被删除,以免让更多读者感到困惑。
标签: c freebsd packet intercept