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 信息包(或,简称信息包)— 以流的形式从源系统传输到目的地系统的一些小块数据 — 组成。这些信息包有头,即在每个包前面所附带的一些数据位,它们包含有关信息包的源、目的地和协议类型的信息。防火墙根据一组规则检查这些头,以确定接受哪个信息包以及拒绝哪个信息包。我们将该过程称为信息包过滤。
netfilter/iptables 系统是如何工作的? netfilter/iptables IP 信息包过滤系统是一种功能强大的工具,可用于添加、编辑和除去规则,这些规则是在做信息包过滤决定时,防火墙所遵循和组成的规则。这些规则存储在专用的信息包过滤表中,而这些表集成在 Linux 内核中。在信息包过滤表中,规则被分组放在我们所谓的链(chain)中。我马上会详细讨论这些规则以及如何建立这些规则并将它们分组在链中。
虽然 netfilter/iptables IP 信息包过滤系统被称为单个实体,但它实际上由两个组件 netfilter 和 iptables 组成。
接下来,将信息包的头信息与它所传递到的链中的每条规则进行比较,看它是否与某条规则完全匹配。如果信息包与某条规则匹配,那么内核就对该信息包执行由该规则的目标指定的操作。但是,如果信息包与这条规则不匹配,那么它将与链中的下一条规则进行比较。最后,如果信息包与链中的任何规则都不匹配,那么内核将参考该链的策略来决定如何处理该信息包。理想的策略应该告诉内核 DROP 该信息包。图 1 用图形说明了这个信息包过滤过程。
硬件:要使用 netfilter/iptables,需要有一个运行 Linux OS 并连接到因特网、LAN 或 WAN 的系统。 软件:带有内核 2.4 或更高版本的任何版本的 Linux OS。可以从 下载最新版本的内核。还需要从 下载 iptables 这个用户空间工具,因为这个工具不是内核的一部分。但对于 RedHat Linux 版本 7.1 或更高版本,不需要下载此工具,因为在版本 7.1 或更高版本中,标准安装中已经包含了此工具。 用户:至少对 Linux OS 有中等水平的了解,以及具备配置 Linux 内核的经验。
安装前的准备 在开始安装 iptables 用户空间工具之前,需要对系统做某些修改。首先,需要使用 make config 命令来配置内核的选项。在配置期间,必须通过将 CONFIG_NETFILTER 和 CONFIG_IP_NF_IPTABLES 选项设置为 Y 来打开它们,因为这是使 netfilter/iptables 工作所必需的。下面是可能要打开的其它选项:
清单 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 the following command:
# make KERNEL_DIR=/usr/src/linux/
Here the KERNEL_DIR=/usr/src/linux/ specifies the path to the kernel's directory. If the directory of kernel happens to be different on some systems, the appropriate directory path should be substituted for /usr/src/linux. Now install the source binaries using the following command:
# make install KERNEL_DIR=/usr/src/linux/
Now the installation is complete.
注:如果您有 RedHat Linux 版本 7.1 或更高版本,就不需要执行这里说明的前两个步骤。正如我们所知道的,该 Linux 分发版(distribution)的标准安装中包含了 iptables 用户空间工具。但在缺省情况下,这个工具是关闭的。为了使该工具运行,需要执行以下步骤(清单 2):
清单 2. 在 RedHat 7.1 系统上设置用户空间工具的示例 First you'll have to turn off the old ipchains module (predecessor of iptables) available in this OS package. This can be done using the following command:
# chkconfig --level 0123456 ipchains off
Next, to completely stop the ipchains module from running, so that it doesn't conflict with the iptables tool, you will have to stop the ipchains service using the following command:
# service ipchains stop
Now if you don't want to keep this old ipchains module on your system, uninstall it using the following command:
# rpm -e ipchains
Now you can turn on the iptables userspace tool with the following command:
# chkconfig --level 235 iptables on
Finally, you'll have to activate the iptables service to make the userspace tool work by using this command:
# service iptables start
Now the userspace tool is ready to work on a RedHat 7.1 or higher system.
状态 ESTABLISHED 指出该信息包属于已建立的连接,该连接一直用于发送和接收信息包并且完全有效。INVALID 状态指出该信息包与任何已知的流或连接都不相关联,它可能包含错误的数据或头。状态 NEW 意味着该信息包已经或将启动新的连接,或者它与尚未用于发送和接收信息包的连接相关联。最后,RELATED 表示该信息包正在启动新连接,以及它与已建立的连接相关联。