Red Hat Enterprise Linux 5.0服务器构建与故障排除
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

10.2 Linux防火墙

10.2.1 Linux防火墙的历史

Linux提供了一个非常优秀的防火墙工具,即Netfilter/iptables(http://www.netfilter.org/)。它完全是免费的,并且可以在一台低配置的老机器上很好地运行。Netfilter/iptables功能强大,使用灵活,并且可以对流入和流出的信息进行细化的控制。

事实上,每一个主要的Linux版本中都有不同的防火墙软件套件,Iptabels(Netfilter)应用程序被认为是Linux中实现包过滤功能的第4代应用程序。

(1)第1代是Linux内核1.1版本,所使用的Alan Cox是从BSD UNIX中移植过来的Ipfw。

(2)在2.0版的内核中,Jos Vos和其他一些程序员对Ipfw进行了扩展,并且添加了Ipfwadm用户工具。Ipfw是比较老的Linux内核版本提供的防火墙软件包,该软件包的全称是“Ipfwadm”。Ipfwadm程序包提供了建立规则的能力,根据这些规则来确定允许什么样的包进出本网络。简单地说,防火墙就是一对开关,一个开关允许包通过,另一个开关禁止包通过。现代防火墙系统一般都会附加审计跟踪、加密认证、地址伪装和VPN等多种功能,作为一个安全开关,防火墙可定义的安全策略有如下两个。

● 一切未被允许的都被禁止。

● 一切未被禁止的都被允许。

显然策略1的安全性明显高于策略2,但它是以牺牲灵活性和可访问资源为代价来提高安全性的。Ipfwadm系统同样提供IP封装,它允许用户使用Internet上的一个公共IP地址空间。

(3)1999年,在第1个稳定的2.2.0内核中Russell和Michael Neuling做了一些非常重要的改进,即在该内核中Russell添加了帮助用户控制过滤规则的Ipchains工具。Linux 2.2内核中提供的Ipchains,通过4类防火墙规则列表来提供防火墙规则控制。这些列表称为“防火墙链”,它们分别是IP input(IP输入)链、IP output(IP输出)链、IP forward(IP转发)链和user defined(用户定义)链,一个链实际上就是一个规则表。所谓规则,即当被检测的包头符合规则的定义时按预先的设定对该包进行某种处理。输入链是指对内连接请求的过滤规则,输出链是对外连接请求的过滤规则,转发链是对内部与外部通信包转发的过滤规则,用户定义链是用户自己定义的规则。当一个数据包进入Linux防火墙系统时,Linux内核使用输入链决定对这个包的操作。如果这个包不被丢弃,内核则使用转发链来决定是否将这个包转发到某个出口。当这个包到达一个出口被发出前,内核使用输出链最后确定是丢弃该包还是转发该包。在上面的过程中,如果输入链已经决定处理这个包,则内核需要决定下一步包应该发到什么地方,即进行路由。假如此时该数据包是发到另一台主机的,则内核就运用转发链;如果没有找到匹配的设置,则这个包就需要进入目标值指定的下一条链。此时目标值有可能是一条用户自定义链,也有可能是如下一个特定值。

● ACCEPT:允许通过。

● DENY:直接丢弃。

● REJECT:丢弃并通过ICMP回复通知发送者包被丢弃。

● MASQ:通知核心将该包伪装,该值只对转发链和用户自定义链起作用。

● REDIRECT:通知核心将包改送到一个本地端口,该值只对输入链和用户自定义链起作用,并且只有UDP和TCP协议才可以使用该值。

● RETURE:通知内核将该包跳过所有的规则,直接到达所有链的链尾。和IPFW一样,Ipchains也是基于配置策略进行包过滤的,使用的策略方式也是如下两种。

● 首先允许所有的包都可通过,然后禁止有危险的包。

● 首先禁止所有的包,然后根据所需要的服务允许特定的包通过。

(4)2001年,2.4内核完成,Russell完成了其名为“Netfilter”(http://www.netfilter.org)的内核框架。这些防火墙软件套件一般都比其前任有所改进。Netfilter/iptables已经包含在2.4以后的内核中,它可以实现防火墙、NAT(网络地址转换)和数据包的分割等功能。Netfilter工作在内核内部,而iptables则是由用户定义规则集的表结构。Netfilter/iptables是从ipchains和Ipwadfm(IP防火墙管理)演化而来的。

10.2.2 Netfilter/iptables系统如何工作

Netfilter/iptables IP信息包过滤系统是一种功能强大的工具,可用于添加、编辑和除去规则。这些规则是在决定信息包过滤时防火墙所遵循和组成的规则,这些规则存储在专用的信息包过滤表中,而这些表集成在Linux内核中。在信息包过滤表中,规则被分组放在所谓的链(chain)中。虽然Netfilter/iptables IP信息包过滤系统被称为“单个实体”,但它实际上由两个组件,即Netfilter和iptables组成。Netfilter组件也称为“内核空间”(Kernelspace),是内核的一部分。它由一些信息包过滤表组成,这些表包含内核用来控制信息包过滤处理的规则集。iptables组件是一种工具,也称为“用户空间”(Userspace),它使插入、修改和除去信息包过滤表中的规则变得容易。通过使用用户空间可以构建自己的定制规则,这些规则存储在内核空间的信息包过滤表中。这些规则具有目标,它们告诉内核对来自某些源、前往某些目的地或如何处理具有某些协议类型的信息包。如果某个信息包与规则匹配,那么使用目标ACCEPT允许该信息包通过,还可以使用目标DROP或REJECT来阻塞并杀死信息包。对于信息包执行的其他操作,还有许多其他目标。

根据规则所处理的信息包的类型,可以将规则分组在链中。处理入站信息包的规则被添加到INPUT链中;处理出站信息包的规则被添加到OUTPUT链中,处理正在转发的信息包的规则被添加到FORWARD链中,这3个链是基本信息包过滤表中内置的默认主链。另外,还有其他许多可用的链的类型(如PREROUTING和POSTROUTING),以及用户定义的链。每个链都可以有一个策略,它定义“默认目标”。即要执行的默认操作,当信息包与链中的任何规则都不匹配时执行此操作。

建立规则并将链放在适当的位置之后,就可以开始进行真正的信息包过滤工作了,这时内核空间从用户空间接管工作。当信息包到达防火墙时,内核先检查信息包的头信息。尤其是信息包的目的地,我们将这个过程称为“路由”。

如果信息包源自外界并前往系统,而且防火墙是打开的,那么内核将其传递到内核空间信息包过滤表的INPUT链。如果信息包源自系统内部或系统所连接的内部网上的其他源,并且此信息包要前往另一个外部系统,那么信息包被传递到OUTPUT链。类似地,源自外部系统并前往内部系统的信息包被传递到FORWARD链。

接下来,将信息包的头信息与其所传递到的链中的每条规则进行比较,看它是否与某条规则完全匹配。如果信息包与某条规则匹配,那么内核就对该信息包执行由该规则的目标指定的操作;如果信息包与这条规则不匹配,那么它将与链中的下一条规则进行比较。如果信息包与链中的任何规则都不匹配,那么内核将参考该链的策略来决定如何处理该信息包。理想的策略应该告诉内核DROP该信息包,图10-1所示为这个信息包过滤过程。

图10-1 信息包过滤过程

10.2.3 iptables基础

通过为防火墙提供有关对来自某个源、到某个目的地或具有特定协议类型的信息包要执行操作的指令及规则控制信息包的过滤。通过使用Netfilter/iptables系统提供的特殊命令iptables建立这些规则,并将其添加到内核空间的特定信息包过滤表内的链中。添加及除去及辑规则的命令的一般语法如下:

$ iptables [-t table] command [match] [target]

大部分规则都是按这种语法写的,如果不想用标准的表,就要在“table”处指定表名。一般情况下没有必要指定使用的表,因为iptables默认使用Filter表来执行所有的命令。也没有必要必须在这里指定表名,实际上几乎可在规则的任何处指定表名。当然,把表名放在开始处已经是约定俗成的标准。尽管命令总是放在开头,或者放在表名后面,我们也要考虑到底放在何处更为易读。

(1)command:告诉程序该做什么,比如插入一个规则、在链的末尾增加一个规则,或者删除一个规则。

(2)match:描述包的某个特点,以使这个包区别于其他所有的包,可以指定包的来源IP地址、网络接口、端口、协议类型或者其他。

若数据包符合所有的match,内核使用target来处理它,或者说把包发往target。比如,可以让内核把包发送到当前表中的其他链(可能是自己建立的),或者只是丢弃这个包而不做任何处理,或者向发送者返回某个特殊的应答。Netfilter/iptables内核空间默认的表和链如表10-1所示。

表10-1 Netfilter/iptables内核空间默认的表和链

下面逐个讨论这些选项。

1.table

[-t table]选项允许使用标准表之外的任何表,表是包含仅处理特定类型信息包的规则和链的信息包过滤表。有3种可用的表选项即Filter、NAT和Mangle。该选项不是必需的,如果未指定,则Filter用做默认表。各表实现的功能如下。

(1)Filter。

Filter表用来过滤数据包,可以在任何时候匹配包并过滤它们,根据包的内容对包做DROP或ACCEPT。当然也可以预先在其他处做一些过滤,但是这个表才是设计用来过滤的。几乎所有的target都可以在此使用。图10-2所示为信息包在Filter表中的穿越过程。

图10-2 信息包在Filter表中的穿越过程

(2)网络地址转换(NAT)。

数据包中如果包含目的IP地址,一旦内部Intranet的IP地址被截获,那么内部网络资源就会暴露并可以对其实施攻击。为了更好地提高内部网络安全性,可以采用网络地址转换技术。另外,IP地址的不足使许多用户使用私有IP地址来搭建网络。私有网络中的IP地址应遵循RFC 1597中为私有网络分配的地址,其范围为10.0.0.0~10.255.255.255、172.16.0.0~172.16.255.255或192.168.0.0~192.168.255.255,而使用私有地址不能直接与Internet互联。为了使这样的网络能够访问Internet,可以采用地址转换技术解决这一问题。网络地址转换将一个或一组IP地址转换为另一个或一组IP地址,即转换内网或者外网的IP地址。由于网络地址的缺乏和出于安全等因素的考虑,许多内部网络使用私有IP地址建立。在与Internet互联时,通过带有NAT功能的路由器或防火墙,实现私有IP与合法IP地址的转换,对外表现为合法的IP地址。NAT表的主要用处是网络地址转换,图10-3所示为信息包在NAT表中的穿越过程,即实现原理。

图10-3 信息包在NAT表中的穿越过程

做过NAT操作的数据包的地址就被改变,当然这种改变是根据规则进行的,属于一个流的包只会经过这个表一次。如果第1个包被允许执行NAT或Masqueraded,那么余下的包都会自动地执行相同的操作。即余下的包不会再通过这个表,一个一个地被NAT,而是自动完成,这就是为什么不应该在这个表中做任何过滤的主要原因。PREROUTING链的作用是在包刚刚到达防火墙时改变其目的地址,如果需要,OUTPUT链改变本地产生的包的目的地址。

POSTROUTING链在包就要离开防火墙之前改变其源地址,此表仅用于NAT,即转换包的源或目标地址。注意,只有流的第1个包会被这个链匹配。其后的包会自动被做相同的处理,实际的操作分为DNAT、SNAT和MASQUERADE。

DNAT操作主要用在有一个合法的IP地址,要把对防火墙的访问重定向到其他的机器(比如DMZ)上。即改变的是目的地址,以使包能重路由到某台主机。

SNAT改变包的源地址,这在极大程度上可以隐藏本地网络或者DMZ等。一个很好的例子是我们知道防火墙的外部地址,但必须用这个地址替换本地网络地址。有了这个操作,防火墙就能自动地对包做SNAT和De-SNAT(反向的SNAT),以使LAN能连接到Internet。

如果使用类似192.168.0.0/24这样的地址,不会从Internet得到任何回应。因为IANA定义这些网络(还有其他的)为私有的,只能用于LAN内部。

MASQUERADE的作用和POSTROUTING完全一样,只是计算机的负荷稍多一点。因为对每个匹配的包,MASQUERADE都要查找可用的IP地址,而不像SNAT用的IP地址是配置好的。当然,这也有好处。即可以使用通过PPP、PPPOE和SLIP等拨号得到的地址,这些地址可以由ISP的DHCP随机分配。

(3)Mangle。

这个表主要用来Mangle数据包,我们可以改变不同的包及包头的内容,比如TTL、TOS或MARK。注意,MARK并没有真正地改动数据包,它只是在内核空间为包设了一个标记,防火墙内的其他规则或程序(如tc)可以使用这种标记对包进行过滤或高级路由。这个表有5个内建的链,即PREROUTING、POSTROUTING、OUTPUT、INPUT和FORWARD。

PREROUTING在包进入防火墙之后且路由判断之前改变包;POSTROUTING在所有路由判断之后改变包;OUTPUT在确定包的目的之前更改数据包;INPUT在包被路由到本地之后,但在用户空间的程序看到它之前改变包。

注意:Mangle表不能做任何NAT,它只是改变数据包的TTL、TOS或MARK,而不是其源目的地址。

NAT是在NAT表中操作的,mangle表中仅有的操作为TOS、TTL和MARK。

TOS操作用来设置或改变数据包的服务类型域,常用来设置网络上的数据包如何被路由等策略。这个操作并不完善,有时得不所愿。它在Internet上还不能使用,而且很多路由器不会注意到这个域值。即不要设置发往Internet的包;除非打算依靠TOS来路由,比如用iproute2。

TTL操作用来改变数据包的生存时间域,可以让所有数据包只有一个特殊的TTL。其存在有一个很好的理由,即可以欺骗一些ISP。为什么要欺骗?因为它们不愿意让我们共享一个连接。那些ISP会查找一台单独的计算机是否使用不同的TTL,并且以此作为判断连接是否被共享的标志。

MARK用来为包设置特殊的标记,iproute2能识别这些标记并根据不同的标记(或没有标记)决定不同的路由。使用这些标记可以执行带宽限制和基于请求的分类。

2.command

命令中必要的组成部分command是iptables命令的最重要部分,它告诉iptables命令要执行的操作。例如,插入规则、将规则添加到链的末尾或删除规则。在使用iptables时,如果没有输入必需的参数而按了回车键,那么它就会给出一些提示信息,提示需要的参数等。iptables的选项-v用来显示iptables的版本,-h给出语法的简短说明。表10-2所示为常用命令,表10-3所示为部分选项及其作用。

表10-2 常用命令

表10-3 部分选项

3.match

iptables命令的可选match部分指定信息包与规则匹配所应具有的特征(如源和目的地地址及协议等),可归为5类,一是generic matches(通用的匹配),适用于所有的规则;二是TCP matches,只能用于TCP包;三是UDP matches,只能用在UDP包;四是ICMP matches,针对ICMP包;五针对状态,指所有者和访问的频率限制等。在此只介绍通用匹配,熟悉了通用匹配,其他几种也比较容易理解。表10-4所示为常用匹配和功能。

表10-4 常用匹配和功能

4.target

目标是由规则指定的操作,那些与规则匹配的信息包执行这些操作。除了允许用户定义的目标之外,还有许多可用的目标选项用于建立高级规则的目标,如LOG、REDIRECT、MARK、MIRROR和MASQUERADE等。表10-5所示为常用目标及其说明。

表10-5 常用目标及其说明

5.状态机制

状态机制是iptables中特殊的一部分,连接跟踪可以让Netfilter知道某个特定连接的状态。运行连接跟踪的防火墙称为“带有状态机制的防火墙”,以下简称为“状态防火墙”。状态防火墙比非状态防火墙要安全,因为它允许我们编写更严密的规则。在iptables中,包和被跟踪连接的4种不同状态有关,即NEW、ESTABLISHED、RELATED和INVALID。

(1)NEW。

NEW说明这个包,即是conntrack模块看到的某个连接第1个包,它即将被匹配。比如看到一个SYN包,是所留意的连接的第1个包,就要匹配它。第1个包也可能不是SYN包,但它仍会被认为是NEW状态。

(2)ESTABLISHED。

ESTABLISHED已经注意到两个方向上的数据传输,而且会继续匹配这个连接的包。处于该状态的连接很容易理解,只要发送并接到应答,连接即为ESTABLISHED状态。一个连接要从NEW变为ESTABLISHED,只需要接到应答包即可。而忽略这个包是发往防火墙的,还是要由防火墙转发的。ICMP的错误和重定向等信息包也被看做是ESTABLISHED,只要它们是所发出的信息的应答。

(3)RELATED。

RELATED是个比较麻烦的状态,当一个连接和某个已处于ESTABLISHED状态的连接有关系时,被认为是该状态。即一个连接要想是RELATED的,首先要有一个ESTABLISHED的连接。这个连接再产生一个主连接之外的连接,即RELATED,前提是conntrack模块要能理解RELATED。FTP是个很好的例子,FTP-data连接就是和FTP-control有RELATED的。

(4)INVALID。

INVALID说明数据包不能被识别属于哪个连接或没有任何状态,有多个原因可以产生这种情况,如内存溢出及收到不知属于哪个连接的ICMP错误信息。一般DROP这个状态的任何内容。

这些状态可以一起使用,以匹配数据包,从而使防火墙强壮和有效。以前经常打开1024以上的所有端口来放行应答的数据,现在有了状态机制不需如此。因为我们可以只开放那些有应答数据的端口,其他都可以关闭,这样就安全多了。

10.2.4 建立规则和链

在Red Hat Linux中启动iptables:

#service iptables start

一般情况下,iptables已经包含在了Linux发行版中,可以运行“iptables --version”来查看系统是否安装了iptables。在使用的RHEL 4中,安装版本是iptables v1.2.8。如果系统确实没有安装iptables,那么可以从地址http://www.netfilter.org/下载。

1.查看规则集

虽然简单介绍了iptables的用法,但现实中可能需要知道更完整的信息。为此可以执行“man iptables”来查看所有命令和选项的完整介绍,也可以运行“iptables help”来查看一个快速帮助。要查看系统中现有的iptables规划集,可以执行以下命令:

iptables list

下面是没有定义规划时的iptables:

Chain INPUT (policy ACCEPT)
target   prot opt source             destination
Chain FORWARD (policy ACCEPT)
target   prot opt source             destination
Chain OUTPUT (policy ACCEPT)
target   prot opt source             destination

2.增加规则

本例中的规则将会阻止来自某一特定IP范围内的数据包,因为该IP地址范围被管理员怀疑有大量恶意的攻击者在活动:

# iptables -t filter -A INPUT -s xxx.xxx.xxx.0/24-j DROP

要了解有关iptables详细的参数和命令格式,使用“man iptables”查看。也可以很轻易地阻止所有流向攻击者IP地址的数据包,该命令也只是稍有不同:

# iptables -t filter -A OUTPUT -d xxx.xxx.xxx.0/24-j DROP

注意:A选项如前所述,使用它说明是为现有链添加规则。

3.删除规则

网络上的恶意攻击者总是在变化的,因此也要不断改变IP。假设了解的一个网上攻击者转移到了新的IP地址,而其老的IP地址被分配给了一些清白的用户,那么这时这些用户的数据包无法通过网络。这种情况下,可以使用带-D选项的命令来删除现有的规则:

# iptables -t filter -D OUTPUT -d xxx.xxx.xxx.0/24-j DROP

4.默认策略

创建一个具有很好灵活性并可以抵御各种意外事件的规则需要花大量的时间,下面为每一个链设置默认的规则:

# iptables -P INPUT DROP
# iptables -P FORWARD DROP
# iptables -P OUTPUT ACCEPT

选项-P用于设置链的策略,只有3个内建的链才有策略。这些策略可以使信息毫无限制地流出,但不允许信息流入。如果需要接收外部信息,可使用以下命令:

# iptables -t filter -A INPUT -s 123.456.789.0/24-j ACCEPT

5.使用SYN

不能关闭所有的端口,否则将会把自己完全“与世隔绝”。也不能只指定某些端口处于打开状态,因为无法预见哪一个端口将会被使用。事实上,简单地允许目的地为某一特定端口的数据流通过将对阻止恶意的攻击毫无意义。要设置一个有效的规则,既可以允许普通用户正常通过,又可以阻止恶意攻击者访问网络。为此,可以充分利用SYN标识来阻止那些未经授权的访问。因为iptables只检测数据包的报头,所以不会增加有效负荷。事实上,除iptables以外,很多其他有用的数据包分析都是基于报头的。比如,在Web冲浪时,一个请求从你的PC发送至其他某一个地方的Web服务器之上。然后该服务器就会响应请求向你发回一个数据包,并且得到你的系统上的一个临时端口。与响应请求不同的是,服务器并不关心所传送的内容。可以利用这种特点来设置一个规则,使其阻止所有没有经过系统授权的TCP连接:

# iptables -t filter -A INPUT -i eth0-p tcp --syn -j DROP

这里的-i指的是网卡,-p指协议,--syn表示带有SYN标识设置的TCP数据包。从中可以看出,对TCP/IP的了解将非常有利于维护网络安全。SYN用于初始化一个TCP连接,如果在自己的机器上没有运行任何服务器,他人也不会发送SYN数据包。

6.DMZ和iptables

可以设置一些把交通选路发送到某些机器(如专用HTTP或FTP服务器)的规则,这些机器最好位于停火区域(De-Militarized Zone,DMZ)和内部网络分开的机器。要设置一条把所有进入的HTTP请求都选路发送到IP地址为10.0.4.2且端口为80(LAN 192.168.1.0/24范围之外)的专用HTTP服务器的规则,网络地址转换会调用PREROUTING链来把这些分组转发到恰当的目的地:

iptables -t nat -A PREROUTING -i eth0-p tcp --dport 80-j DNAT \
            --to-destination 10.0.4.2:80

使用这个命令,所有来自LAN以外的到端口80的HTTP连接都会被选路发送到和内部网络分离的另一个网络上的HTTP服务器上,这种网络分段会比允许到内部网络中的机器上的HTTP连接更安全。如果HTTP服务器被配置接受安全连接,那么端口443也必须被转发。

7.防范病毒和假冒IP地址

可以更精心设计一些规则来控制到LAN内指定子网的访问,甚至访问指定机器。还可以限制某些类似特洛伊木马、蠕虫,以及其他客户端/服务器病毒的可疑服务,联系其服务器。例如,有些特洛伊木马会扫描端口31337~31340(即黑客语言中的elite端口)上的服务。既然合法服务都不使用这些非标准端口来通信,阻塞这些端口能够有效地减少网络上可能被感染的机器及其远程主服务器进行独立通信的机会:

iptables -A OUTPUT -o eth0-p tcp --dport 31337--sport 31337-j DROP
iptables -A FORWARD -o eth0-p tcp --dport 31337--sport 31337-j DROP

也可以阻塞试图假冒所在LAN的专用IP地址混入的连接。例如,如果LAN使用192.168.1.0/24范围,面向Internet的网络设备(如eth0)上就可以设置一条规则来放弃到那个设备的使用所在LAN的IP范围的分组。因为默认策略是拒绝转发分组,所有到面向外界的设备(eth0)的假冒IP地址都会被自动拒绝:

iptables -A FORWARD -s 192.168.1.0/24-i eth0-j DROP

8.使用IP6Tables

下一代Internet协议IPv6的出现突破了IPv4(或IP)的32位地址限制,它支持128位地址,因此识别IPv6的载体网络就能够指定比IPv4更多的可选路地址。

许多Linux发行版本支持使用Netfilter 6子系统和IP6Tables命令的IPv6防火墙规则,使用IP6Tables的第1步是启动IP6Tables服务,它可以使用以下命令运行:

service ip6tables start

必须关闭iptables服务才能专门使用IP6Tables服务:

service iptables stop
chkconfig iptables off

要使IP6Tables在系统引导时默认启动,可使用chkconfig来改变服务的运行级别状态:

chkconfig --level 345 ip6tables on

其语法在各方面都和iptables相同,只不过iptables支持128位的地址。例如,在识别IPv6的网络服务器上的SSH连接可以使用以下规则来启用:

ip6tables -A INPUT -i eth0-p tcp -s 3ffe:ffff:100::1/128--dport 22-j ACCEPT

9.共享一个Internet连接

网络地址转换和IP伪装都可以实现多台主机共享一个Internet连接,而这个局域网可以是Linux和Windows系统组成的多系统局域网。假设现在我们有一台机器有两块网卡,其中eth0为“公共”网卡,eth1为“私有”网卡。

换句话说,eth0被分配了一个静态且可路由的IP地址,而eth1则被分配给了一个私有且不能路由的IP,即该IP是属于该局域网子网的。要实现上述功能,需要在NAT和Filter表中添加一些链:

# iptables -t nat -A POSTROUTING -o eth0-j MASQUERADE
# iptables -t filter -A FORWARD -i eth0-o eth1-m state --state
  RELATED,ESTABLISHED -j ACCEPT
# iptables -t filter -A FORWARD -i eth1-o eth0-j ACCEPT

其中显示了有状态的数据包检测的价值。请注意,这里是如何实现流入数据包只有在属于一个已经存在的连接时才被允许的,而所有来自局域网内流向外的数据包则都允许通过(Filter是默认的表,但并不是必需的)。第1条规则使所有流出的信息看起来都是来自防火墙机器的,而并不会显示防火墙后面还有一个局域网。

10.构建DMZ的策略

DMZ(DeMilitarized Zone,隔离区)也称“非军事化区”,它是为了解决安装防火墙后外部网络不能访问内部网络服务器的问题而设立的一个非安全系统与安全系统之间的缓冲区。这个缓冲区位于企业内部网络和外部网络之间的小网络区域内,在这个小网络区域内可以放置一些必须公开的服务器设施,如企业的Web服务器、FTP服务器和论坛等。另一方面,通过这样一个DMZ区域,更加有效地保护了内部网络。因为这种网络部署比起一般的防火墙方案,对攻击者来说又多了一道关卡。

针对不同资源提供不同安全级别的保护,可以考虑构建一个DMZ区域,其中通常放置一些不含机密信息的公用服务器。这样来自外网的访问者可以访问DMZ中的服务,但不可能接触到存放在内网中的公司机密或私人信息等。即使DMZ中服务器受到破坏,也不会对内网中的机密信息造成影响,许多防火墙产品都提供了DMZ的接口。硬件防火墙由于使用专门的硬件芯片,所以在性能和流量上有绝对的优势;软件防火墙的性价比非常好,一般企业使用起来效果不错。如果使用Linux防火墙,其成本将更低。

Linux 2.4内核Netfilter内建了3个表,其中默认表Filter中又包括3个规则链,分别是负责外界流入网络接口的数据过滤的INPUT链、负责对网络接口输出的数据进行过滤的OUTPUT链,以及负责在网络接口之间转发数据过滤的FORWARD链。要构建一个带DMZ的防火墙,需要利用这些链的设定完成。首先要判断从连接外部网络的网卡(eth0)上流入的数据,在INPUT链上完成。如果数据的目标地址属于DMZ网段,就要将数据转发到连接DMZ网络的网卡(eth1)上;如果是内部网络的地址,就要将数据转发到连接内部网络的网卡(eth2)上。可以明确以下访问控制策略。

(1)内网可以访问外网。

内网的用户显然需要自由地访问外网,在这一策略中防火墙需要进行源地址转换。

(2)内网可以访问DMZ。

此策略是为了方便内网用户使用和管理DMZ中的服务器。

(3)外网不能访问内网。

很显然,内网中存放的是公司内部数据,这些数据不允许外网的用户进行访问。

(4)外网可以访问DMZ。

DMZ中的服务器本身要为外界提供服务,所以外网必须可以访问DMZ。同时,外网访问DMZ需要由防火墙完成对外地址到服务器实际地址的转换。

(5)DMZ不能访问内网。

很明显,如果违背此策略,则当入侵者攻陷DMZ时,就可以进一步进攻到内网的重要数据。

(6)DMZ不能访问外网。

此策略也有例外,如DMZ中放置邮件服务器时需要访问外网;否则将不能正常工作。

11.保存规则

使用脚本更改规则的问题是改动每个规则都要调用命令iptables,它首先要把netfilter内核空间中的整个规则集提取出来。然后插入或附加,或做其他改动。最后再把新的规则集从它的内存空间插入到内核空间中,这显然会花费很多时间。为了解决这个问题,可以使用命令iptables-save和iptables-restore。iptables-save用来把规则集保存到一个特殊格式的文本文件中,而iptables-restore则用来把这个文件重新装入到内核空间中。这两个命令一次调用就可以装载和保存规则集,而不像脚本中每个规则都要调用一次iptables。iptables-save运行一次就可以把整个规则集从内核中提取出来,并保存到文件中,而iptables-restore每次装入一个规则表。即对于一个很大的规则集,如果用脚本来设置,那这些规则就会反复地被卸载并安装很多次,而现在可以一次保存整个规则集,安装时则是一次一个表,从而可以节省大量的时间。所以一旦满意测试结果,就可以将其保存为脚本:

# iptables-save > iptables-script

现在,信息包过滤表中的所有规则都被保存在文件iptables-script中。无论何时再次引导系统都可以使用iptables-restore命令将规则集从该脚本文件恢复到信息包过滤表,恢复命令如下:

# iptables-restore iptables-script