Linux系统管理员们都接触过Netfilter/iptables,这是Linux系统自带的免费防火墙,功能十分强大。在接下来的这个《深入浅出Netfilter/iptables防火墙框架》系列中,将对Netfilter/iptables进行详尽的、条理的介绍。本文是基础篇,先介绍Netfilter/iptables框架的原理。(更多原文请见: http://os.51cto.com/art/201107/273443.htm)
1、Netfilter/iptables框架简介
Netfilter/iptables可以对流入和流出的信息进行细化控制,且可以在一台低配置机器上很好地运行,被认为是Linux中实现包过滤功能的第四代应用程序。Netfilter/iptables包含在Linux 2.4以后的内核中,可以实现防火墙、NAT(网络地址翻译)和数据包的分割等功能。netfilter工作在内核内部,而iptables则是让用户定义规则集的表结构。Netfilter/iptables从ipchains和ipwadfm(IP防火墙管理)演化而来,功能更加强大。
这里所说的iptables是ipchains的后继工具,但具有更强的可扩展性。内核模块可以注册一个新的规则表(table),并要求数据包流经指定的规则表。这种数据包选择用于实现数据报过滤(filter表),网络地址转换(NAT表)及数据报处理(mangle表)。Linux 2.4内核及其以上版本提供的这三种数据报处理功能都基于netfilter的钩子函数和IP表,都是相互间独立的模块,完美地集成到了由netfilter提供的框架中,如图1所示。netfilter主要提供了如下三项功能:
- 包过滤:filter表格不会对数据报进行修改,而只对数据报进行过滤。iptables优于ipchains的一个方面就是它更为小巧和快速。它是通过钩子函数NF_IP_LOCAL_IN、NF_IP_FORWARD及NF_IP_LOCAL_OUT接入netfilter框架的。
- NAT:NAT表格监听三个netfilter钩子函数:NF_IP_PRE_ROUTING、NF_IP_POST_ROUTING及NF_IP_LOCAL_OUT。NF_IP_PRE_ROUTING实现对需要转发数据报的源地址进行地址转换,而NF_IP_POST_ROUTING则对需要转发的数据报目的地址进行地址转换。对于本地数据报目的地址的转换,则由NF_IP_LOCAL_OUT来实现。
- 数据报处理:mangle表格在NF_IP_PRE_ROUTING和NF_IP_LOCAL_OUT钩子中进行注册。使用mangle表,可以实现对数据报的修改或给数据报附上一些外带数据。当前mangle表支持修改TOS位及设置skb的nfmard字段。
图1 Netfilter/Iptables框架结构示意图
根据实际情况,灵活运用Netfilter/iptables框架,生成相应的防火墙规则可以方便、高效地阻断部分网络***以及非法数据报(参见图2所示的工作原理)。然而,由于配置了防火墙,可能引起诸如FTP、QQ、MSN等协议和软件无法使用或者某些功能无法正常使用,也有可能引起RPC(远程过程调用)无法执行,这需要用户根据实际情况来配置相应的服务代理程序来开启这些服务。需要特别提醒注意的是,防火墙也可能被内部***,其并不是万能的,还需要综合使用其他防护手段。内部人员由于无法通过Telnet浏览邮件或使用FTP向外发送信息,个别人会对防火墙不满进而可能对其进行***和破坏。而且,***的目标常常是防火墙或防火墙运行的操作系统,这极大地危害了防火墙系统甚至是关键信息系统的安全。
图2 Netfilter/Iptables框架工作原理示意
2、iptables基本原理
通过向防火墙提供有关对来自某个源、到某个目的地或具有特定协议类型的信息包要做些什么的指令,规则控制信息包的过滤。通过使用Netfilter/iptables系统提供的特殊命令iptables,建立这些规则,并将其添加到内核空间的特定信息包过滤表内的链中。关于添加/除去/编辑规则的命令的一般语法如下:
iptables [-t table] command [match] [target]
不难看出,一条iptables规则包含如下4个基本元素:
- 表
- 命令
- 匹配
- 目标
1) 表(table)
[-t table]选项允许使用标准表之外的任何表。表是包含仅处理特定类型信息包的规则和链的信息包过滤表。有三种可用的表选项:filter、nat和mangle。该选项不是必需的,如果未指定,则filter用作默认表。filter表用于一般的信息包过滤,包含INPUT、OUTPUT和FORWAR链。nat表用于要转发的信息包,它包含PREROUTING、OUTPUT和POSTROUTING链。如果信息包及其头内进行了任何更改,则使用mangle表。该表包含一些规则来标记用于高级路由的信息包以及PREROUTING和OUTPUT链。
2) 命令(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计数器清零 |
3) 匹配(match)
iptables命令的可选match部分指定信息包与规则匹配所应具有的特征(如源和目的地地址、协议等)。匹配分为两大类:通用匹配和特定于协议的匹配。这里,将研究可用于采用任何协议的信息包的通用匹配。下面是一些重要的且常用的通用匹配及其说明,如表2所示。
表2 通用匹配说明
通用匹配 | 说 明 |
-p或--protocol | 该通用协议匹配用于检查某些特定协议。协议示例有TCP、UDP、ICMP、用逗号分隔的任何这三种协议的组合列表以及ALL(用于所有协议)。ALL是默认匹配。可以使用!符号表示不与该项匹配 |
-s 或 --source | 该源匹配用于根据信息包的源IP地址来与它们匹配。该匹配还允许对某一范围内的IP地址进行匹配,可以使用!符号,表示不与该项匹配。默认源匹配与所有IP地址匹配 |
-d 或 --destination | 该目的地匹配用于根据信息包的目的地IP地址来与它们匹配。该匹配还允许对某一范围内IP地址进行匹配,可以使用!符号表示不与该项匹配 |
--sport | 指定匹配规则的源端口或端口范围 |
--dport | 指定匹配规则的目的端口或端口范围 |
-i | 匹配单独的网络接口或某种类型的接口设置过滤规则 |
4) 目标(target)
前面已经讲过,目标是由规则指定的操作,对与那些规则匹配的信息包执行这些操作。除了允许用户定义的目标之外,还有许多可用的目标选项。下面是常用的一些目标及其示例和说明,如表3所示。
表3 目标项说明
目 标 项 | 说 明 |
ACCEPT | 当信息包与具有ACCEPT目标的规则完全匹配时,会被接受(允许它前往目的地) |
DROP | 当信息包与具有DROP目标的规则完全匹配时,会阻塞该信息包,并且不对它做进一步处理。该目标被指定为-j DROP |
REJECT | 该目标的工作方式与DROP目标相同,但它比DROP好。和DROP不同,REJECT不会在服务器和客户机上留下死套接字。另外,REJECT将错误消息发回给信息包的发送方。该目标被指定为-j REJECT |
RETURN | 在规则中设置的RETURN目标让与该规则匹配的信息包停止遍历包含该规则的链。如果链是如INPUT之类的主链,则使用该链的默认策略处理信息包。它被指定为-jump RETURN |
LOG | 表示将包的有关信息记录入日志 |
TOS | 表示改写数据包的TOS值 |