netfilter/iptables 是与最新的 2.4.x 版本 Linux 内核集成的 IP 信息包过滤系统。如果 Linux 系统连接到因特网或 LAN、服务器或连接 LAN 和因特网的代理服务器,则该系统有利于在 Linux 系统上更好地控制 IP 信息包过滤和防火墙配置。Mugdha Vairagade 将介绍 netfilter/iptables 系统、它是如何工作的、它的优点、安装和配置以及如何使用它来配置 Linux 系统上的防火墙以过滤 IP 信息包。
注:至少具备 Linux OS 的中级水平知识,以及配置 Linux 内核的经验,将有助于对本文的理解。
对于本文,我们将使用 iptables 用户空间工具版本 1.2.6a 和内核版本 2.4.9。
Linux 安全性和 netfilter/iptables
Linux 因其健壮性、可靠性、灵活性以及好象无限范围的可定制性而在 IT 业界变得非常受欢迎。Linux 具有许多内置的能力,使开发人员可以根据自己的需要定制其工具、行为和外观,而无需昂贵的第三方工具。如果 Linux 系统连接到因特网或 LAN、服务器或连接 LAN 和因特网的代理服务器,所要用到的一种内置能力就是针对网络上 Linux 系统的防火墙配置。可以在 netfilter/iptables IP 信息包过滤系统(它集成在 2.4.x 版本的 Linux 内核中)的帮助下运用这种能力。
在如 ipfwadm 和 ipchains 这样的 Linux 信息包过滤解决方案中,netfilter/iptables IP 信息包过滤系统是最新的解决方案,而且也是第一个集成到 Linux 内核的解决方案。对于 Linux 系统管理员、网络管理员以及家庭用户(他们想要根据自己特定的需求来配置防火墙、在防火墙解决方案上节省费用和对 IP 信息包过滤具有完全控制权)来说,netfilter/iptables 系统十分理想。
理解防火墙配置和信息包过滤
对于连接到网络上的 Linux 系统来说,防火墙是必不可少的防御机制,它只允许合法的网络流量进出系统,而禁止其它任何网络流量。为了确定网络流量是否合法,防火墙依靠它所包含的由网络或系统管理员预定义的一组规则。这些规则告诉防火墙某个流量是否合法以及对于来自某个源、至某个目的地或具有某种协议类型的网络流量要做些什么。术语“配置防火墙”是指添加、修改和除去这些规则。稍后,我将详细讨论这些规则。
网络流量由 IP 信息包(或,简称信息包)— 以流的形式从源系统传输到目的地系统的一些小块数据 — 组成。这些信息包有头,即在每个包前面所附带的一些数据位,它们包含有关信息包的源、目的地和协议类型的信息。防火墙根据一组规则检查这些头,以确定接受哪个信息包以及拒绝哪个信息包。我们将该过程称为信息包过滤。
为什么要配置自己的防火墙?
出于各种因素和原因,需要根据特定需求来配置防火墙。或许,最重要的原因是安全性。
管理员可能想让他们的防火墙能够阻止未经授权的源访问其 Linux 系统,例如通过 Telnet。他们可能还想限制进出其系统的网络流量,以便只有来自可信源的流量才可以进入其系统,以及只有授权的流量才可以出去。家庭用户可能通过允许所有的出站信息包都可以通过,将防火墙配置成较低的安全性级别。
另一个背后的原因是,通过阻塞来自类似广告站点之类的源的多余流量,可以节省带宽。
因而,可以定制防火墙配置来满足任何特定需求和任何安全性级别需求。这就是 netfilter/iptables 系统的用武之处。
netfilter/iptables 系统是如何工作的?
netfilter/iptables IP 信息包过滤系统是一种功能强大的工具,可用于添加、编辑和除去规则,这些规则是在做信息包过滤决定时,防火墙所遵循和组成的规则。这些规则存储在专用的信息包过滤表中,而这些表集成在 Linux 内核中。在信息包过滤表中,规则被分组放在我们所谓的链(chain)中。我马上会详细讨论这些规则以及如何建立这些规则并将它们分组在链中。
虽然 netfilter/iptables IP 信息包过滤系统被称为单个实体,但它实际上由两个组件 netfilter 和 iptables 组成。
netfilter 组件也称为内核空间(kernelspace),是内核的一部分,由一些信息包过滤表组成,这些表包含内核用来控制信息包过滤处理的规则集。
iptables 组件是一种工具,也称为用户空间(userspace),它使插入、修改和除去信息包过滤表中的规则变得容易。除非您正在使用 Red Hat Linux 7.1 或更高版本,否则需要从 netfilter.org 下载该工具并安装使用它。
通过使用用户空间,可以构建自己的定制规则,这些规则存储在内核空间的信息包过滤表中。这些规则具有目标,它们告诉内核对来自某些源、前往某些目的地或具有某些协议类型的信息包做些什么。如果某个信息包与规则匹配,那么使用目标 ACCEPT 允许该信息包通过。还可以使用目标 DROP 或 REJECT 来阻塞并杀死信息包。对于可对信息包执行的其它操作,还有许多其它目标。
根据规则所处理的信息包的类型,可以将规则分组在链中。处理入站信息包的规则被添加到 INPUT 链中。处理出站信息包的规则被添加到 OUTPUT 链中。处理正在转发的信息包的规则被添加到 FORWARD 链中。这三个链是基本信息包过滤表中内置的缺省主链。另外,还有其它许多可用的链的类型(如 PREROUTING 和 POSTROUTING),以及提供用户定义的链。每个链都可以有一个策略,它定义“缺省目标”,也就是要执行的缺省操作,当信息包与链中的任何规则都不匹配时,执行此操作。
建立规则并将链放在适当的位置之后,就可以开始进行真正的信息包过滤工作了。这时内核空间从用户空间接管工作。当信息包到达防火墙时,内核先检查信息包的头信息,尤其是信息包的目的地。我们将这个过程称为路由。
如果信息包源自外界并前往系统,而且防火墙是打开的,那么内核将它传递到内核空间信息包过滤表的 INPUT 链。如果信息包源自系统内部或系统所连接的内部网上的其它源,并且此信息包要前往另一个外部系统,那么信息包被传递到 OUTPUT 链。类似的,源自外部系统并前往外部系统的信息包被传递到 FORWARD 链。
接下来,将信息包的头信息与它所传递到的链中的每条规则进行比较,看它是否与某条规则完全匹配。如果信息包与某条规则匹配,那么内核就对该信息包执行由该规则的目标指定的操作。但是,如果信息包与这条规则不匹配,那么它将与链中的下一条规则进行比较。最后,如果信息包与链中的任何规则都不匹配,那么内核将参考该链的策略来决定如何处理该信息包。理想的策略应该告诉内核 DROP 该信息包。图 1 用图形说明了这个信息包过滤过程。
图 1. 信息包过滤过程
安装 netfilter/iptables 系统
因为 netfilter/iptables 的 netfilter 组件是与内核 2.4.x 集成在一起的,所以只需要下载并安装 iptables 用户空间工具。
需求
下面是安装 netfilter/iptables 系统的需求:
硬件:要使用 netfilter/iptables,需要有一个运行 Linux OS 并连接到因特网、LAN 或 WAN 的系统。
软件:带有内核 2.4 或更高版本的任何版本的 Linux OS。可以从 http://www.kernel.org 下载最新版本的内核。还需要从 http://www.netfilter.org 下载 iptables 这个用户空间工具,因为这个工具不是内核的一部分。但对于 RedHat Linux 版本 7.1 或更高版本,不需要下载此工具,因为在版本 7.1 或更高版本中,标准安装中已经包含了此工具。
用户:至少对 Linux OS 有中等水平的了解,以及具备配置 Linux 内核的经验。
安装前的准备
在开始安装 iptables 用户空间工具之前,需要对系统做某些修改。首先,需要使用 make config 命令来配置内核的选项。在配置期间,必须通过将 CONFIG_NETFILTER 和 CONFIG_IP_NF_IPTABLES 选项设置为 Y 来打开它们,因为这是使 netfilter/iptables 工作所必需的。下面是可能要打开的其它选项:
CONFIG_PACKET:如果要使应用程序和程序直接使用某些网络设备,那么这个选项是有用的。
CONFIG_IP_NF_MATCH_STATE:如果要配置有状态的防火墙,那么这个选项非常重要而且很有用。这类防火墙会记得先前关于信息包过滤所做的决定,并根据它们做出新的决定。我将在 netfilter/iptables 系统的优点一节中进一步讨论这方面的问题。
CONFIG_IP_NF_FILTER:这个选项提供一个基本的信息包过滤框架。如果打开这个选项,则会将一个基本过滤表(带有内置的 INPUT、FORWARD 和 OUTPUT 链)添加到内核空间。
CONFIG_IP_NF_TARGET_REJECT:这个选项允许指定:应该发送 ICMP 错误消息来响应已被 DROP 掉的入站信息包,而不是简单地杀死它们。
现在,可以准备安装这个用户空间工具了。
安装用户空间工具
在下载 iptables 用户空间工具的源代码(它类似于 iptables-1.2.6a.tar.bz2)之后,可以开始安装。您需要以 root 身份登录来执行安装。清单 1 给出了一个示例,它指出了安装该工具所需的命令、其必要的次序及其说明。
清单 1. 用户空间工具安装的示例
First, unpack the tool package into a directory:
# bzip2 -d iptables-1.2.6a.tar.bz2
# tar -xvf iptables-1.2.6a.tar
This will unpack the tool source into a directory named iptables-1.2.6a.
Now change to the iptables-1.2.6a directory:
# cd iptables-1.2.6a
The INSTALL file in this directory contains a lot of useful information
on compiling and installing this tool.
Now compile the userspace tool using