图 2.Netfilter/IPTables 框架结构示意图
根据实际情况,灵活运用 Netfilter/IPTables 框架,生成相应的防火墙规则可以方便、高效地阻断部分网络攻击以及非法数据报,参见图 3 所示的工作原理。然而,由于配置了防火墙,可能引起诸如 FTP、QQ、MSN 等协议和软件无法使用或者某些功能无法正常使用,也有可能引起 RPC(远程过程调用)无法执行,这需要用户根据实际情况来配置相应的服务代理程序来开启这些服务。需要特别提醒注意的是,防火墙也可能被内部攻击,其并不是万能的,还需要综合使用其他防护手段。内部人员由于无法通过 Telnet 浏览邮件或使用 FTP 向外发送信息,个别人会对防火墙不满进而可能对其进行攻击和破坏。而且,攻击的目标常常是防火墙或防火墙运行的操作系统,这极大地危害了防火墙系统甚至是关键信息系统的安全。
需要特别说明的是:本文下述所有命令的操作使用都是在 Red Hat Enterprise Linux 中测试通过的,可适用于 Red Hat 和 Fedora 系列 Linux 操作系统,对于其他系列的操作系统,命令有可能需要调整。 图 3.Netfilter/IPTables 框架工作原理示意
Netfilter/IPTables 模块化工作架构
Netfilter 是工作在 Linux 中的一个功能,而这种功能是通过“模块”化的方式来扩充和实现的。用户可以通过 Linux 的模块管理工具随心所欲地将模块载入内存,或者将某个不需要使用的模块从内存中删除掉,而 Netfilter 也是以模块的方式存在于 Linux 之中的。可以认为,Linux 系统内存中多加载了一个 Netfilter 模块就意味着 Linux 防火墙的功能多了一项。
Netfilter 在 Linux 系统中有两种存在方式:与 IPv4 或者 IPv6 协议相关,与 IPv4 或者 IPv6 协议均无关。如下所示的目录结构反映了与 IPv4 协议相关的 Netfilter 模块的存在方式: /lib/modules/2.6.18-8.el5/kernel/net/ipv4/netfilter arptable_filter.ko ip_conntrack_proto_sctp.ko ip_nat_tftp.ko ipt_DSCP.ko ipt_REJECT.ko arp_tables.ko ip_conntrack_sip.ko ip_queue.ko ipt_ecn.ko ipt_SAME.ko arpt_mangle.ko ip_conntrack_tftp.ko iptable_filter.ko ipt_ECN.ko ipt_TCPMSS.ko ip_conntrack_amanda.ko ... | 如下所示的目录结构反映了与 IPv6 协议相关的 Netfilter 模块的存在方式: /lib/modules/2.6.18-8.el5/kernel/net/ipv6/netfilter ip6_queue.ko ip6table_raw.ko ip6t_dst.ko ip6t_hbh.ko ip6t_ipv6header.ko ip6t_REJECT.ko ip6table_filter.ko ip6_tables.ko ip6t_eui64.ko ip6t_hl.ko ip6t_LOG.ko ip6t_rt.ko ip6table_mangle.ko ip6t_ah.ko ip6t_frag.ko ip6t_HL.ko ip6t_owner.ko | 以上两个目录结构中的模块均只能在 IPv4 和 IPv6 协议下工作,他们是 Linux 内核版本 2.6.14 下的产物。而为了使得对 Netfilter 模块的管理更加简单和高效,从 Linux 2.6.14 内核版本之后,Netfilter 的模块就只有如下的目录结构方式,它们都是与协议无关的,因而能够工作在 IPv4 和 IPv6 网络协议环境下: /lib/modules/2.6.18-8.el5/kernel/net/netfilter nfnetlink.ko xt_connbytes.ko xt_esp.ko xt_MARK.ko xt_policy.ko xt_statistic.ko nfnetlink_log.ko xt_connmark.ko xt_helper.ko xt_multiport.ko xt_quota.ko xt_string.ko nfnetlink_queue.ko xt_CONNMARK.ko xt_length.ko xt_NFQUEUE.ko xt_realm.ko xt_tcpmss.ko x_tables.ko xt_CONNSECMARK.ko xt_limit.ko xt_NOTRACK.ko xt_sctp.ko xt_tcpudp.ko xt_CLASSIFY.ko xt_conntrack.ko xt_mac.ko xt_physdev.ko xt_SECMARK.ko xt_comment.ko xt_dccp.ko xt_mark.ko xt_pkttype.ko xt_state.ko | 安装和启动 Netfilter/IPTables 系统
因为 Netfilter/IPTables 的 Netfilter 组件是与内核 2.4.x 集成在一起的,对于 Red Hat Linux 9 或更高版本的 Linux 都配备了 Netfilter 这个内核工具,所以一般不须要下载,而只要下载并安装 IPTables 用户空间工具的源代码包,下载的网址为:http://www.netfilter.org/projects/iptables/downloads.html。目前,最新源代码安装包是:iptables-1.4.2-rc1.tar.bz2。在 Red Hat Enterprise Linux 5 中,已经自带了 IPTables 用户空间工具,不须要自己下载源代码安装,这里只是对源代码安装作一个介绍。
在开始安装 IPTables 用户空间工具之前,要对系统做某些修改,主要有如下选项须要配置修改:
- CONFIG_PACKET:如果要使应用程序和程序直接使用某些网络设备,那么这个选项是有用的。
- CONFIG_IP_NF_MATCH_STATE:如果要配置有状态的防火墙,那么这个选项非常重要而且很有用。这类防火墙会记得先前关于信息包过滤所做的决定,并根据它们做出新的决定。
- CONFIG_IP_NF_FILTER:这个选项提供一个基本的信息包过滤框架。如果打开这个选项,则会将一个基本过滤表(带有内置的 INPUT、FORWARD 和 OUTPUT 链)添加到内核空间。
- CONFIG_IP_NF_TARGET_REJECT:这个选项允许指定:应该发送 ICMP 错误消息来响应已被 DROP 掉的入站信息包,而不是简单地杀死这些信息包。
上述配置项的修改,均需要在 Linux 内核中进行配置,进入系统源代码所在目录后,使用如下命令可以进入内核配置选项,对上述选项进行选择即可: 下面是安装源代码包的步骤: // 将源代码文件解压缩 #bzip2 -d iptables-1.4.2-rc1.tar.bz2 #tar -xvf iptables 1.4.2.tar // 切换目录 #cd iptables 1.4.2 // 编译该工具,指定编译的内核目录为 /usr/src/linux-2.6.18-8 #make KERNEL_DIR=/usr/src/linux-2.6.18-8 // 执行 make install 命令,同样设定内核目录为 /usr/src/linux-2.6.18-8 #make install KERNEL_DIR=/usr/src/linux-2.6.18-8 | 安装完成后,就可以启动防火墙了,下面是启动 iptables 的命令: // 使用 service 命令手工启动 # service iptables start | 如果想要在系统启动的时候也启动该防火墙服务,那么可以使用 setup 命令,然后进入 System service 选项,选择 iptables 守护进程即可。
使用 IPTables 编写防火墙规则
通过向防火墙提供有关对来自某个源、到某个目的地或具有特定协议类型的信息包要做些什么的指令,规则控制信息包的过滤。通过使用 Netfilter/IPTables 系统提供的特殊命令 iptables 建立这些规则,并将其添加到内核空间的特定信息包过滤表内的链中。关于添加 / 除去 / 编辑规则的命令的一般语法如下: iptables [-t table] command [match] [target] | 不难看出,一条 IPTables 规则包含如下 5 个基本元素: 表(table) [-t table] 选项允许使用标准表之外的任何表。表是包含仅处理特定类型信息包的规则和链的信息包过滤表。有三种可用的表选项:filter、nat 和 mangle。该选项不是必需的,如果未指定,则 filter 用作默认表。filter 表用于一般的信息包过滤,包含 INPUT、OUTPUT 和 FORWAR 链。nat 表用于要转发的信息包,它包含 PREROUTING、OUTPUT 和 POSTROUTING 链。如果信息包及其头内进行了任何更改,则使用 mangle 表。该表包含一些规则来标记用于高级路由的信息包以及 PREROUTING 和 OUTPUT 链。 命令(command) command 部分是 IPTables 命令的最重要部分,它告诉 IPTables 命令要做什么,例如,插入规则、将规则添加到链的末尾或删除规则。主要有如表 1 所示的命令。 表 1.iptables 常用命令
命 令 | 说 明 | -A 或 --append | 该命令将一条规则附加到链的末尾 | -D 或 --delete | 通过用 -D 指定要匹配的规则或者指定规则在链中的位置编号,该命令从链中删除该规则 | -P 或 --policy | 该命令设置链的默认目标,即策略。所有与链中任何规则都不匹配的信息包都将被强制使用此链的策略 | -N 或 --new-chain | 用命令中所指定的名称创建一个新链 | -F 或 --flush | 如果指定链名,该命令删除链中的所有规则,如果未指定链名,该命令删除所有链中的所有规则。此参数用于快速清除 | -L 或 --list | 列出指定链中的所有规则 | -R 或 --replace | 替换指定链中一条匹配的规则 | -X 或 --delete-chain | 删除指定用户的的定义链,若没有指定链,则删除所有的用户链 | -C 或 --check | 检查数据包是否与指定链的规则相匹配 | -Z 或 --zero | 将指定链中所有规则的 byte 计数器清零 | 匹配(match) IPTables 命令的可选 match 部分指定信息包与规则匹配所应具有的特征(如源和目的地地址、协议等)。匹配分为两大类:通用匹配和特定于协议的匹配。这里,将研究可用于采用任何协议的信息包的通用匹配。下面是一些重要的且常用的通用匹配及其说明,如表 2 所示。 |