下一页 1 2 3
什么是Linux防火墙
对于Internet上的系统,不管是什么情况,首先我们要明确一点:网络是不安全的。因此,虽然创建一个防火墙并不能保证系统100%安全,但却是绝对必要的。和社会上其它任何事物一样,Internet经常会受到一些无聊的或者别有用心的人的干扰,防火墙的目的就是将这类人挡在你的网络之外,同时使你仍然可以完成自己的工作。
那么构筑怎样的Linux防火墙系统才算是足够安全呢?这是一个很难回答的问题,因为不同的应用环境对安全的要求不一样。用一句比较恰当而且简单的话来回答这个问题:用户了解自己的Linux系统和设置,并且可以很好地保护好自己的数据和机密文件的安全,这对于该计算机用户来说就可以称之为他的计算机有足够的安全性。
那么到底什么是防火墙呢?防火墙是一个或一组系统,它在网络之间执行访问控制策略。实现防火墙的实际方式各不相同,但是在原则上,防火墙可以被认为是这样一对机制:一种机制是拦阻传输流通行,另一种机制是允许传输流通过。
一些防火墙偏重拦阻传输流的通行,而另一些防火墙则偏重允许传输流通过。了解有关防火墙的最重要的概念可能就是它实现了一种访问控制策略。
一般来说,防火墙在配置上是防止来自“外部”世界未经授权的交互式登录的。这大大有助于防止破坏者登录到你网络中的计算机上。一些设计更为精巧的防火墙可以防止来自外部的传输流进入内部,但又允许内部的用户可以自由地与外部通信。如果你切断防火墙的话,它可以保护你免受网络上任何类型的攻击。
防火墙的另一个非常重要的特性是可以提供一个单独的“拦阻点”,在“拦阻点”上设置安全和审计检查。与计算机系统正受到某些人利用调制解调器拨入攻击的情况不同,防火墙可以发挥一种有效的“电话监听”和跟踪工具的作用。防火墙提供了一种重要的记录和审计功能;它们经常可以向管理员提供一些情况概要,提供有关通过防火墙的传输流的类型和数量,以及有多少次试图闯入防火墙的企图等信息。
两种类型防火墙的平衡
在概念上,有两种类型的防火墙:网络级防火墙和应用级防火墙。这两种类型防火墙的差异并不如想像中那样大,最新的技术模糊了两者之间的区别,使哪个“更好”或“更坏”不再那么明显。
网络级防火墙一般根据源、目的地址做出决策,输入单个的IP包。一台简单的路由器是“传统的”网络级防火墙,因为它不能做出复杂的决策,不能判断出一个包的实际含意或包的实际出处。现代网络级防火墙已变得越来越复杂,可以保持流经它的接入状态、一些数据流的内容等有关信息。
许多网络级防火墙之间的一个重要差别是防火墙可以使传输流直接通过,因此要使用这样的防火墙通常需要分配有效的IP地址块。网络级防火墙一般速度都很快,对用户很透明。
应用级防火墙一般是运行代理服务器的主机,它不允许传输流在网络之间直接传输,并对通过它的传输流进行记录和审计。由于代理应用程序是运行在防火墙上的软件部件,因此它处于实施记录和访问控制的理想位置。
应用级防火墙可以被用作网络地址翻译器,因为传输流通过有效地屏蔽掉起始接入原址的应用程序后,从一面进来,从另一面出去。
在某些情况下,设置了应用级防火墙后,可能会对性能造成影响,会使防火墙不太透明。早期的应用级防火墙,对于最终用户不很透明,并需要对用户进行培训。应用级防火墙一般会提供更详尽的审计报告,比网络级防火墙实施更保守的安全模型。
防火墙未来的位置应当处于网络级防火墙与应用级防火墙之间的某一位置。网络级防火墙可能对流经它们的信息越来越“了解”,而应用级防火墙可能将变得更加“低级”和透明。最终的结果将是能够对通过的数据流记录和审计的快速包屏蔽系统。
Linux为我们提供了一个非常优秀的防火墙工具,它就是netfilter/iptables(http: //www.netfilter.org/)。它完全是免费的,并且可以在一台低配置的老机器上很好地运行。netfilter/iptables功能强大,使用灵活,并且可以对流入和流出的信息进行细化的控制。
事实上,每一个主要的Linux版本中都有不同的防火墙软件套件。Iptabels(netfilter)应用程序被认为是Linux中实现包过虑功能的第四代应用程序。第一代是Linux 内核1.1版本所使用的Alan Cox从BSD Unix中移植过来的ipfw。
在2.0版的内核中,Jos Vos和其它一些程序员对ipfw进行了扩展,并且添加了ipfwadm用户工具。在2.2版内核中, Russell和Michael Neuling做了一些非常重要的改进,也就是在该内核中,Russell添加了帮助用户控制过虑规则的ipchains工具。后来,Russell又完成了其名为netfilter(http://www.netfilter.org)的内核框架。这些防火墙软件套件一般都比其前任有所改进,表现越来越出众。
etfilter/iptables已经包含在了2.4以后的内核当中,它可以实现防火墙、NAT(网络地址翻译)和数据包的分割等功能。 netfilter工作在内核内部,而iptables则是让用户定义规则集的表结构。netfilter/iptables是从ipchains和 ipwadfm(IP防火墙管理)演化而来的,为了简单起见,下文中,我就将其统一称为iptables。
iptables的其它一些好的用法是为Unix、Linux和BSD个人工作站创建一个防火墙,当然也可以为一个子网创建防火墙以保护其它的系统平台。 iptables只读取数据包的头,所以不会给信息流增加负担,此外它也无需进行验证。如果要想获得更好的安全性,可以将其和一个代理服务器(比如 squid)相结合。
iptable的概念和用法
通过向防火墙提供有关对来自某个源、到某个目的地或具有特定协议类型的信息包要做些什么的指令的规则,控制信息包的过滤。通过使用iptables系统提供的特殊命令 iptables,建立这些规则,并将其添加到内核空间的特定信息包过滤表内的链中。关于添加、除去、编辑规则的命令的一般语法如下:
|
现实中,为了易读,我们一般都用这种语法。大部分规则都是按这种语法写的,因此,如果看到别人写的规则,你很可能会发现用的也是这种语法。
如果不想用标准的表,就要在[table]处指定表名。一般情况下没有必要指定使用的表,因为iptables 默认使用filter表来执行所有的命令。也没有必要非得在这里指定表名,实际上几乎可在规则的任何地方指定表名。当然,把表名放在开始处已经是约定俗成的标准。尽管命令总是放在开头,或者是直接放在表名后面,我们也要考虑到底放在哪儿易读。
“command”告诉程序该做什么,比如:插入一个规则,还是在链的末尾增加一个规则,还是删除一个规则。下面会仔细地介绍。
“match”细致地描述了包的某个特点,以使这个包区别于其它所有的包。在这里,我们可以指定包的来源IP 地址、网络接口、端口、协议类型,或者其他什么。下面我们将会看到许多不同的match。
最后是数据包的目标所在“target”。若数据包符合所有的match,内核就用target来处理它,或者说把包发往target。比如,我们可以让内核把包发送到当前表中的其他链(可能是我们自己建立的),或者只是丢弃这个包而不做任何处理,或者向发送者返回某个特殊的应答。下面我们来逐个讨论这些选项:
[-t table]选项允许使用标准表之外的任何表。表是包含仅处理特定类型信息包的规则和链的信息包过滤表。有三种可用的表选项:filter、nat 和 mangle。该选项不是必需的,如果未指定,则filter用作缺省表。下面介绍各表实现的功能。
filter
filter 表用来过滤数据包,我们可以在任何时候匹配包并过滤它们。我们就是在这里根据包的内容对包做DROP或ACCEPT的。当然,我们也可以预先在其他地方做些过滤,但是这个表才是设计用来过滤的。几乎所有的target都可以在这儿使用。
at
at表的主要用处是网络地址转换,即Network Address Translation,缩写为NAT。做过NAT操作的数据包的地址就被改变了,当然这种改变是根据我们的规则进行的。属于一个流的包只会经过这个表一次。
如果第一个包被允许做NAT或Masqueraded,那么余下的包都会自动地被做相同的操作。也就是说,余下的包不会再通过这个表,一个一个的被 NAT,而是自动地完成。这就是我们为什么不应该在这个表中做任何过滤的主要原因。PREROUTING 链的作用是在包刚刚到达防火墙时改变它的目的地址,如果需要的话。OUTPUT链改变本地产生的包的目的地址。
POSTROUTING链在包就要离开防火墙之前改变其源地址此表仅用于NAT,也就是转换包的源或目标地址。注意,只有流的第一个包会被这个链匹配,其后的包会自动被做相同的处理。实际的操作分为以下几类:
◆ DNAT
◆ SNAT
◆ MASQUERADE
DNAT操作主要用在这样一种情况,你有一个合法的IP地址,要把对防火墙的访问 重定向到其他的机子上(比如DMZ)。也就是说,我们改变的是目的地址,以使包能重路由到某台主机。
SNAT改变包的源地址,这在极大程度上可以隐藏你的本地网络或者DMZ等。一个很好的例子是我们知道防火墙的外部地址,但必须用这个地址替换本地网络地址。有了这个操作,防火墙就 能自动地对包做SNAT和De-SNAT(就是反向的SNAT),以使LAN能连接到Internet。
如果使用类似 192.168.0.0/24这样的地址,是不会从Internet得到任何回应的。因为IANA定义这些网络(还有其他的)为私有的,只能用于LAN内部。
MASQUERADE的作用和MASQUERADE完全一样,只是计算机的负荷稍微多一点。因为对每个匹配的包,MASQUERADE都要查找可用的IP地址,而不象SNAT用的IP地址是配置好的。当然,这也有好处,就是我们可以使用通过PPP、 PPPOE、SLIP等拨号得到的地址,这些地址可是由ISP的DHCP随机分配的。
Mangle
这个表主要用来mangle数据包。我们可以改变不同的包及包头的内容,比如 TTL,TOS或MARK。注意MARK并没有真正地改动数据包,它只是在内核空间为包设了一个标记。防火墙内的其他的规则或程序(如tc)可以使用这种标记对包进行过滤或高级路由。这个表有五个内建的链: 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能识别这些标记,并根据不同的标记(或没有标记) 决定不同的路由。用这些标记我们可以做带宽限制和基于请求的分类。
命令(command)
命令中必要的组成部分command是iptables命令的最重要部分。它告诉 iptables 命令要做什么,例如,插入规则、将规则添加到链的末尾或删除规则。
在使用iptables时,如果必须的参数没有输入就按了回车,那么它就会给出一些提示信息,告诉你需要哪些参数等。iptables的选项-v用来显示iptables的版本,-h给出语法的简短说明。
匹配(match)
iptables命令的可选match部分指定信息包与规则匹配所应具有的特征(如源和目的地地址、协议等)。可把它们归为五类:第一类是generic matches(通用的匹配),适用于所有的规则;第二类是TCP matches,顾名思义,这只能用于TCP包;第三类是UDP matches,当然它只能用在UDP包上了;第四类是ICMP matches ,针对ICMP包的;第五类比较特殊,针对的是状态,指所有者和访问的频率限制等。在此,只介绍通用匹配,熟悉了通用匹配,其它的几种也就比较容易理解了。