linux防火墙(转)
Linux防火墙基本知识
来源: ChinaUnix博客 日期: 2008.10.30 23:59 (共有条评论) 我要评论
一、防火墙的分类
(一)、包过滤防火墙。
数据包过滤(packet Filtering)技术是在网络层对数据包进行选择,选择的依据是系统内设置的过滤逻辑,称为访问控制表(access control lable,ACL)。通过检查数据流中每个数据包的源地址和目的地址,所用的端口号和协议状态等因素,或他们的组合来确定是否允许该数据包通过。
包过滤防火墙的优点是它对用户来说是透明的,处理速度快且易于维护。缺点是:非法访问一旦突破防火墙,即可对主机上的软件和配置漏洞进行攻击;数据包的源地址、目的地址和IP的端口号都在数据包的头部,可以很轻易地伪造。“IP地址欺骗”是黑客针对该类型防火墙比较常用的攻击手段。
(二)、代理服务型防火墙
代理服务(proxy service)也称链路级网关或TCP通道。它是针对数据包过滤和应用网关技术存在的缺点而引入的防火墙技术,其特点是将所有跨跃防火墙的网络通信链路分为两段。当代理服务器接收到用户对某个站点的访问请求后就会检查请求是否符合控制规则。如果规则允许用户访问该站点,代理服务器就会替用户去那个站点取回所需的信息,再转发给用户,内外网用户的访问都是通过代理服务器上的“链接”来实现的,从而起到隔离防火墙内外计算机系统的作用。
此外,代理服务也对过往的数据包进行分析和注册登记,并形成报告,同时当发现有被攻击迹象时会向网络管理员发出警告,并保留攻击记录,为证据收集和网络维护提供帮助。
二、防火墙的工作原理
(一)、包过滤防火墙的工作原理
包过滤是在IP层实现的,因此,它可以只用路由器来完成。包过滤根据包的源IP地址、目的IP地址、源端口、目的端口及包传递方向等报头信息来判断是否允许包通过,过滤用户定义的内容,如IP地址。其工作原理是系统在网络层检查数据包,与应用层无关。包过滤器的应用非常广泛,因为CPU用来处理包过滤的时间可以忽略不计。而且这种防护措施对用户透明,合法用户在进出网络时,根本感觉不到它的存在,使用起来很方便。这样系统就具有很好的传输性能,易扩展。
但是这种防火墙不太安全,因为系统对应用层信息无感知--也就是说,它们不理解通信的内容,不能在用户级别上进行过滤,即不能识别不同的用户和防止地址的盗用。如果攻击者把自己主机的IP地址设成一个合法主机的IP地址,就可以很轻易地通过包过滤器,这样更容易被黑客攻破。基于这种工作机制,包过滤防火墙有以下缺陷:
1、通信信息:包过滤防火墙只能访问部分数据包的头信息。
2、通信和应用状态信息:包过滤防火墙是无状态的,所以它不可能保存来自于通信和应用的状态信息。
3、信息处理:包过滤防火墙处理信息的能力是有限的。
(二)、代理服务型防火墙工作原理
代理服务型防火墙在应用层上实现防火墙功能。它能提供部分与传输有关的状态,能外圈提供与应用相关的状态和部分传输的信息,它还能处理和管理信息。
三、使用iptables实现包过滤防火墙
(一)、iptables概述及原理
从内核2.4之后使用全新的内核包过虑管理工具--iptables,这个工具使用户更易于理解其工作原理,更容易被使用,也具有更强大的功能。
iptables只是一个管理内核包过滤的工具,可以加入、插入或删除核心包过滤表格(链)中的规则。实际上真正执行这些过滤规则的是netfilter(linux核心中一个通用架构)及其相关模块(如iptables模块和nat模块)。
netfilter是linux核心中一个通用架构,它提供一系列的“表”(tables),每个表由若干“链”(chains)组成,而每条链中可以由一条或数条规则(rule)组成。可以这样理解,netfilter是表的容器,表是链的容器,链是规则的容器。
系统缺省的表为“filter”,该表中包含了INPUT、FORWARD和OUTPUT 3个链。每一条链中可以有一条或数条规则,每一条规则都是这样定义的:“如果数据包头符合这样的条件,就这样处理这个数据包”。当一个数据包到达一个链时,系统就会从第一条规则开始检查,看是否符合该规则所定义的条件,如果满足,系统将根据该条规则所定义的方法处理该数据包;如果不满足则继续检查下一条规则;最后,如果数据包不符合该链中任何一条规则,系统就会根据该链预先定义的策略(policy)来处理该数据包。
(二)、iptables传输数据包的过程
当数据包进入系统时,系统首先根据路由表决定将数据包发给哪一条链,则可能有以下3种情况:
1、数据包的目的地址是本机,则系统将数据包送往INPUT链,如果通过规则检查,则该包被发给相应的本地进程处理;如果没有通过规则检查,系统将丢弃该包。
2、数据包的上的地址不是本机,也就是说这个包将被转发,则系统将数据包送往FORWARD链,如果通过规则检查,该包被发给相应的本地进程处理;如果没有通过规则检查,系统将丢弃该包。
3、数据包是由本地系统进程产生的,则系统将其送往OUTPUT链,如果通过规则检查,则该包被发给相应的本地进程处理;如果没有通过规则检查,系统将丢弃该包。
用户可以给各链定义规则,当数据包到达其中的每一条链,iptables就会根据链中定义的规则来处理这个包。iptables将数据包的头信息与它所传递到的链中的每条规则进行比较,看它是否和每条规则完全匹配。如果数据包与某条规则匹配,iptables就对该数据包执行由该规则指定的操作。例如某条链中的规则决定要丢弃(DROP)数据包,数据包就会在该链处丢弃;如果链中规则接受(ACCEPT)数据包,数据包就可以继续前进;但是,如果数据包与这条规则不匹配,那么它将与链中的下一条规则进行比较。如果该数据包不符合该链中的任何一条规则,那么iptables将根据该链预先定义的默认策略来决定如何处理该数据包,理想的默认策略应该告诉iptables丢弃(DROP)该数据包。
(三)、iptables的优点
netfilter/iptables的最大优点是它可以配置有状态的防火墙,这是ipfwadm和ipchains等以前的工具都无法提供的一种重要功能。有状态的防火墙能够指定并记住为发送或接收信息包所建立的连接的状态。防火墙可以从信息包的连接跟踪状态获得该信息。在决定新的信息包过滤时,防火墙所使用的这些状态信息可以增加其效率和速度。这里有4种有效状态,名称分别为ESTABLISHED、INVALID、NEW和RELATED。
状态ESTABLISHED指出该信息包属于已经建立的连接,该连接一直用于发送和接收信息包并且完全有效。INVALID状态指出该信息包与任何已知的流或连接都不相关联,它可能包含错误的数据或头。状态NEW表示该信息包已经或将启动新的连接,或者它与尚未用于发送和接收信息包的连接相关联。最后,RELATED表示该信息包正在启动新连接,以及它与已建立的连接想关联。
netflter/iptables的另一个重要优点是,它使用户可以完全控制防火墙配置和信息包过滤。可以定制自己的规则来满足特定需求,从而只允许想要的网络流量进入系统。
(四)、iptables的基础知识
1、规则(rule)
规则(rule)就是网络管理员预定的条件,规则一般定义为“如果数据包头符合这样的条件,就这样处理这个数据包”。规则存储在内核空间的信息包过滤表中,这些规则分别指定了源地址、目的地址、传输协议(TCP、UDP、ICMP)和服务类型(如HTTP、FTP、SMTP)。当数据包与规则匹配时,iptables就根据规则所定义的方法来处理这些数据包,如放行(ACCEPT)、拒绝(REJECT)、或丢弃(DROP)等。配置防火墙的主要规则就是添加、修改和删除这些规则。
2、链(chains)
链(chains)是数据包传播的路径,每一条链其实就是众多规则中的一个检查清单,每一条链中可以有一条或数条规则。当一个数据包到达一个链时,iptables就会从链中的第一条规则开始检查,看该数据包是否满足规则所定义的条件,如果满足,系统就会根据该条规则所定义的方法处理该数据包,否则iptables将继续检查下一条规则。如果该数据包不符合链中任何一何况规则,iptables就会根据该链预先定义的默认策略来处理该数据包。
3、表(tables)
表(tables)提供特定的功能,iptables内置3个表,即filter表、nat表和mangle表,分别用于实现包过滤,网络地址转换和包重构的功能。
(1)filter表。filter表主要用于过滤数据包,该表根据系统管理员预定义的一组规则过滤符合条件的数据包。对防火墙而言,主要利用filter表中指定一系列规则来实现对数据包进行过滤操作。
filter表是iptables默认的表,如果没有指定使用哪个表,iptables就默认使用filter表来执行所有的命令。filter表包含了INPUT链(处理进入的数据包)、FORWARD链(处理转发的数据包)和OUTPUT链(处理本地生成的数据包)。在filter表中只允许对数据包进行接受或丢弃的操作,而无法对数据包进行更改。
(2)nat表。nat青主要用于网络地址转换NAT,该表可以实现一对一、一对多和多对多的NAT工作,iptables就是使用该表实现共享上网功能的。nat表包含了PREROUTING链(修改即将到来的数据包)、OUTPUT链(修改在路由之前本地生成的数据包)和POSTROUTING链(修改即将出去的数据包)。
(3)mangle表。mangle表主要用于对指定的包进行修改,因为某些特殊应用可能去改写数据包的一些传输特性,例如理性数据包的TTL和TOS等,不过在实际应用中该表的使用率不高。
(五)、关闭系统防火墙
由于系统的防火墙功能也是使用iptables实现的,如果用户在系统的iptables之上设置规则,很容易发生冲突,所以在进行iptables学习之前,建议关闭系统的防火墙功能。
(六)、iptables命令格式
iptables的命令格式较为复杂,一般格式如下:
#iptables [-t 表] -命令 匹配 操作
注:iptables对所有选项和参数都区分大小写!
1、表选项
表选项用于指定命令应用于哪个iptables内置表。iptables内置表包括filter表、nat表和mangle表。
2、命令选项
命令选项用于指定iptables的执行方式,包括插入规则、删除规则和添加规则等:
-P 或--policy 定义默认策略
-L 或--list 查看iptables规则列表
-A 或--append 在规则列表的最后增加一条规则
-I 或--insert 在指定的位置插入一条规则
-D 或--delete 在规则列表中删除一条规则
-R 或--replace 替换规则列表中的某条规则
-F 或--flush 删除表中的所有规则
-Z 或--zero 将表中所有链的计数和流量计数器都清零
3、匹配选项
匹配选项指定数据包与规则匹配所应具有的特征,包括源地址、目的地址、传输协议(如TCP、UDP、ICMP)和端口号(如80、21、110)等:
-i 或--in-interface 指定数据包是从哪个网络接口进入
-o 或--out-interface 指定数据包是从哪个网络接口输出
-p 或--porto 指定数据包匹配的协议,如TCP、UDP
-s 或--source 指定数据包匹配的源地址
--sport 指定数据包匹配的源端口号,可以使用“起始端口号:结束端口号”的格式指定一个范围的端口
-d 或--destination 指定数据包匹配的目标地址
--dport 指定数据包匹配的目标端口号,可以使用“起始端口号:结束端口号”的格式指定一个范围的端口
4、动作选项
动作选项指定当数据包与规则匹配时,应该做什么操作,如接受或丢弃等。
ACCEPT 接受数据包
DROP 丢弃数据包
REDIRECT 将数据包重新转向本机或另一台主机的某个端口,通常用此功能实现透明代理或对外开放内网的某些服务
SNAT 源地址转换,即改变数据包的源地址
DNAT 目标地址转换,即改变数据包的目的地址
MASQUERADE IP伪装,即常说的NAT技术。MASQUERADE只能用于ADSL等拨号上网的IP伪装,也就是主机的IP地址是由ISP动态分配的;如果主机的IP地址是静态固定的,就要使用SNAT
LOG 日志功能,将符合规则的数据包的相关信息记录在日志中,以便管理员进行分析和排错
(七)、iptables命令的使用
1、查看iptables规则
初始的iptables没有规则,但是如果在安装时选择自动安装防火墙,系统中会有默认的规则存在,可以先查看默认的防火墙规则:
#iptables [-t 表名]
[-t 表名]:定义查看哪个表的规则列表,表名可以使用filter、nat和mangle,如果没有定论表名,默认使用fliter表
:列出指定表和指定链的规则
:定义查看指定表中哪个链的规则,如果不指明哪个链,将查看某个表中所有链的规则
#iptables -L -n (查看filter表所有链的规则)
注:在最后添加-n参数,可以不进行IP与HOSTNAME的转换,显示的速度会快很多。
#iptables -t nat -L OUTPUT (查看nat表OUTPUT链的规则)
2、定义默认策略
当数据包不符合链中任何一条规则时,iptables将根据该链默认策略来处理数据包,默认策略的定义方法如下
#iptables [-t 表名]
[-t 表名]:定义查看哪个表的规则,表名可以使用filter、nat和mangle,如果没有宝,默认使用filter表
:定义默认策略
:定义查看指定表中哪个链的规则,如果不指明,将查看某个表中所有链的规则
:处理数据包的动作,可以使用ACCEPT(接受)和DROP(丢弃)
#iptables -P INPUT ACCEPT (将filter表INPUT链的默认策略定义为接受)
#iptables -t nat -P OUTPUT DROP (将nat表OUTPUT链的默认策略定义为丢弃)
创建一个最简单的规则范例。对于没有经验和时间的用户而言,设置一个简单而又实用的规则是必要的,最基本的原则是“先拒绝所有数据包,然后再允许需要的数据包”,也就是说通常为filter表的链定义。一般都将INPUT定义为DROP,这样就可以阻止任何数据包进入,其他项目定义为ACCEPT,这样对外发送的数据就可以出去。
#iptables -P INPUT DROP
#iptables -P FORWARD ACCEPT
#iptables -P OUTPUT ACCEPT
3、增加、插入、删除和替换规则
#iptables [-t 表名] 链名 [规则编号] [-i | o 网卡] [-p 协议类型] [-s 源IP | 源子网] [--sport 源端口号] [-d 目标IP | 目标子网] [--dport 目标端口号]
[-t 表名]:定义查看哪个表的规则,表名可以使用filter、nat和mangle,如果没有定义,默认使用filter表
-A:新增一条规则,该规则将增加到规则列表的最后一行,该参数不能使用规则编号
-I:插入一条规则,原来该位置上的规则就会身后顺序移动,如果没有指定规则编号,则在第一条规则前插入
-D:删除一条规则,可以输入完整规则,或直接指定规则编号
-R:替换某条规则,规则被替换并不会改变顺序,必须要指定替换的规则编号
:指定查看指定表中某条链的规则,可以使用INPUT、OUTPUT、FORWARD、PREROUTING、OUTPUT、POSTROUTIN
[规则编号]:规则编号是在插入、删除和替换规则时用,编号是按照规则列表的顺序排列,第一条规则编号为1
[-i | o 网卡名称]:i是指数据包从哪块网卡输入,o是批数据包从哪块网卡输出
[-p 协议类型]:可以指定规则应用的协议,包含TCP、UDP、ICMP等
[-s 源IP | 源子网]:数据包的源IP或子网
[--sport 源端口号]:数据包的源端口号
[-d 目标IP | 目标子网]:数据包的目标IP或子网
[--dport 目标端口号]:数据包的目标端口号
:处理数据包的动作
#iptables -A INPUT -i lo -j ACCEPT (追加一条规则,接受所有来自lo接口的数据包)
#iptables -A INPUT -s 192.168.0.44 -j ACCEPT (追加一条规则,接受所有来自192.168.0.44的数据包)
#iptables -A INPUT -s 192.168.0.44 -j DROP (追加一条规则,丢弃所有来自192.168.0.44的数据包)
注:iptables的按照顺序读取规则的,如果两条规则冲突,以排在前面的规则为准。
#iptables -I INPUT 3 -s 192.168.1.0/24 -j DROP (在INPUT链中的第3条规则前插入一条规则,丢弃所有来自192.168.1.0/24的数据包)
注:-I参数如果没有指定插入的位置,将插入到所有规则的最前面
#iptables -D INPUT 2 (删除filter表中INPUT链中的第2条规则)
#iptables -R INPUT 2 -s 192.168.10.0/24 -p tcp --dport 80 -j DROP (替换filter表INPUT链中第2条规则为,禁止192.168.10.0/24访问TCP的80端口)
4、清除规则和计数器
在新建规则时,往往需要清除原有的或旧的规则,以免影响新规则。如果规则较多,逐条删除比较麻烦,可以使用清除规则参数快速删除所有规则。
#iptables [-t 表名]
[-t 表名]:指定策略将应用于哪个表,可以使用filter、nat和mangle,如果没有指定,默认为filter表
-F:删除指定表中所有规则
-Z:将指定表中数据包计数器和流量计数器归零
#iptables -Z (将filter表中数据包计数器和流量计数器请零)
#iptables -F (删除filter表中的所有规则)
5、记录与恢复防火墙规则
可以使用记录与恢复防火墙规则命令,将现有防火墙机制复制下来,在需要恢复时直接恢复即可。
#iptables-save > 文件名 (记录当前防火墙规则)
#iptables-restore > 文件名 (将防火墙规则恢复到当前主机环境)