配置 Linux 防火墙 <?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

. 包过滤防火墙的一般概念

1. 概念 : 是用一个软件查看所流经的数据包的包头 (header), 以决定丢弃还是接受这个包

2. 工作层次 : 工作在网络层

3. 包过滤防火墙的工作原理

使用过滤器 : 过滤系统根据过滤规则原则决定是否让数据包通过,检查的 IP 头和 TCP UDP 头包括 :IP 源地址 ,IP 目标地址 , 协议 ,TCP UDP 包的源端口, TCP UDP 包的目标端口 ,ICMP 消息类型 ,TCP 包中的 ACK , 数据包到达的端口 , 数据包出去的端口

通过屏蔽特定的端口可以禁止特定的服务

过滤器的实现 : 过滤路由器检查数据包的特定信息

4. 包过滤操作的基本过程 :

5. 包过滤的优缺点

优点 : 小型网络包过滤较容易实现,处理包的速度快 , 提供透明服务

缺点 :

一些包过滤网关不支持有效的用户认证

规则表很快,会变得很大而且复杂

包过滤防火墙只能阻止外部主机伪装内部主机的 IP ,对于外部主机伪装外部主机的 IP 欺骗却不能阻止

.Netfilter/iptables

1.Netfilter/iptables 是与最新的 2.4.x Linux 内核集成的 IP 信息包过滤系统

2.Netfilter 网络底层架构

(1).Netfilter 是新的用来实现防火墙的过滤器 . iptables 是用来指定 Netfilter 规则的用户工具,它为用户配置防火墙规则提供了方便 .iptables 可以加入、插入或删除核心包过滤表格链中的规则。实际执行者是 netfilter 及其相关模块

(2).Netfilter/IPtables 系统的主要功能:

状态包过滤 ( 连接跟踪 )

各种网络地址翻译

灵活、易扩展的急智机制

大量的增强型补丁包

(3).Netfilter/iptables 的用途 :

建立 Internet 防火墙和基于状态的包过滤

NAT 和伪装 (masquerading) 共享上网

NAT 实现透明代理

用修改 IP 包头的 ToS 字段实现更复杂的功能

tc_iproute2 配合使用可以实现 QoS 路由

(4).Netfilter/iptables 系统的优点 : 它可以配置有状态的防火墙,能够指定并记住为发送或接收信息包所建立的连接的状态,有 4 种有效状态 , 分别为 ESTABLISHED INVALID NEW RELATED

3.Netfilter/iptables 的内核空间和用户空间

netfilter 是内核空间 (KernelSpace) ,是内核的一部分,由一些表组成,每个表由若干链 (chains) 组成,而每条链中有一条或数条规则 (rule)

4.Netfilter/iptables 的工作过程

netfilter/iptables IP 信息包过滤系统是一种功能强大的工具,可用于添加、编辑和除去规则,这些规则是在做信息包过滤决定时,防火墙所遵循和组成的规则。这些规则存储在专用的信息包过滤表中,而这些表集成在 Linux 内核中。在信息包过滤表中,规则被分组放在我们所谓的链( chain )中。如果某个信息包与规则匹配,那么使目标 ACCEPT 允许该信息包通过。还可以使用目标 DROP REJECT 来阻塞并杀死信息包。根据规则所处理的信息包的类型,可以将规则分组在链中。处理入站信息包的规则被添加到 INPUT 链中。处理出站信息包的规则被添加到 OUTPUT 链中。处理正在转发的信息包的规则被添加到 FORWARD 链中。建立规则并将链放在适当的位置之后,就可以开始进行真正的信息包过滤工作了。这时内核空间从用户空间接管工作。当信息包到达防火墙时,内核先检查信息包的头信息,尤其是信息包的目的地。我们将这个过程称为路由。

安装 netfilter/iptables 系统

因为 netfilter/iptables netfilter 组件是与内核 2.4.x 集成在一起的,所以只需要下载并安装 iptables 用户空间工具。

. 安装和配置 netfilter/iptables 系统:

1. 安装 netfilter/iptables

硬件:要使用 netfilter/iptables ,需要有一个运行 Linux OS 并连接到因特网、 LAN WAN 的系统。

软件:带有内核 2.4 或更高版本的任何版本的 Linux OS 。可以从 [url]http://www.kernel.org[/url] 下载最新版本的内核。

安装前的准备

在开始安装 iptables 用户空间工具之前,需要对系统做某些修改。首先,需要使用 make config 命令来配置内核的选项。在配置期间,必须通过将 CONFIG_NETFILTER CONFIG_IP_NF_IPTABLES 选项设置为 Y 来打开它们,因为这是使 netfilter/iptables 工作所必需的。

2. 建立规则和链

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

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

