您所在的位置: 首页 > 读书频道 > 操作系统 > Linux >

20.13 Linux的防火墙功能: IP Tables

http://book.51cto.com  2008-04-24 11:38  [美]Evi Nemeth Garth Snyder Trent R.Hein  人民邮电出版社  我要评论(0)

20.13  Linux的防火墙功能: IP Tables

在正常情况下,我们并不建议把Linux(或者UNIX,或者Windows)系统当作防火墙来用,因为功能全面的操作系统一般都不安全。专为路由器和包过滤设计的嵌入式设备(比如Cisco的PIX产品)才是最好的防火墙 。不过,对于一个家用站点,或者没有经费买合适硬件的站点来说,有Linux防火墙比根本没有还是要好,聊胜于无。

如果您正着手用一台Linux机器担当防火墙,请至少要确保它的安全配置和补丁方面已经是最新的。防火墙机器是落实本章所有推荐内容的好地方(从20.12节开始的内容在总体上讨论了包过滤防火墙。如果您不熟悉防火墙的基本概念,最好能在继续阅读下面的内容之前先读一下那一节)。

Linux的2.4版内核引入了一种全新的包过滤引擎,称为Netfilter。控制Netfilter的工具iptables是Linux 2.2版内核中比较老的命令ipchains的兄弟。iptables把有次序的规则“链(chains)”应用到网络包上。链的集合就构成了“表(tables)”,用于处理特殊类型的流量。

例如,默认的iptables表名叫“filter(过滤器)”。这个表里的规则链都用于根据包来过滤网络流量。过滤器表包含3个默认链。内核处理的每个包都要经过3个链中适当的一个。FORWARD链里的规则用于在一个网络接口收到的,而且需要转发到另一个网络接口的所有包。INPUT和OUTPUT链里的规则分别用于目的是本地主机,或者从本地主机发出的流量。这3个标准链通常能够满足两个网络接口之间防火墙的全部需要。如果必要,您还可以定义一个定制的配置,支持更复杂的记账或者路由场合。

除了filter表之外,iptables还包含“nat”和“mangle”表。nat表包含的规则链控制着NAT(Network Address Translation,网络地址转换,这里的“nat”就是iptables表名,“NAT”是一般地址转换机制的叫法)。12.4.6节讨论了NAT,本节给出一个正在起作用的nat表的例子。在本节后面的内容里,我们会使用nat表的PREROUTING链来做反IP欺骗的包过滤。

mangle表包含了链可以修改或者改变在NAT和包过滤之外的网络包的内容。虽然mangle表对于做包的特殊处理很方便,比如重新设定IP包的ttl值,但是在大多数工作环境中一般不会用到它。我们在这一节里只讨论filter和nat表,而把mangle表留给读者自己去探索。

构成一条链的每条规则都有一个“target(目标)”子句,它决定了如何处理匹配包。一旦某个包匹配了一个规则,那么它的结局就确定了,不再用其他规则来检查它。虽然iptables内部定义了许多target,但是还可以指定另一条链作为规则的target。

在filter表中的规则可以使用的target子句有ACCEPT、DROP、REJECT、LOG、MIRROR、QUEUE、REDIRECT、RETURN和ULOG。当一条规则落在了ACCEPT上的时候,匹配这条规则的包就可以继续通过。DROP和REJECT都会把它们的包丢弃。DROP是默默地丢弃,而REJECT会返回一则ICMP错误消息。LOG提供跟踪包匹配规则情况的简单办法,ULOG提供了范围更广的日志记录信息。

REDIRECT把包分流到一个代理,而不是直接让它们通过。您可能会用这个功能来迫使站点上的所有Web流量都通过一个Web高速缓存,比如Squid。RETURN终结用户定义的链,类似于子例程调用中的return语句。MIRROR目标在发送包之前交换IP源和目的地址。最后,QUEUE通过一个内核模块把包交给本地用户程序。

Linux防火墙通常是由rc启动脚本中的一系列iptables命令来实现的。各个iptables命令通常采取下列形式之一:

 iptables -F chain-name
iptables -P chain-name target
iptables -A chain-name -i interface -j target

第一种形式(-F)把以前所有的规则都从链中清除掉。第二种形式(-P)给链设置一条默认策略(也就是target)。我们建议您使用DROP作为链默认的目标(target)。第三种形式(-A)把当前的说明追加到链上。除非您用-t参数指定了表(table)名,否则您的命令就会被应用到filter表上。-i参数将规则应用到有名字的接口上,-j则标识出目标(target)。iptables还接受许多别的子句,表20.2给出了其中的一部分。

表20.2 iptables过滤器的命令行标志

   

含义或者可能的取值

-p proto

匹配协议:tcpudp或者icmp

-s source-ip

匹配主机或者网络源IP地址(CIDR的记法也行)

-d dest-ip

匹配主机或者网络目的地址

--sport port#

匹配源端口(注意要用两个短划线)

--dport port#

匹配目的端口(注意要用两个短划线)

--icmp-type type

匹配ICMP类型代码(注意要有两个短划线)

!

否定一条子句

-t table

指定一条命令所应用的表(默认是filter表)

下面我们剖析一个完整的例子。我们假定接口ppp0通往Internet,接口eth0通往内部网络。ppp0的IP地址是128.138.101.4,eth0的IP地址是10.1.1.1,两个接口的子网掩码都是255.255.255.0。这个例子使用无状态包过滤机制来保护IP地址为10.1.1.2的Web服务器,这是保护Internet服务器的标准方法。在这个例子的后面部分,我们将展示如何使用有状态的过滤机制来保护桌面用户。


在您使用iptables之前,必须启用IP forwarding(IP转发)功能,并且确保内核里已经加载了各个iptables模块。要了解启用IP forwarding功能的更多知识,参见28.4节或者12.11.8节。带有iptables的所有发行版本也都有能够完成启用和加载的启动脚本。


我们的第一组规则是对filter表进行初始化。首先,冲洗掉表中所有的链,然后将INPUT和FORWARD链的默认目标设为DROP。和其他任何网络防火墙一样,最安全的策略就是丢弃您没有明确允许的任何包。

 iptables -F
iptables -P INPUT DROP
iptables -P FORWARD DROP
规则是按照它们出现在链中的顺序来进行匹配的,所以我们将用得最多的规则放在最前面 。FORWARD链中的前3条规则让去往10.1.1.2上网络服务的连接通过防火墙。确切地说,我们允许SSH(端口22)、HTTP(端口80)和HTTPS(端口443)能够连到我们的Web服务器。第一条规则允许来自可信网络的所有连接通过防火墙。
 
我们允许流到防火墙主机(10.1.1.1)的唯一TCP流量是SSH,它用于管理防火墙。下面列出的第二条规则允许环回(loopback)流量,它留在防火墙主机的本地。我们的系统管理员在他们不能ping到默认路由时会感到紧张,所以这里的第三条规则允许从内部IP地址来的ICMP ECHO_REQUEST包。
 iptables -A INPUT -i eth0 -d 10.1.1.1 -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -i lo -d 127.0.0.1 -p ANY -j ACCEPT
iptables -A INPUT -i eth0 -d 10.1.1.1 -p icmp --icmp-type 8 -j ACCEPT
为了能让任何TCP/IP主机在Internet正常工作,必须允许某些类型的ICMP包通过防火墙。下面的8条规则就是让ICMP包既能送到防火墙主机,也能送到在它之后的网络的最小集合。
 
我们接下来向nat表的PREROUTING链加入规则。虽然nat表的目的并不是做包过滤,但是它的PREROUTING链对于反IP欺骗的过滤来说特别有用。如果我们在PREROUTING链中加入DROP项,它们就不需要出现在INPUT和FORWARD链里了,因为PREROUTING链会应用到所有进入防火墙主机的包上。将控制项放到一个地方比重复放置它们的做法条理性要好得多。
 
最后,我们用一条禁止所有没有得到明确许可的包的规则来结束INPUT和FORWARD链。虽然我们在前面已经用iptables -P命令实施过这个做法,但是LOG目标(target)能让我们看到谁正在从Internet上敲我们的大门。
iptables -A INPUT -i ppp0 -j LOG
iptables -A FORWARD -i ppp0 -j LOG
我们还可以设置IP NAT来伪装在内部网络里使用的私用地址空间。参见12.12节了解更多有关NAT的知识。
Netfilter带给Linux防火墙最强大的功能之一就是有状态包过滤机制。针对连到Internet的客户机的防火墙不是允许特定的传入服务,而是允许根据客户机的请求而传入的响应。下面这条简单的有状态FORWARD链允许离开我们网络的所有流量通过,但只允许和我们的主机发起的连接有关的入流量通过。
 iptables -A FORWARD -i eth0 -p ANY -j ACCEPT
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT

要跟踪复杂的网络会话,比如FTP和IRC,必须加载某些内核模块来启动iptables。如果没有加载这些模块,iptables就会简单地禁止那些连接。虽然有状态包过滤器能够提高站点的安全性,但是它们也增加了网络的复杂性。所以在防火墙上实现它之前,要确信您的确需要有状态功能。


调试iptables规则集最好的办法或许就是用iptables -L -v命令了。这些选项会告诉您链里面的每条规则匹配了多少个包。我们经常在想了解有关匹配包的更多信息时,增加带有LOG目标(target)的临时iptables规则。您可以经常通过使用像tcpdump这样的包探测器解决更棘手的问题。

【责任编辑:夏书 TEL:(010)68476606】

回书目   上一节   下一节
上一篇: 20.12 防火墙 下一篇: 20.14 VPN
微软 Windows 7 技术前瞻
深入Vista应用程序开发
Hyper-V 虚拟化技术专题
重复数据删除技术
2008年上半年IT技术图书阅读排行大盘点
 
 验证码: (点击刷新验证码)   匿名发表
  • 网络工程师考试案例动手实验营

  • 作者:郭春柱
  • 本书依据2009年版《网络工程师考试大纲》的考核要求,深入研究了历年网络工程师考试试题的命题风格和试题结构,对考查的知识点..
Copyright©2005-2008 51CTO.COM 版权所有