L1层驱动截包法
优点:因为暴力所以方便,不需要对linux内核有很深入地了解,过滤输出的报文很简单。
缺点:与设备相关,扩展性差,对接收到的报文要做很复杂的修改相对麻烦。
适用:开发周期短,功能相对简单,不需要对接收报文做三层以上复杂过滤的情况。
L2层虚拟设备截包法
优点:与具体设备和协议无关,扩展性好,高效,通过修改路由也可以有很多更多功能的应用。
缺点:只能截获发出的报文,要结合路由使用。
适用:需要考虑扩展性或者多网卡支持的情况,或者基于路由的一些特殊应用。
L3层自定义协议截包法
优点:通过协议头来过滤报文,可读性和扩展性好。
缺点:因为优雅所以麻烦,只能截获接收的报文。
适用:有专用协议头的情况。
L3层netfilter截包法
优点:netfilter框架严密,钩子点很有代表性,易扩展,易维护,很容易作为一个单独的可加载模块来开发,方便调试。
缺点:修改3层以下的报文相对困难。
适用:不需要修改3层以下报文头的情况,应该是用途广的截包方法了。
应用层raw socket截包法
优点:在用户态运行就可以方便的监听想要的各种报文。
缺点:无力删改报文,无力截获其他线程发送的报文。
适用:只监听不修改的情况。
应用层pcap软件包截包法
优点:开发简单,而且libpcap库能大大简化对报文的分析工作。
缺点:需要libpcap库支持,无力删改报文,无力截获其他线程发送的报文。
适用:只监听不修改的情况。
当然,网络截包还有一个很重要的考虑因素就是性能,对于接收报文的拦截来说,偏底层的截包法效率较高,而对于发送报文的拦截,偏上层的截包法效率更高。
佛说,没有最好的,只有最合适的,所以做网络报文截取的时候要综合考虑实际需求,采用最合适的方法,就能事半功倍。