表( table

[-t table] 选项允许使用标准表之外的任何表。表是包含仅处理特定类型信息包的规则和链的信息包过滤表。有三种可用的表选项: filter nat mangle 。该选项不是必需的,如果未指定,则 filter 用作缺省表。

filter 表用于一般的信息包过滤,它包含 INPUT OUTPUT FORWARD 链。 nat 表用于要转发的信息包,它包含 PREROUTING OUTPUT POSTROUTING 链。如果信息包及其头内进行了任何更改,则使用 mangle 表。该表包含一些规则来标记用于高级路由的信息包,该表包含 PREROUTING OUTPUT 链。

注: PREROUTING 链由指定信息包到达防火墙就改变它们的规则所组成,而 POSTROUTING 链由指定正当信息包打算离开防火墙时改变它们的规则所组成。

命令( command

上面这条命令中具有强制性的 command 部分是 iptables 命令的最重要部分。它告诉 iptables 命令要做什么,例如,插入规则、将规则添加到链的末尾或删除规则。以下是最常用的一些命令:

-A --append :该命令将一条规则附加到链的末尾。

示例:

$ iptables -A INPUT -s 205.168.0.1 -j ACCEPT

该示例命令将一条规则附加到 INPUT 链的末尾,确定来自源地址 205.168.0.1 的信息包可以 ACCEPT

-D --delete :通过用 -D 指定要匹配的规则或者指定规则在链中的位置编号,该命令从链中删除该规则。下面的示例显示了这两种方法。

示例:

$ iptables -D INPUT --dport 80 -j DROP

$ iptables -D OUTPUT 3

第一条命令从 INPUT 链删除规则,它指定 DROP 前往端口 80 的信息包。第二条命令只是从 OUTPUT 链删除编号为 3 的规则。

-P --policy :该命令设置链的缺省目标,即策略。所有与链中任何规则都不匹配的信息包都将被强制使用此链的策略。

示例:

$ iptables -P INPUT DROP

该命令将 INPUT 链的缺省目标指定为 DROP 。这意味着,将丢弃所有与 INPUT 链中任何规则都不匹配的信息包。

-N --new-chain :用命令中所指定的名称创建一个新链。

示例:

$ iptables -N allowed-chain

-F --flush :如果指定链名,该命令删除链中的所有规则,如果未指定链名,该命令删除所有链中的所有规则。此参数用于快速清除。

示例:

$ iptables -F FORWARD

$ iptables -F

-L --list :列出指定链中的所有规则。

示例:

$ iptables -L allowed-chain

匹配( match

iptables 命令的可选 match 部分指定信息包与规则匹配所应具有的特征(如源和目的地地址、协议等)。匹配分为两大类:通用匹配和特定于协议的匹配。这里,我将研究可用于采用任何协议的信息包的通用匹配。下面是一些重要的且常用的通用匹配及其示例和说明:

-p --protocol :该通用协议匹配用于检查某些特定协议。协议示例有 TCP UDP ICMP 、用逗号分隔的任何这三种协议的组合列表以及 ALL (用于所有协议)。 ALL 是缺省匹配。可以使用 ! 符号,它表示不与该项匹配。

示例:

$ iptables -A INPUT -p TCP, UDP

$ iptables -A INPUT -p ! ICMP

在上述示例中,这两条命令都执行同一任务 它们指定所有 TCP UDP 信息包都将与该规则匹配。通过指定 ! ICMP ,我们打算允许所有其它协议(在这种情况下是 TCP UDP ),而将 ICMP 排除在外。

-s --source :该源匹配用于根据信息包的源 IP 地址来与它们匹配。该匹配还允许对某一范围内的 IP 地址进行匹配,可以使用 ! 符号,表示不与该项匹配。缺省源匹配与所有 IP 地址匹配。

示例:

$ iptables -A OUTPUT -s 192.168.1.1

$ iptables -A OUTPUT -s 192.168.0.0/24

$ iptables -A OUTPUT -s ! 203.16.1.89

第二条命令指定该规则与所有来自 192.168.0.0 192.168.0.24 IP 地址范围的信息包匹配。第三条命令指定该规则将与除来自源地址 203.16.1.89 外的任何信息包匹配。

-d --destination :该目的地匹配用于根据信息包的目的地 IP 地址来与它们匹配。该匹配还允许对某一范围内 IP 地址进行匹配,可以使用 ! 符号,表示不与该项匹配。

示例:

$ iptables -A INPUT -d 192.168.1.1

$ iptables -A INPUT -d 192.168.0.0/24

$ iptables -A OUTPUT -d ! 203.16.1.89

目标( target

我们已经知道,目标是由规则指定的操作,对与那些规则匹配的信息包执行这些操作。除了允许用户定义的目标之外,还有许多可用的目标选项。下面是常用的一些目标及其示例和说明:

ACCEPT :当信息包与具有 ACCEPT 目标的规则完全匹配时,会被接受(允许它前往目的地),并且它将停止遍历链(虽然该信息包可能遍历另一个表中的其它链,并且有可能在那里被丢弃)。该目标被指定为 -j ACCEPT

DROP :当信息包与具有 DROP 目标的规则完全匹配时,会阻塞该信息包,并且不对它做进一步处理。该目标被指定为 -j DROP

REJECT :该目标的工作方式与 DROP 目标相同,但它比 DROP 好。和 DROP 不同, REJECT 不会在服务器和客户机上留下死套接字。另外, REJECT 将错误消息发回给信息包的发送方。该目标被指定为 -j REJECT

示例:

$ iptables -A FORWARD -p TCP --dport 22 -j REJECT

RETURN :在规则中设置的 RETURN 目标让与该规则匹配的信息包停止遍历包含该规则的链。如果链是如 INPUT 之类的主链,则使用该链的缺省策略处理信息包。它被指定为 -jump RETURN 。示例:

$ iptables -A FORWARD -d 203.16.1.89 -jump RETURN

还有许多用于建立高级规则的其它目标,如 LOG REDIRECT MARK MIRROR MASQUERADE 等。

保存规则

现在,您已经学习了如何建立基本的规则和链以及如何从信息包过滤表中添加或删除它们。但是,您应该记住:用上述方法所建立的规则会被保存到内核中,当重新引导系统时,会丢失这些规则。所以,如果您将没有错误的且有效的规则集添加到信息包过滤表,同时希望在重新引导之后再次使用这些规则,那么必须将该规则集保存在文件中。可以使用 iptables-save 命令来做到这一点:

$ iptables-save > iptables-script

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

$ iptables-restore iptables-script

如果您愿意在每次引导系统时自动恢复该规则集,则可以将上面指定的这条命令放到任何一个初始化 shell 脚本中。

netfilter/iptables 系统的优点

netfilter/iptables 的最大优点是它可以配置有状态的防火墙,这是 ipfwadm ipchains 等以前的工具都无法提供的一种重要功能。有状态的防火墙能够指定并记住为发送或接收信息包所建立的连接的状态。防火墙可以从信息包的连接跟踪状态获得该信息。在决定新的信息包过滤时,防火墙所使用的这些状态信息可以增加其效率和速度。这里有四种有效状态,名称分别为 ESTABLISHED INVALID NEW RELATED

状态 ESTABLISHED 指出该信息包属于已建立的连接,该连接一直用于发送和接收信息包并且完全有效。 INVALID 状态指出该信息包与任何已知的流或连接都不相关联,它可能包含错误的数据或头。状态 NEW 意味着该信息包已经或将启动新的连接,或者它与尚未用于发送和接收信息包的连接相关联。最后, RELATED 表示该信息包正在启动新连接,以及它与已建立的连接相关联。

netfilter/iptables 的另一个重要优点是,它使用户可以完全控制防火墙配置和信息包过滤。您可以定制自己的规则来满足您的特定需求,从而只允许您想要的网络流量进入系统。

另外, netfilter/iptables 是免费的,这对于那些想要节省费用的人来说十分理想,它可以代替昂贵的防火墙解决方案。

最新的 Linux 内核 2.4.x 具有 netfilter/iptables 系统这种内置的 IP 信息包过滤工具,它使配置防火墙和信息包过滤变得便宜且方便。 netfilter/iptables 系统使其用户可以完全控制防火墙配置和信息包过滤。它允许为防火墙建立可定制化的规则来控制信息包过滤。它还允许配置有状态的防火墙。

:WWW 服务器 198.168.80.251,FTP 服务器 198.168.80.252,E-mail 服务器 198.168.80.253 ,包过滤防火墙的 eth0 Internet 相连

#touch /etc/rc.d/rilter-firewall 生成空的脚本,并添加可执行权限

#chmod u+x /etc/rc.d/filter-firewall

#echo "/etc/rc.d/filter-firewal">>/etc/rc.d/rc.local 使脚本能在系统启动时自动执行

#vi /etc/rc.d/filter-firewall

#!/bin/bash

echo "Starting iptables rules" 在屏幕上显示信息

echo "1">/proc/sys/net/ipv4/ip_forward 增加系统的 IP 转发功能

IPT=/sbin/iptables 定义变量

WWW-SERVER=192.168.80.251

FTP-SERVER=192.168.80.252

EMAIL-SERVER=192.168.80.253

IP_RANGE="192.168.80.0/24"

$IPT -F 刷新所有的链的规则

$IPT -P FORWARD DROP