是否可以根据C/C++代码在Linux上的(一组动态变化的)IP地址丢弃传入的数据包?

bor*_*oka 5 c++ linux networking

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

背景资料

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

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

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

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

http://netsniff-ng.org/

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

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

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

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

Bas*_*tch 3

您可能想尝试iptables使用 usinglibipqlibiptc库。

  • 我有点担心基于 http://www.netfilter.org/documentation/FAQ/netfilter-faq-4.html#ss4.5 的 libiptc,但 libnetfilter_queue 似乎是一个我应该研究的有前途的方法。 (2认同)