防火墙基础

Linux的防火墙体系主要工作在网络层,针对TCP/IP数据包实施过滤和限制,属于典型的包过滤防火墙(或网络层防火墙)。基于Linux内核编码实现,具有非常稳定的性能和高效率,因此获得广泛使用。

在Linux系统中,netfilter和iptables都用来指Linux防火墙。

netfilter:指的是Linux内核中实现包过滤防火墙的内部结构,不以程序或文件的形式存在,属于“内核态”(Kernel Space,又称为内核空间)的防火墙功能体系。

iptables:指的是用来管理Linux防火墙的命令程序,通常位于/sbin/iptables目录下,属于“用户态”(User Space,又称为用户空间)的防火墙管理体系。

1.iptables的表、链结构

iptables的作用是为包过滤机制的实现,提供规则(或策略),通过各种不同的规则,告诉netfilter对来自某些源、前往某些目的或具有某些协议特征的数据包应该如何处理。为了更加方便地组织和管理防火墙规则,iptables采用了“表”和“链”的分层结构(四表五链)。clip_p_w_picpath002

其中,每个规则“表”相当于内核空间的一个容器,根据规则集的不同用途划分为默认的四个表;在每个“表”容器内包括不同的规则“链”,根据处理数据包的不同时机划分为五种链;而决定是否过滤或处理数据包的各种规则,按先后顺序存放在各种规则链中。clip_p_w_picpath004

1.1规则表

为了从规则集的功能上有所区别,iptables管理着四个不同的规则表,其功能分别由独立的内核模块实现,表的作用:容纳各种规则链

表的划分依据:防火墙规则的作用相似。

filter表:filter表用来对数据包进行过滤,根据具体的规则要求决定如何处理一个数据包。filter表对应的内核模块为iptables_filter,表内包含三个链,即INPUT、FORWARD、OUTPUT。

nat表:nat(Network Address Translation,网络地址转换)表主要用来修改数据包的IP地址、端口号等信息。nat表对应的内核模块为iptables_nat,表内包含三个链, 即PREROUTING、POSTROUTING、OUTPUT。

mangle表:mangle表用来修改数据包的TOS(Type Of Service,服务类型)、TTL(Time To Live,生存周期),或者为数据包设置Mark标记,以实现流量×××、策略路由等高级应用。mangle表对应的内核模块为iptables_mangle,表内包含五个链,即PREROUTING、POSTROUTING、INPUT、OUTPUT、FORWARD。

raw表:raw表是自1.2.9以后版本的iptables新增的表,主要用来决定是否对数据包进行状态跟踪。raw表对应的内核模块为iptables_raw,表内包含两个链,即OUTPUT、PREROUTEING。

mangle和raw表的应用较少。

1.2规则链

在处理各种数据包时,根据防火墙规则的不同介入时机,iptables默认划分为五种不同的规则链。规则的作用:对数据包进行过滤或处理,链的作用:容纳各种防火墙规则,链的分类依据:处理数据包的不同时机

INPUT:处理入站数据包

OUTPUT:处理出站数据包

FORWARD:处理转发数据包(/proc/sys/net/ipv4/ip_forward文件中的值为1时,此链才会生效)

POSTROUTING链:在进行路由选择后处理数据包

PREROUTING链:在进行路由选择前处理数据包

其中,INPUT、OUTPUT链主要用在“主机型防火墙”中,主要针对服务器本机进行保护的防火墙;而FORWARD、PREROUTING、POSTROUTING、链多用在“网络型防火墙”中,如使用Linux防火墙中作为网关服务器,在公司与lnternet之间进行安全控制。

1.3数据包过滤的匹配流程

1.3.1规则表之间的顺序

当数据包抵达防火墙时,将依次应用raw表、mangle表、nat表、filter表中相对应链的规则。

1.3.2规则链之间的顺序

根据规则链的划分原则,不同链的处理时机是比较固定的,因此规则链之间的应用顺序取决于数据包的流向。

入站:PREROUTINGàINPUT

出站:OUTPUTàPOSTROUTING

转发:PREROUTINGàFORWARDàPOSTROUTING

clip_p_w_picpath006

1.3.3规则链内部各条防火墙规则之间的顺序

当数据包经过每条规则链时,依次按第一条规则,第二条规则……的顺序进行匹配和处理。链内的过滤遵循“匹配即停止”的原则,一旦找到相匹配的规则,则不会继续匹配(LOG规则除外),如果对比完整个链,也找不到相匹配的规则,则执行默认策略处理。

2.1iptables基本语法、数据包控制类型

基本命令格式如下:

iptables [-t 表名] 管理选项 [链名] [匹配条件] [-j 控制类型]

表名、链名用来指定iptables命令所操作的表和链,未指定表名将使用默认filter表;管理选项表示iptables规则的操作方式,如增、删、查等;匹配条件用来指定要处理的数据包的特征,不符合条件的则不处理,控制类型为数据包的处理方式,如丢弃、拒绝、允许等。

