📄 netfilter-iptables 简介.htm
字号:
<P>通过使用用户空间,可以构建自己的定制规则,这些规则存储在内核空间的信息包过滤表中。这些规则具有<I>目标</I>,它们告诉内核对来自某些源、前往某些目的地或具有某些协议类型的信息包做些什么。如果某个信息包与规则匹配,那么使用目标
<CODE>ACCEPT</CODE> 允许该信息包通过。还可以使用目标 <CODE>DROP</CODE> 或
<CODE>REJECT</CODE> 来阻塞并杀死信息包。对于可对信息包执行的其它操作,还有许多其它目标。 </P>
<P>根据规则所处理的信息包的类型,可以将规则分组在链中。处理入站信息包的规则被添加到 <CODE>INPUT</CODE>
链中。处理出站信息包的规则被添加到 <CODE>OUTPUT</CODE> 链中。处理正在转发的信息包的规则被添加到
<CODE>FORWARD</CODE> 链中。这三个链是基本信息包过滤表中内置的缺省主链。另外,还有其它许多可用的链的类型(如
<CODE>PREROUTING</CODE> 和
<CODE>POSTROUTING</CODE>),以及提供用户定义的链。每个链都可以有一个<I>策略</I>,它定义“缺省目标”,也就是要执行的缺省操作,当信息包与链中的任何规则都不匹配时,执行此操作。
</P>
<P>建立规则并将链放在适当的位置之后,就可以开始进行真正的信息包过滤工作了。这时内核空间从用户空间接管工作。当信息包到达防火墙时,内核先检查信息包的头信息,尤其是信息包的目的地。我们将这个过程称为<I>路由</I>。
</P>
<P>如果信息包源自外界并前往系统,而且防火墙是打开的,那么内核将它传递到内核空间信息包过滤表的 <CODE>INPUT</CODE>
链。如果信息包源自系统内部或系统所连接的内部网上的其它源,并且此信息包要前往另一个外部系统,那么信息包被传递到
<CODE>OUTPUT</CODE> 链。类似的,源自外部系统并前往外部系统的信息包被传递到 <CODE>FORWARD</CODE> 链。
</P>
<P>接下来,将信息包的头信息与它所传递到的链中的每条规则进行比较,看它是否与某条规则完全匹配。如果信息包与某条规则匹配,那么内核就对该信息包执行由该规则的目标指定的操作。但是,如果信息包与这条规则不匹配,那么它将与链中的下一条规则进行比较。最后,如果信息包与链中的任何规则都不匹配,那么内核将参考该链的策略来决定如何处理该信息包。理想的策略应该告诉内核
<CODE>DROP</CODE> 该信息包。<A
href="http://www-900.ibm.com/developerWorks/cn/linux/network/s-netip/index.shtml#figure1">图
1</A> 用图形说明了这个信息包过滤过程。 </P>
<P><A name=figure1><B>图 1. 信息包过滤过程</B></A><BR><IMG height=294 alt=信息包过滤过程
src="netfilter-iptables 简介.files/diagram1.jpg" width=480> </P>
<P><A name=install_iptables><SPAN class=atitle2>安装 netfilter/iptables
系统</SPAN></A><BR>因为 netfilter/iptables 的 netfilter 组件是与内核 2.4.x
集成在一起的,所以只需要下载并安装 iptables 用户空间工具。 </P>
<P><A name=requirements><SPAN class=atitle3>需求</SPAN></A><BR>下面是安装
netfilter/iptables 系统的需求:
<UL>
<LI><B>硬件:</B>要使用 netfilter/iptables,需要有一个运行 Linux OS 并连接到因特网、LAN 或 WAN
的系统。
<LI><B>软件:</B>带有内核 2.4 或更高版本的任何版本的 Linux OS。可以从 <A
href="http://www.kernel.org/">http://www.kernel.org/</A> 下载最新版本的内核。还需要从
<A href="http://www.netfilter.org/">http://www.netfilter.org/</A> 下载
iptables 这个用户空间工具,因为这个工具不是内核的一部分。但对于 RedHat Linux 版本 7.1
或更高版本,不需要下载此工具,因为在版本 7.1 或更高版本中,标准安装中已经包含了此工具。
<LI><B>用户:</B>至少对 Linux OS 有中等水平的了解,以及具备配置 Linux 内核的经验。 </LI></UL>
<P></P>
<P><A name=preparations><SPAN class=atitle3>安装前的准备</SPAN></A><BR>在开始安装
iptables 用户空间工具之前,需要对系统做某些修改。首先,需要使用 <CODE>make config</CODE>
命令来配置内核的选项。在配置期间,必须通过将 <CODE>CONFIG_NETFILTER</CODE> 和
<CODE>CONFIG_IP_NF_IPTABLES</CODE> 选项设置为 <CODE>Y</CODE> 来打开它们,因为这是使
netfilter/iptables 工作所必需的。下面是可能要打开的其它选项:
<UL>
<LI><B><CODE>CONFIG_PACKET</CODE>:</B>如果要使应用程序和程序直接使用某些网络设备,那么这个选项是有用的。
<LI><B><CODE>CONFIG_IP_NF_MATCH_STATE</CODE>:</B>如果要配置<I>有状态的</I>防火墙,那么这个选项非常重要而且很有用。这类防火墙会记得先前关于信息包过滤所做的决定,并根据它们做出新的决定。我将在
<A
href="http://www-900.ibm.com/developerWorks/cn/linux/network/s-netip/index.shtml#advantage">netfilter/iptables
系统的优点</A>一节中进一步讨论这方面的问题。
<LI><B><CODE>CONFIG_IP_NF_FILTER</CODE>:</B>这个选项提供一个基本的信息包过滤框架。如果打开这个选项,则会将一个基本过滤表(带有内置的
<CODE>INPUT</CODE>、<CODE>FORWARD</CODE> 和 <CODE>OUTPUT</CODE> 链)添加到内核空间。
<LI><B><CODE>CONFIG_IP_NF_TARGET_REJECT</CODE>:</B>这个选项允许指定:应该发送 ICMP
错误消息来响应已被 <CODE>DROP</CODE> 掉的入站信息包,而不是简单地杀死它们。
</LI></UL>现在,可以准备安装这个用户空间工具了。
<P></P>
<P><A name=install_userspace><SPAN
class=atitle3>安装用户空间工具</SPAN></A><BR>在下载 iptables 用户空间工具的源代码(它类似于
iptables-1.2.6a.tar.bz2)之后,可以开始安装。您需要以 <CODE>root</CODE> 身份登录来执行安装。<A
href="http://www-900.ibm.com/developerWorks/cn/linux/network/s-netip/index.shtml#code1">清单
1</A> 给出了一个示例,它指出了安装该工具所需的命令、其必要的次序及其说明。 </P><A name=code1><B>清单 1.
用户空间工具安装的示例</B></A>
<TABLE cellSpacing=0 cellPadding=5 width="100%" bgColor=#cccccc
border=1><TBODY>
<TR>
<TD><PRE><CODE>
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.
</CODE></PRE></TD></TR></TBODY></TABLE>
<P><B>注:</B>如果您有 RedHat Linux 版本 7.1 或更高版本,就不需要执行这里说明的前两个步骤。正如我们所知道的,该
Linux 分发版(distribution)的标准安装中包含了 iptables
用户空间工具。但在缺省情况下,这个工具是关闭的。为了使该工具运行,需要执行以下步骤(<A
href="http://www-900.ibm.com/developerWorks/cn/linux/network/s-netip/index.shtml#code2">清单
2</A>):</P><A name=code2><B>清单 2. 在 RedHat 7.1 系统上设置用户空间工具的示例</B></A>
<TABLE cellSpacing=0 cellPadding=5 width="100%" bgColor=#cccccc
border=1><TBODY>
<TR>
<TD><PRE><CODE>
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.
</CODE></PRE></TD></TR></TBODY></TABLE>
<P>现在,一切都已妥当,并且 netfilter/iptables 系统应该正在运行,接下来,需要建立一些规则和链来过滤信息包。</P>
<P><A name=build_rule_chain><SPAN
class=atitle2>建立规则和链</SPAN></A><BR>通过向防火墙提供有关对来自某个源、到某个目的地或具有特定协议类型的信息包要做些什么的指令,规则控制信息包的过滤。通过使用
netfilter/iptables 系统提供的特殊命令
<CODE>iptables</CODE>,建立这些规则,并将其添加到内核空间的特定信息包过滤表内的链中。关于添加/除去/编辑规则的命令的一般语法如下:</P>
<P><CODE>$ iptables [-t table] command [match] [target]</CODE> </P>
<P><A name=table><SPAN class=atitle3>表(table)</SPAN></A><BR><CODE>[-t
table]</CODE>
选项允许使用标准表之外的任何表。表是包含仅处理特定类型信息包的规则和链的信息包过滤表。有三种可用的表选项:<CODE>filter</CODE>、<CODE>nat</CODE>
和 <CODE>mangle</CODE>。该选项不是必需的,如果未指定,则 <CODE>filter</CODE> 用作缺省表。 </P>
<P>filter 表用于一般的信息包过滤,它包含 <CODE>INPUT</CODE>、<CODE>OUTPUT</CODE> 和
<CODE>FORWARD</CODE> 链。nat 表用于要转发的信息包,它包含
<CODE>PREROUTING</CODE>、<CODE>OUTPUT</CODE> 和 <CODE>POSTROUTING</CODE>
链。如果信息包及其头内进行了任何更改,则使用 mangle 表。该表包含一些规则来标记用于高级路由的信息包,该表包含
<CODE>PREROUTING</CODE> 和 <CODE>OUTPUT</CODE> 链。 </P>
<P><B>注:</B><CODE>PREROUTING</CODE> 链由指定信息包一到达防火墙就改变它们的规则所组成,而
<CODE>POSTROUTING</CODE> 链由指定正当信息包打算离开防火墙时改变它们的规则所组成。 </P>
<P><A name=command><SPAN
class=atitle3>命令(command)</SPAN></A><BR>上面这条命令中具有强制性的 command 部分是
<CODE>iptables</CODE> 命令的最重要部分。它告诉 <CODE>iptables</CODE>
命令要做什么,例如,插入规则、将规则添加到链的末尾或删除规则。以下是最常用的一些命令:</P>
<UL>
<LI><B><CODE>-A</CODE> 或
<CODE>--append</CODE>:</B>该命令将一条规则附加到链的末尾。<BR>示例:
<P><CODE>$ iptables -A INPUT -s 205.168.0.1 -j ACCEPT</CODE>
</P>该示例命令将一条规则附加到 <CODE>INPUT</CODE> 链的末尾,确定来自源地址 205.168.0.1 的信息包可以
<CODE>ACCEPT</CODE>。 <BR><BR>
<LI><B><CODE>-D</CODE> 或 <CODE>--delete</CODE>:</B>通过用 <CODE>-D</CODE>
指定要匹配的规则或者指定规则在链中的位置编号,该命令从链中删除该规则。下面的示例显示了这两种方法。<BR>示例:
<P><CODE>$ iptables -D INPUT --dport 80 -j DROP<BR>$ iptables -D OUTPUT
3</CODE> </P>第一条命令从 <CODE>INPUT</CODE> 链删除规则,它指定 <CODE>DROP</CODE> 前往端口
80 的信息包。第二条命令只是从 <CODE>OUTPUT</CODE> 链删除编号为 3 的规则。 <BR><BR>
<LI><B><CODE>-P</CODE> 或
<CODE>--policy</CODE>:</B>该命令设置链的缺省目标,即策略。所有与链中任何规则都不匹配的信息包都将被强制使用此链的策略。
<BR>示例:
<P><CODE>$ iptables -P INPUT DROP</CODE> </P>该命令将 <CODE>INPUT</CODE>
链的缺省目标指定为 <CODE>DROP</CODE>。这意味着,将丢弃所有与 <CODE>INPUT</CODE>
链中任何规则都不匹配的信息包。 <BR><BR>
<LI><B><CODE>-N</CODE> 或
<CODE>--new-chain</CODE>:</B>用命令中所指定的名称创建一个新链。<BR>示例:
<P><CODE>$ iptables -N allowed-chain</CODE> </P>
<LI><B><CODE>-F</CODE> 或
<CODE>--flush</CODE>:</B>如果指定链名,该命令删除链中的所有规则,如果未指定链名,该命令删除所有链中的所有规则。此参数用于快速清除。<BR>示例:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -