在Linux的防火墙体系Netfilter下有一个独立的模块L7 filter 。从字面上看Netfilter是对网络数据的过滤,L7 filter是基于数据流应用层内容的过滤。不过实际上 L7 filter的本职工作不是对数据流进行过滤而是对数据流进行分类。它使用模式匹配算法把进入设备的数据包应用层内容与事先定义好的协议规则进行比对,如果匹配成功就说明这个数据包属于某种协议。
L7 filter是基于数据流工作的,建立在Netfilter connstrack功能之上。因为一个数据流或者说一个连接的所有数据都是属于同一个应用的,所以L7 filter没有必要对所以的数据包进行模式匹配,而只匹配一个流的前面几个数据包 (比如10个数据包)。当一个流的前面几个数据包包含了某种应用层协议的特征码时 (比如QQ),则这个数据流被L7 filter识别;当前面几个数据包的内容没有包含某种应用层协议的特征码时,则L7 filter放弃继续做模式匹配,这个数据流也就没有办法被识别。
做模式识别是一个很消耗计算资源的操作,特别是在网络应用下因为数据量很多所以更体现出对资源的占用上。在Linux内核,L7 filter其实非常影响网络处理的效率。所以在没有十分必要的时候尽量不要采用L7 filter做流量分类。现在出现了一个运行在Linux用户空间的版本 L7 filter-userspace ,这个软件运行时不会影响内核,但是处理效率会更低。实际上L7 filter-userspace 调用了netlink协议族的功能,整个处理过程至少进行了两次的数据包拷贝操作,能不影响效率吗?
不过话说回来,在对性能要求不高的应用上,L7 filter确实给我们提供了一个功能强大的网络流量管理工具。使用这个工具的操作也非常简单,只要会 Iptables配置Linux防火墙,就会配置L7 filter规则。一个配置封杀QQ应用的例子如下:
Iptables -t mangle -A POSTROUTING -d x.x.x.x -p udp -m layer7 --l7proto qq -j DROP