clip_p_w_picpath008

几个注意事项

不指定表名时,默认指filter表

不指定链名时,默认指表内的所有链

除非设置链的默认策略,否则必须指定匹配条件

选项、链名、控制类型使用大写字母,其余均为小写

2.2添加、删除、查看规则等基本操作

clip_p_w_picpath010

-A:在指定链的末尾添加(--append)一条新的规则

-D:删除(--delete)指定链的一条规则,可指定规则序号或内容

-I:在指定链插入(--insert)一条新的规则,未指定序号则为第一条

-R:修改、替换(--replace)指定链的一条规则,可以指定规则序号或内容

-L:列出(--list)指定链的所有规则,未指定链名,则列出表中的所有规则

-F:清空(--flush)指定链中的所有规则,为指定则清空所有

-P:设置指定链的默认策略(--policy)

-n:使用数字形式显示输出结果(--numeric)

-v:显示详细信息(--verbose)

-h:帮助命令(--help)

--line-numbers:显示链中规则的序号

2.2.1添加新的规则

使用管理选项“-A”、“-I”,前者用来追加规则,后者可使用序号指定规则位置,默认为第一条。例如:在filter表INPUT链的末尾添加一条防火墙规则,如下所示(-p用来指定协议名,作为匹配条件):

clip_p_w_picpath012

当使用管理选项“-I”时,允许同时指定新添加规则的顺序号,未指定则默认为第一条规则。例如:以下操作添加两条规则分别位于filter表的第一条和第二条(其中省略了“-t filter”选项,默认使用filter表):

clip_p_w_picpath014

2.2.2查看规则表

查看已有的防火墙规则时,使用管理选项“-L”列出所有规则,结合“—line-numbers”选项可以显示规则顺序号,例如:查看filter表INPUT链的所有规则,并列出顺序号。

clip_p_w_picpath016

当防火墙规则数量较多时,若能够以数字形式显示地址和端口信息,可以减少地址解析的环节,在一定成都上加快了命令执行的速度。例如:以数字形式查看filter表INPUT链中的规则。

clip_p_w_picpath018

2.2.3删除、清空规则

删除防火墙规则时,可使用管理选项“-D”,例如:删除filter表INPUT链的第三条规则,命令如下:

clip_p_w_picpath020

若要清空指定链的所有规则,可以使用“-F”。例如:清空INPUT链所有规则,命令如下:

clip_p_w_picpath022

删除防火墙所有规则如下:

clip_p_w_picpath024clip_p_w_picpath024[1]

2.2.4设置默认策略

Iptables各条链中,默认策略是规则匹配的最后一个环节,当找不到任何一条规则时能够匹配数据包规则时,则执行默认策略。默认策略的控制类型只能为允许(ACCEPT)和丢弃(DROP)两种,例如:执行以下操作可以将filter表中FORWARD链的默认策略设为丢弃,OUTPUT链的默认策略设为允许。

clip_p_w_picpath026

clip_p_w_picpath028

3规则的匹配条件

在编写防火墙规则时,匹配条件的设置起着决定性的作用,只有清晰,准确地设置好匹配条件,防火墙才知道对符合条件的数据包进行处理,避免“误杀”。对于同一条防火墙规则,可以指定多个匹配条件,表示条件都满足才会生效,根据数据包的各种特征,结合iptables的模块结构,匹配条件的设置有三大类:通用匹配、隐含匹配、显式匹配。

3.1通用匹配:又称为常规匹配,这种匹配方式可以独立使用,不依赖于其他条件或扩展模块。常见的通用匹配包括协议匹配、地址匹配、网络接口匹配。

3.1.1协议匹配

使用“-p 协议名”(小p)的形式指定,用来检查数据包所使用的网络协议(--protocol),如tcp、udp、icmp和all(针对所有IP数据包)等,可用的协议类型存放于/etc/protocols文件中。例如:若要丢弃通过icmp协议访问防火墙本机的数据包,允许转发经过防火墙的除icmp协议之外的数据包,可以执行以下操作:

clip_p_w_picpath030

3.1.2地址匹配

编写规则时,“-s 源地址”、“-d 目标地址”的形式指定,用来检查数据包的源地址(--source)或目标地址(--destination)。IP地址、网段均可,不建议使用主机名、域名地址(解析过程影响效率)。例如:若要拒绝转发源地址为192.168.1.11的数据,允许转发源地址为192.168.2.0/24网段的数据,如下所示:

clip_p_w_picpath032

当遇到小规模的网络扫描或***时,封锁IP地址是比较有效的方式。例如:若检测到来自某个网段(192.168.1.0/24)的频繁扫描、登录穷举等不良企图,可以立即添加防火墙规则如下:

clip_p_w_picpath034

3.1.3网络接口匹配

