gpt4 book ai didi

c++ - 是否有可能在 Linux 上从 C/C++ 代码中丢弃基于(一组动态变化的)IP 地址的传入数据包?

转载 作者:IT王子 更新时间:2023-10-29 00:36:15 24 4
gpt4 key购买 nike

我正在研究在 Linux 机器上根据 IP 地址过滤传入 UDP 流量的可能性,完全丢弃与任何过滤器地址匹配的数据包。我感兴趣的 IP 地址集是动态(且频繁)变化的,并且不是先验的。被视为丢弃的数据包应跳过所有进一步处理。我可以为进程授予 CAP_NET_RAW 能力,但不想编写自己的驱动程序或修改内核。

背景资料

我用于紧凑地表示大量 IP 地址的实用方法是布隆过滤器。这种方法已经被作为设备驱动程序实现的动态数据包过滤方法使用:

http://luca.ntop.org/Blooms.pdf

但是,我有用户级代码,无法调整内核或编写自己的设备驱动程序。

类似地,我已经有一个基于 PF_PACKET 套接字和 RX_RING 的有效方式嗅探基于 IP 地址的数据包的解决方案,就像在 netsniff-ng 中所做的那样:

http://netsniff-ng.org/

我的方法是在 netsniff(或 tcpdump 或 Wireshark)中扩展捕获机制,并使用 Bloom 过滤器原理进行扩展,以获得更紧凑的 Berkeley Packet Filter (BPF) 程序。这非常有效,但有副作用,即使过滤器丢弃数据包(因此它不会出现在 RX_RING 中),它仍然会在内核中继续它的旅程。最终,由于接收到的大部分已过滤流量(大部分是合成的,就像由 netsniff 的 trafgen 合成的)没有打开套接字,因此会生成 ICMP destination-unreachable 消息。

以不同方式表述的问题是,在网络堆栈处理的早期阶段,是否有一种 C/C++ 方法可以根据自定义代码(例如使用 Bloom 过滤器)选择性地丢弃流量?

我研究过基于 iptables 的方法,但通过 iptables-restore 管理防火墙规则对于这种情况来说似乎太麻烦了。此外,这些地址不是连续的 IP 地址集,因此会导致一长串要测试的单独地址。

由于涉及大量流量,效率是一个关键方面。

最佳答案

您可能想使用 iptables 或使用 libipqlibiptc 库。

关于c++ - 是否有可能在 Linux 上从 C/C++ 代码中丢弃基于(一组动态变化的)IP 地址的传入数据包?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12989458/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com