更新时间:2022-09-22 14:41:04
企业通过架设各种应用程序提供各种网络访服务。有web网站,电子邮件系统,ftp服务器,数据库系统
linux中的防火墙---netfilter和iptables
linux防火墙基础
主要工作在网络层,针对TCP/IP数据包实现过滤和限制,属于典型的包过滤防火墙,linux系统的防火墙基于内核编码实现,其具有稳定的性能和高效率。
netilter:指的是linux内核中实现包过滤防火墙的内部结构,不以程序或文件的形式存在,属于“内核态,又称为内核空间”的防火墙功能体系
iptables:指的是用来管理linux防火墙的命令程序,通常位于/sbin/iptables目录下,属于“用户态,又称为用户空间”的防火墙功能体系
iptables的表,链结构
iptables的作用是为包过滤机制实现提供规则,通过各种不同的规则,告诉netfilter对来自某些源,前往某些目的或具有某些协议的数据包应该如何处理,为了更加方便地组织和管理防火墙规则,iptables采用了“表”和“链”的分层结构
每个规则“表”相当于内核空间的一个容器,根据规则集的不同用途划分为默认的四个表;每个表容器内包括不同的规则链。根据处理数据包的不同时机划分为五种链,而决定师傅过滤或处理数据包的各种规则,按先后顺序存放在各规则链中。
规则表
iptables管理这四个不同的规则表,其功能分别由独立的内核模块实现。
filter表:filter表用来对数据包进行过滤,根据具体的规则要求决定如何处理一个数据包,filter表对应的内核模块为iptable_filter,表内包含三个链,即INPUT,FORWARD,OUTPUT.
nat表网络地址转换表主要用来修改数据包的ip地址,端口号信息,nat表对应的内核模块为iptable_nat,表内包含三个链,即PREROUTING,POSTROUTING,OUTPUT。
mangle表:mangle表用来修改数据包的TOS服务类型,TTL生存周期,或者为数据包设置Mark标记,实现流量整形,策略路由等应用。mangle表对应的内核模块为iptable_mangle,表内包含五个链,即PREROUTING,POSAROUATING,INPUT,OUTPUT,FORWARD。
raw表:是1.2.9版本以后新增的表,主要用来决定是否对数据包进行状态跟踪,raw表对应的内核模块为iptable_raw,表内包含两个链,即OUTPUT,PREROUTING。
规则链
iptables默认划分为五中不同的规则链,五种链的名称,各自的介入时机
INPUT链:当收到访问防火墙本机地址的数据包入站时
OUTPUT链:当防火墙本机向外发送数据包时
FORWARD链:当接受到需要通过防火墙中转发送给其他地址的数据包时
PREROUTING链:对数据包做路由选择之前
POSTROUTING链:对数据包做路由选择之后
INPUT,OUTPUT链主要用于主机型防火墙中,即主要针对服务器本机进行保护的防火墙,而FORWARD,PREROUTING,POSTROUTING链多用在网络型防火墙中
数据包过滤的匹配流程
规则表之间的顺序
当数据包抵达防火墙是,将依次应用raw表,mangle表,nat表和filter表对应链内的规则,应用顺序raw>mangle>nat>filter
规则链之间的顺序
根据规则链的划分原则,不同链的处理时机是比较固定,因此规则链之间的顺序取决于数据包的流向
入站数据流向:外界的数据包到达防火后,首先被PREROUTING链处理,然后进行路由选择;如果数据包的目标地址是防火墙本机,那么内核将其传递给INPUT链进行处理,通过以后在交给系统上层的应用程序进行响应。
转发数据流向:来自外界数据包到达防火墙后,首先被PREROUTING链处理,然后再进行路由选择;如果数据包的目标地址是其他外部地址,则内核将其传递给FORWARD链进行出出力,最后交给POSTROUTING链进行处理
出站数据流向:防火墙本机向外部地址发送的数据包,首先被OUTPUT链处理,然后进行路由选择,再交给POSTROUTING链进行处理
规则链内部各种防火墙规则之间的顺序
当数据包经过每条规则链是,依次按第一条规则,第二条规则。。。的顺序进行匹配和处理链内的过滤遵循“匹配即停止”的原则,一旦找到一条相匹配的规则,则不再检查本链内后续的其他规则。
编写防火墙规则
基本语法,数据包控制类型
使用iptable命令管理,编写防火墙规则是,基本格式
iptables [-t 表名] 管理选项 [链名] [匹配条件] [-j 控制类型]
其中表名,链名用来指定iptables命令所操作的表和链,未指定表名时将默认使用filter表;管理选项表示iptables规则的操作方式,如插入,增加,删除,查看;匹配条件用来指定要处理的数据包的特征。不符合指定条件的数据包将不会处理;控制类型指的是数据包的处理方式,如允许,拒绝,丢弃
ACCEPT:允许数据包通过
DROP:直接丢弃数据包,不给出任何回应信息
REJECT:拒绝数据包通过,必要时会给数据发送端一个响应信息
LOG:在/var/log/messages文件中记录日志信息,然后将数据包传递给下一条规则,防火墙规则的“匹配即停止”对于LOG操作来说是一个特例。
在filter表(-t filter)的INPUT链中插入一条规则,拒绝(-j REJECT)发给本机的使用ICMP协议的数据包(-p icmp)
添加,查看,删除规则等基本操作
-A 指定链末尾添加一条新规则
-D 删除指定链的某一天规则,可指定序号或内容
-I 插入一条新规则,没指定序号时,默认作为第一条规则
-R 修改,替换指定链中所有规则,未指定链名,则列出链名
-L 列出指定链中的所有规则,若未指定链名,则列出表中所有链
-F 清空指定链中的所有规则,若未指定链名,则清空表中的所有链
-p 设置指定链的默认策略
-n 使用数字形式显示输出结果,如显示ip地址而不是主机名
-v 查看规则列表时显示详细的信息
-h 查看命令帮助信息
--line-numbers 查看规则列表是,同时显示规则在链中的顺序号
规则的匹配条件
编写防火墙规则时,匹配条件的设置起着决定性的作用。匹配条件的设置包括三个大类:通用匹配,隐含匹配,显式匹配。
通用匹配也称为常规匹配,这种匹配方式可以独立使用,不依赖于其他条件或扩展模块。常见的通用匹配包括协议匹配,地址匹配,网络借口匹配
协议匹配:-p 协议名 的形式指定,用来检查数据包所使用的网络协议。如tcp,udp,icmp和all。可用的协议类型存放于linux系统的/etc/procotols文件中。
地址匹配:-s 源地址或 -d 目标地址形指定,用来检查数据包的源地址或目标地址。ip地址,网段地址等都是可以接受的,不建议使用主机名,域名地址
网络借口匹配:-i 接口名和-o 接口名的形式,检查数据包从防火墙的哪一个借口进入和发出。
隐含匹配要求可以指定的协议匹配作为前提条件,相当于子条件。常见的隐含匹配包括端口匹配,tcp标记匹配,ICMP类型匹配
端口匹配:使用--sport 源端口或--dport 目标端口的形式,针对的协议为tcp或udp,用来检查数据包的源端口或目标端口,单个端口好或者以冒号分隔的端口范围都可以,但 不连续的多个端口不能采用这种方式。
ICMP类型匹配:使用--ICMP-type ICMP类型的形式,针对的协议为ICMP,用来检查ICMP数据包的类型,ICMP类型使用字符串或数字代码表示。关于可用的ICMP协议类型,可以执行iptables -p icmp -h命令
显式匹配:要求有额外的内核模块提供支持,必须手动以-m 模块名称形式调用相应的模块,然后方可设置匹配条件,添加了带显式匹配的规则以后,可以执行lsmod | grep xt_命令查看相关的内核扩展模块(xt_multiport,xt_iprange,xt_mac,xt_state)常见的显式匹配包括多端口匹配,ip范围匹配,MAC地址匹配,状态匹配
多端口匹配使用-m multiport --dports 端口列表,-m multiprot --sports端口列表的形式,用来检查数据包的源端口,目标端口,多个端口之间以逗号进行分隔
ip范围匹配
使用-m iprange --src-range ip范围,-m iprange --dst-range ip范围的形式,用来检查数据包的源地址,目标地址,其中ip范围采用起始地址-结束地址的形式表示。
MAC地址匹配
使用-m mac --mac-source MAC地址的形式,用来检查数据包的源MAC地址,由于MAC本身的局限性,此类匹配条件一般指适合用于内部网络
状态匹配
使用-m state --state 连接状态的形式,基于iptables的状态跟踪机制用来检查数据包的连接状态,常见的连接状态包括FEW(与任何连接无关的),ESTABLISHED(响应请求或者已建立连接的),RELATED(与已有连接有相关性)
本文转自 宏强 51CTO博客,原文链接:http://blog.51cto.com/tanhong/1900573