自1995年ipfwadm开始进入1.2.1的核心,Linux的防火墙实现有很长的时间了。Ipfwadm实现了标准的tcp/ip包过滤功能,比如过滤源地址与目的地址以及端口过滤。早在1999年第一个稳定的2.2.0核心中防火墙的实现被ipchains替代了,ipchains的新功能包括支持规则链,碎片包控制,较好的网络地址翻译功能(NAT)以及其他一些有用的改进。我们需要明白Linux防火墙包括核心级代码(通常是可加载核心模块或者核心源程序的补丁)和用户级代码(一个配置的工具,比如 /usr/bin/ipchains,这是用来插入包规则到核心空间的)因此无论如何,只要新的linux防火墙代码被引入,核心和用户空间的有关代码都要改写。
2001年2.4的核心完成了,iptables出现了。它引入了很多重要的改进,比如基于状态的防火墙,基于任何 TCP标记和MAC地址的包过滤,更灵活的配置和记录功能,强大而且简单的NAT功能和透明代理功能,通过速度限制实现DoS的阻止(更详细的资料请参看 A Comparison of iptables Automation Tools一文)。
然而,最重要变化是引入了模块化的架构方式。比如,ipchains和ipfwadm兼容模式是通过一个核心模块的设置实现的,该模块能够在运行的核心中插入,以便提供相应的通讯功能。在附加的变化中,用户自定义编码功能已经成为了可能,比如过滤一定范围的端口,根据TTL值和包的到达时间进行判断,对自定义的协议进行状态监视,对随机的数据包进行监视等,这些目前都还不是iptable的一部分,但是在未来将被实现。很多很有趣的新模块已经完成了。编写一个可加载的核心模块来创建核心级代码,通过用户级代码实现控制过滤器的行为。参见Rusty Russell's Linux iptables HOWTO
本文主要关注字符串模式匹配的功能,(显然,是通过模块实现的),该功能可以限制和研究数据包的有效载荷。这是iptable技术的一个非常有意义的突破,它超越了传统的包过滤防火墙的标准TCP/IP标志监视功能。传统的防火墙可以分为包过滤和应用代理两种类型,应用代理防火墙可以分别出应用层的协议比如 telnet,HTTP或者SMTP,能够监视这些协议的有效载荷和检查命令,但是应用代理防火墙带来了巨大的性能缺陷:当通过网络协议栈处理上层即应用层的数据包。同时我们需要为每一个要监控的协议编写新的代理程序。包过滤防火墙通常只监视源地址和目的地址,源端口和目的端口,TCP/IP标志等,而完全忽略了高层协议的有效载荷。由于上述原因,包过滤防火墙通常比应用代理防火墙的速度快。应用代理提供了更加有力度的安全控制而包过滤可以用于更高的带宽线路满足更高的吞吐量。