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中一样:
我的方法是扩展了使用Bloom过滤器原理扩展的netsniff(或tcpdump或Wireshark)中的捕获机制,以获得更紧凑的Berkeley Packet Filter(BPF)程序.这种方法效果很好,但副作用是即使滤波器丢弃了数据包(因此它没有出现在RX_RING中),它仍然继续在内核中运行.最终,由于没有接收到大部分过滤流量(主要是通过netsniff的trafgen进行合成)的开放套接字,因此destination-unreachable会生成ICMP 消息.
以不同方式制定的问题是,在网络堆栈处理的早期阶段,是否存在基于自定义代码(例如使用Bloom过滤器)选择性地丢弃流量的C/C++方法?
我已经研究了基于iptables的方法,但是通过iptables-restore管理防火墙规则对于这种情况来说似乎太麻烦了.此外,地址不是连续的IP地址集,因此会导致一长串单独的地址进行测试.
由于涉及大量的流量,效率是一个关键方面.
您可能想尝试iptables使用 usinglibipq和libiptc库。