编写iptables规则时使用“-i 接口名称”、“-o 接口名称”的形式,用于检查数据包从防火墙的哪一个接口进入或发出,分别对应入站网卡(--in-interface)和出站网卡(--out-interface)。例如要丢弃从外网接口(eth1)访问防火墙本机且源地址为私有地址的数据包,命令如下:

clip_p_w_picpath036

3.2隐含匹配

这种匹配方式要求以协议作为前提条件,相当于子条件,因此无法独立使用,其对应的功能有iptables在需要时自动(隐含)载入内核。常见的隐含匹配:端口匹配、TCP标记匹配、ICMP类型匹配。

3.2.1端口匹配

使用“—sport 源端口”、“—dport 目标端口”的形式,针对的协议为TCP或DUP,用来检查数据包的源端口(--source-port)或目标端口(--destination-port)。单个端口或或者以冒号“:”分隔的范围端口均可以,但不支持不连续的端口。例如:若要允许为网段192.168.1.1/24转发查询DNS数据包,命令如下:

clip_p_w_picpath038

再例如:构建vsftpd时,若要开放20,21端口,以及用于被动模式的端口范围24500:24600,命令如下:

clip_p_w_picpath040

3.2.2ICMP类型匹配

编写iptables规则时使用“—icmp-type ICMP类型”的形式,针对icmp协议,用来检查ICMP协议数据包的类型。ICMP类型使用字符串或数字代码表示,如“Echo-Request”(代码为8)、“Echo-Reply”(代码为0)、“Destination-Unreachable”(代码为3)分别表示请求、回显、目标主机不可达。

例如:若要禁用从其他主机ping本机,但允许本地ping其他主机,命令如下:

clip_p_w_picpath042

可以执行”iptables –p icmp -h”查看icmp协议的帮助信息

3.2.3 TCP标记匹配

匹配指定的TCP标记。有两个参数,它们都是列表,列表内部用英文的逗号作分隔符,这两个列表之间用空格分开。第一个参数指定我们要检查的标记(作用就象掩码),第二个参数指定“在第一个列表中出现过的且必须被设为1(即状态是打开的)的”标记(第一个列表中其他的标记必须置0)。也就是说,第一个参数提供检查范围,第二个参数提供被设置的条件(就是哪些位置1)。这个匹配操作可以识别以下标记:SYN, ACK,FIN,RST ,URG,PSH。另外还有两个词也可使用,就是ALL和NONE。顾名思义,ALL是指选定所有的标记,NONE是指未选定任何标记。这个匹配也可在参数前加英文的感叹号表示取反。例如:

1、iptables -p tcp --tcp-flags SYN,FIN,ACK SYN表示匹配那些SYN标记被设置而FIN和ACK标记没有设置的包,注意各标记之间只有一个逗号而没有空格。

2、--tcp-flags ALL NONE匹配所有标记都未置1的包。

3、iptables -p tcp --tcp-flags ! SYN,FIN,ACK SYN表示匹配那些FIN和ACK标记被设置而SYN标记没有设置的包,注意和例1比较一下。

3.3显式匹配

这种匹配方式要求有额外的内核模块提供支持,必须手动以”-m 模块名称”的形式调用相应的模块,然后方可设置匹配条件,添加了带显式匹配条件的规则后,可以执行“lsmod |  grep xt_”命令查看到相关的内核扩展模块,(xt_multiport、xt_iprange、xt_mac、xt_state)常见的显式匹配:多端口匹配、IP范围匹配、MAC地址匹配、状态匹配。

3.3.1多端口匹配

编写iptables规则时使用“-m multiport –dport 端口列表”、“-m multiport –sport 端口列表”的形式,用来检查数据包的目标端口、源端口,多个端口之间使用逗号“,”隔开。

例如:若要允许本机开放25、80、110、143端口,以便提供电子邮件服务,命令如下:

clip_p_w_picpath044

3.3.2IP范围匹配

编写iptables规则时使用“-m iprange –src-range IP范围”、“-m iprange –dst-range IP范围”的形式,用来检查数据包的源地址、目标端口,其中IP范围采用“起始地址-结束地址”的形式表示。

例如,若要禁止转发源IP地址位于192.168.4.21与192.168.4.28之间的TCP数据包,命令如下:

clip_p_w_picpath046

3.3.3MAC地址匹配

编写iptables规则时使用“-m mac –mac-source MAC地址”的形式,用于检查数据包的源MAC地址,此命令多用于内部网络。例如:若要根据MAC封锁主机,禁止访问其本机的任何应用,命令如下:

clip_p_w_picpath048

3.3.4状态匹配

编写iptables规则时使用“-m state –state 连接状态”的形式,基于iptables的状态跟踪机制用来检查数据包的连接状态(State)。常见的连接状态有:NEW(与任何连接无关的)、ESTABLISHED(响应请求或者已建立连接的)和RELATED(与已有连接相关性的,如ftp数据连接)。例如:若要禁止转发与正常TCP连接无关的非—syn请求数据包(如伪造的网络***数据包),命令如下:

clip_p_w_picpath050