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

标签 c++ linux networking

我正在研究在 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/

相关文章:

c++ - 为什么在提到纯右值时这里使用术语 "object"?

c++ - tolua++ 忽略赋值和不等运算符?

c - 在 gcc 中禁用可变长度自动数组

linux - Linux 套接字缓冲区如何溢出?

c# - uwp 中的 Wi-Fi 直连

java - C# 中的代理服务器

c++ - 如何通过名称获取 id 顶点?

c++ - 从地址查找堆或堆 block 或段

c - GDB - 将串行输出(从 dmesg)重定向到文件,而不是 gdb 输出/TUI?

linux - Redisused_memory_rss 大于配置集 'maxmemory' 吗?