一、防火墙的概念
防火墙(firewall)是位于内部网和外部网之间的屏障,它按照系统管理员预先定义好的规则来控制数据包的进出。防火墙是系统的第一道防线,其作用是防止非法用户以及非法数据包进入内部网络。
二、防火墙的分类
1.包过滤型防火墙:包过滤型防火墙工作在OSI参考模型的网络层。包过滤型防火墙主要是根据数据包的源地址、目的地址、端口号和协议类型等标志来确定是否让数据包通过。
2.代理型防火墙:代理型防火墙主要工作在OSI的应用层。代理服务在确定客户端连接请求有效后接管连接,代为向服务器发送连接请求。代理型防火墙可以允许或拒绝特定的应用程序或服务,还可以实施数据流量监控、过滤、记录和报告功能。代理型防火墙先将客户端对服务器的请求进行存储,然后再代替客户端向服务器转发客户端的请求,因此,代理服务器通常具有高速缓存功能,代理型防火墙的最大缺点是速度较慢。
3.状态检测型防火墙:状态检测型防火墙可以动态的根据实际应用需求,自动生成或删除包过滤规则。这种防火墙不但能够根据数据包的源地址、目标地址、协议类型、源端口、目标端口等对数据包进行控制,而且能记录通过防火墙的连接状态,直接对包里的数据进行过滤。
三、Linux防火墙概述
1.Linux系统的防火墙功能是由内核实现的
(1):2.0版内核中,包过滤机制是ipfw,管理工具是ipfwadm
(2):2.2版内核中,包过滤机制是ipchain,管理工具是ipchains
(3):2.4版及以后的内核中,包过滤机制是netfilter,管理工具是iptables(当然了,现在使用的管理工具肯定是iptables了)
2.Linux防火墙
(1):netfilter
- 位于Linux内核中的包过滤型防火墙功能体系
- 称为Linux防火墙的“内核态”
(2):iptables
- 位于/sbin/iptables,是用来管理防火墙的命令工具
- 为防火墙体系提供过滤规则/策略,决定如何过滤或处理到达防火墙主机的数据包
- 称为Linux防火墙的“用户态”
习惯上,上述两种称呼都可以代表Linux防火墙
3.iptables的规则表、规则链
(1):规则表
- 具有某一类相似用途的防火墙规则,按照不同处理时机区分到不同的规则链以后,被归置到不同的表中
- 规则表是规则链的集合
- 默认的4种规则表
raw表:确定是否对该数据包进行状态跟踪
mangle表:为数据包设置标记
nat表:修改数据包中的源、目的IP地址或端口
filter表:确定是否放行该数据包(过滤)
(2):规则链
- 规则链的作用在于对数据包进行过滤或处理,根据处理时机的不同,各种规则被组织在不同的链中
- 规则链是防火墙规则/策略的集合
- 默认的5种规则链
INPUT链:处理入站数据包
OUTPUT链:处理出战数据包
FORWARD链:处理转发数据包
POSTROUTING链:在进行路由选择后处理数据包
PREROUTING链:在进行路由选择前处理数据包
注意:规则表都是小写,规则链都是大写!
(3):iptables规则表、规则链结构
在raw表中只有PREROUTING链和OUTPUT链;
在mangle表中有PREROUTING链、POSTROUTING链、INPUT链、OUTPUT链和FORWARD链;
在nat表中有PREROUTING链、POSTROUTING链和OUTPUT链;
在filter表中有INPUT链、FORWARD链和OUTPUT链。
(4):数据包过滤匹配流程
- 规则表中的优先顺序
依次为raw、mangle、nat、filter表
- 规则链间的匹配顺序
入站数据:PREROUTING链、INPUT链
出战数据:OUTPUT链、POSTROUTING链
转发数据:PREROUTING链、FORWARD链、POSTROUTING链
- 规则链内的匹配顺序
按顺序依次进行检查,找到相匹配的规则即停止,若在该链中找不到相匹配的规则,则按该链的默认策略进行处理。
(5):举例说明数据进出防火墙的顺序
- 数据进入防火墙:先进入到raw表中的PREROUTING链,然后进入mangle表中的PREROUTING链,再进入mangle表中的INPUT链,再进入到nat表中的PREROUTING链,最后再进入到filter表中的INPUT链。
- 数据转发:先进入到raw表中的PREROUTING链,然后进入mangle表中的PREROUTING链,然后进入mangle表中的FORWARD链,然后进入mangle表中的POSTROUTING链,再进入到nat表中的PREROUTING链,再进入到nat表中的POSTROUTING链,最后再进入到filter表中的FORWARD链。
- 数据出防火墙:先进入到raw表中的OUTPUT链,然后进入到mangle表中的OUTPUT链,然后进入到mangle表中的POSTROUTING链,然后进入到nat表中的OUTPUT链,然后进入到nat表中的POSTROUTING链,最后再进入到filter表中的FORWARD链。
四、管理和设置iptables规则
1.iptables命令
(1):iptables命令的语法格式
- iptables [-t 表名] 管理选项 [链名] [条件匹配] [-j 目标动作或跳转]
注意事项:
- 不指定表名时,默认表示filter表
- 不指定链名时,默认表示该表内所有链
- 除非设置规则链的缺省策略,否则需要指定匹配条件。
(2):设置规则内容
- -A:在链尾追加一条新的规则
- -I(是大写的i):在指定位置(或链首)插入一条新的规则
- -R:修改、替换指定位置或内容的规则
- -P:设置指定链的默认策略
(3):列表查看规则
- -L:列表查看各条规则信息
- --line-numbers:查看规则信息时显示规则的行号
- -n:以数字形式显示IP地址、端口等信息
- -v:显示数据包个数、字节数等详细信息
(4):清除规则
- -D:删除指定位置或内容的规则
- -F:清空规则链中的所有规则
和上面相比,可以看见,第二条防火墙策略已经被删除。
可以看见,所有链中的策略都已经被清除,但是,之前修改的默认策略不会被清除。
(5):自定义规则链
- -N:创建一条新的规则链
- -X:删除自定义规则链
可以看见,在filter表中(因为没有指定表,所以默认打开filter表)添加了一条TCP链
和之前相比,发现刚才的新添加的TCP链被删除了。
(6):查看帮助
拓展:在设置防火墙策略时,如果不想让数据包经过防火墙,则可以设置防火墙策略为DROP和REJECT,两者区别如下:
DROP只是将收到的包进行丢弃,并不会返回任何信息;REJECT将数据包进行丢弃,还会向主机进行回应,返回错误信息。
2.通用条件匹配
- 可直接使用,不依赖其他的条件或扩展模块
- 包括网络协议、IP地址、网络接口等匹配方式
(1):协议匹配
- 使用" -p 协议名"的形式
- 协议名可以使用在"/etc/protocols"文件中定义的名称
- 常用的协议包括TCP、UDP、ICMP等
(2):地址匹配
- 使用"-s 源地址"、"-d 目标地址"的形式
- 地址可以是单个IP地址、网络地址(带掩码长度)
(3):接口匹配
- 使用"-i 网络接口名"、"-o 网络接口名"的形式,分别对应接收、发送数据包的网络接口
3.隐含条件匹配
- 一般需要以特定的协议匹配作为前提
- 包括端口、TCP标记、ICMP类型等匹配方式
(1):端口匹配
- 使用“--sport 源端口”、“--dport 目的端口”的形式
- 采用"端口1:端口2"的形式可以指定一个范围的端口
(2):ICMP类型匹配
- 使用"--icmp-type ICMP类型"的形式
- ICMP类型可以使用类型字符串或者对应的数值,例如Echo-Resquest、Echo-Reply
(3):TCP标记匹配
- 使用"--tcp-flags 检测范围 被设置的标记"的形式
- 如"--tcp-flags SYN,RST,ACK SYN"表示检查SYN、RST、ACK这3个标志,只有SYN=1时满足条件
4.显式条件匹配
- 需要使用"-m 扩展模块"的形式明确指定匹配方式
- 包括多端口、MAC地址、IP地址范围、数据包状态等匹配方式
(1):MAC地址匹配
- 使用"-m mac"结合"--mac-source MAC地址"的形式
(2):多端口匹配
- 使用"-m multiport"结合"--sport 源端口列表"或者"--dport 目标端口列表"的形式
- 多个端口之间使用逗号","分隔,连续的端口也可以使用冒号":"分隔
(3):IP地址范围匹配
- 使用"-m iprange"结合"--src-range 源IP范围"或者"--dst-range 目标IP范围"的形式
- 以"-"符号连接起始IP地址、结束IP地址
(4):数据包状态匹配
- 使用"-m state"结合"--state 状态类型"的形式
- 同时表示多种状态使用逗号","分隔
- 常见的数据包状态包括:NEW、ESTABLISHED、RELATED、INVALID