【问题标题】:BSD Packet Interception (Not Copying)BSD 数据包拦截(不复制)
【发布时间】: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


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    看看OpenDPI 或nDPI。

    【讨论】:

    • 感谢您的努力,但它们都是基于 libpcap 的流量嗅探器。我已找到问题的答案,并将更新帖子以包含答案。
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2013-07-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-05
      • 1970-01-01
      • 1970-01-01
      • 2015-11-22
      • 2012-02-22
      相关资源
      最近更新 更多