Linux防火墙(一)

Linux防火墙

一、Linux防火墙基础

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

netfilter和iptables都用来值Linux防火墙,主要区别为:

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

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

1、iptables的表、链结构

iptables的作用是为包过滤机制的实现提供规则(或称策略)通过不同的规则,告诉netfilter对于来自某些源、前往某些目的地或者具有某些协议特征的数据包应该如何处理。iptables采用了”表“和”链“的分层结构如下:

1)规则表

根据规则集的不同用途,iptables管理着四个不同的规则表,其功能分别由独立的内核模块实现。这四个表的名称、包含的链以及各自用途为:

  • filter表:filter表用来对数据包进行过滤、根据具体的规则要求决定如何处理一个数据包。filter表对应的内核模块为iptable_filter,表内包含INPUT、FORWARD、OUTPUT三个链。
  • nat表:nat(network address translation,网络地址转换)表主要用来修改数据包的IP地址、端口等信息。nat表对应的内核模块为iptable_nat,表内包含PREROUTING、POSTROUTING、OUTPUT三个链。
  • mangle表:mangle表用来修改数据包的TOS(type of service,服务类型)、TTL(time to live,生存周期)、或者为数据包设置mark标记,从而实现流量整形、策略路由等高级应用。mangle表对应的内核模块为iptable_mangle,表内包含PREROUTING、POSTROUTING、INPUT、OUTPUT、FORWARD五个表。
  • raw表:raw表是自1.2.9以后版本的iptables新增的表,主要用来决定是否对数据包进行状态追踪。raw表对应的内核模块为iptables_raw,表内包含OUTROUTING、PREROUTING两个链。
2)规则链

处理各种数据包时,根据防火墙规则的不同介入时机,iptables默认划分为五种不同的规则链如下:

  • INPUT链:当接收到访问防火墙本机地址的数据包(入站)时,应用此链中的规则。
  • OUTPUT链:当防火墙本机向外发送数据包(出站)时,应用此链中的规则。
  • FORWARD链:当接收到需要通过防火墙中转发给其他地址的数据包(转发)时,应用此链中的规则。
  • PREROUTING链:在对数据包做路由选择之前,应用此链中的规则。
  • POSTROUTING链:在对数据包做路由选择之后,应用此链中的规则。

2、数据包过滤的匹配流程

1)规则表之间的顺序

当数据抵达防火墙时,将依次应用raw表、mangle表、nat表和filter表中对应链内的规则(如果存在),应用顺序为raw→mangle→nat→filter。

2)规则链之间的顺序

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

  • 入站数据流向:来自外界的数据包到达防火墙后,首先被PREROUTING链处理(是否修改数据包地址等),然后进行路由选择(判断该数据包应发往何处);如果数据包的目标地址是防火墙本机(如internet用户访问网关的web服务端口),那么内核将其传递给INPUT链进行处理(决定是否允许通过等),通过以后再交给系统上层的应用程序(如httpd服务器)进行响应。
  • 转发数据流向:来自外界的数据包到达防火墙后,首先被PREROUTING链处理,然后再进行路由选择;如果数据包的目标地址是其他外部地址(如局域网用户通过网关访问QQ服务器),则内核将其传递给FORWARD链处理(允许转发或拦截、丢弃),最后交给POSTROUTING链进行处理(是否修改数据包的地址等)。
  • 出站数据流向:防火墙本机向外部地址发送的数据包(如再防火墙主机测试公网DNS服务时),首先被OUTPUT链处理,然后进行路由选择,再交给POSTROUTING链进行处理(是否修改数据包的地址等)。
3)规则链内部各条防火墙规则之间的顺序

当数据包经过每条规则链时,依次按第一条规则、第二条规则…的顺序进行匹配和处理。链内的过滤遵循”匹配即停止“的原则,一旦找到一条相匹配的规则(使用log日志操作的规则除外),则不再检查本链内的后续的其他规则。如果对比整个链后仍无法匹配到相应规则,就按照该规则链的默认策略进行处理。

二、编写防火墙规则

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

使用iptables命令可以管理、编写防火墙规则,其基本的命令格式为:

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

其中,表名、链名用来指定iptables命令所操作的表和链,未指定表名时默认使用filter表;管理选项表示iptables规则的操作方式,如插入(I;insert)、增加(A;append)、删除(D,delete)、查看等;匹配条件用来指定要处理的数据包的特征,不符合指定条件的数据包将不会被处理;控制类型指的是数据包的处理方式,如允许(ACCEPT)、拒绝(REJECT)、丢弃(DROP)等。

在iptables防火墙体系中,最常用的集中控制类型为:

  • ACCEPT:允许数据包通过。

  • DROP:直接丢弃数据包,不给出任何回应信息。

  • REJECT:拒绝数据包通过,必要时会给数据发送端一个响应信息。

  • LOG:在/var/log/messages文件中记录日志信息,然后将数据包传递给下一条规则。防火墙规则的“匹配即停止”对于LOG操作来说是一个特例,因为LOG只是一种辅助动作,并没有真正的处理数据包。

    例如:在filter表(-t filter)的INPUT链中插入(-I)一条规则,拒绝(-j REJECT)发送给本机的使用ICMP协议的数据包(-p icmp),其命令为“iptables -t filter -I INPUT -p icmp -j REJECT”,这会导致其他主机无法ping通本机。

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

iptables命令中擦好用的几个管理选项有如下:

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

  • -D:删除(delete)指定链中的某一条规则,可指定规则序号或者具体内容。

  • I:在指定链中插入(insert)一条新的规则,未指定序号时默认作为第一条规则。

  • -R:修改、替换(replace)指定链中的某一条规则,可指定规则序号或具体内容。

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

  • -F:清空(flush)指定链中的所有规则,如未指定链名,则清空表中的所有链。

  • -n:使用数字形式(nuberic)显示输出结果,如显示IP地址而不是主机名。

  • -v:查看规则时列表显示详细(verbose)的信息。

  • -h:查看命令帮助信息(help)。

  • –line-numbers:查看规则表时,同时显示规则在链中的顺序号。

1)添加新的规则

添加新的防火墙规则时,使用管理选项”-A“、”-I“,前者用来追加规则,后者用来插入规则。例如在filter表INPUT链末尾添加一条防火墙规则,可以执行操作 ”iptables -t filter -A INPUT -p tcp -j ACCEPT"

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

2)查看规则列表

查看已有的防火墙规则时,使用管理选项“-L”,结合“–line-numbers"选项还可以显示各条规则在链内的顺序号。例如查看filter表的INPUT链中所有规则,并显示所有顺序号,可以执行下面操作:

当防火墙规则较多时,以数字形式显示地址和端口信息,能够减少地址解析的环节,从而加快命令的处理速度,例如,以数字地址形式查看filter表INPUT链中的所有规则,可以执行如下操作:

3)删除、清空规则

删除一条防火墙规则时,使用管理选项“-D”,例如,若要删除filter表INPUT链中的第三条规则,可以执行如下操作:

清空指定链或表中的所有防火墙规则,使用管理选项“-F”。例如,清空filter表INPUT链中所有规则,执行如下操作:

使用管理选项“-F”时,省略链名而清空指定表所有链的规则。例如“iptables -F”清空filter表中所有链规则、“iptables -t nat -F”清空nat表中所有链规则、“iptables -t mangle -F”清空mangle表中所有链规则。

4)设置默认策略

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

使用管理选项“-F”清空链时,默认策略不受影响。修改默认策略必须通过管理选项“-P”重新进行设置。同时默认策略并不参与链内规则的顺序编排,因此在其他规则之前或之后设置并无区别。

3、规则的匹配条件

在编写防火墙规则时,匹配条件的设置骑着决定性的作用。对于同一条防火墙规则,可以指定多个匹配条件,表示这些条件全部满足才会生效。根据数据包的各种特征,结合iptables的模块结构,匹配条件的设置包括三大类:通用匹配、隐含匹配和显式匹配。

1)通用匹配

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

①协议匹配

编写iptables规则时使用“-p 协议名的形式指定,用来检查数据包所使用的网络协议(–protocol),如tcp、udp、icmp和all(针对所有IP数据包)等。可用的协议类型存放于Linux系统的/etc/protocols文件中。

例如,若要丢弃通过icmp协议访问防火墙本机的数据包,允许转发经过防火墙的除icmp协议之外的数据包,可以执行下面操作:

②地址匹配

编写iptables规则时使用“-s 源地址”或“-d 目标地址”的形式指定,用来检查数据包的源地址(–source)或目标地址(–destination)。IP地址、网段地址等都是可以接受的,但不建议使用主机名、域名地址(解析过程影响效率)。例如,如要拒绝转发源地址为192.168.10.145的数据,允许转发源地址位于192.168.5.0/24网段的数据,可以执行下列操作:

当遇到小规模的网络扫描或攻击时,封锁IP地址是比较有效的方式。例如,检测到来自10.20.30.0/24网段的频繁扫描、登录穷举等不良企图,可以执行命令如下命令,添加防火墙规则进行封锁。

③网络接口匹配

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

2)隐含匹配

隐含匹配需要结合已指定的协议匹配作为前提条件,无法独立使用。常见的隐含匹配包括端口匹配、TCP标记匹配、ICMP类型匹配。

①端口匹配

编写iptables规则时使用”–sport 源端口"或“-dport 目标端口”的形式,针对的协议为TCP或UDP,用来检查数据包的源端口(–source-port)或目标端口(–destination-port)。单个端口号或者以冒号“:”分隔的端口范围都是可以接受的,但不连续的多个端口不能采用这种方式。

例如,允许网段为192.168.10.0/24转发DNS查询数据包,可以执行操作:

再例如,构建vsftpd服务器时,若要开发20、21端口,以及用于被动模式的端口范围为24500~24600,可以执行下面操作:

②ICMP匹配

编写iptables规则时使用”–icmp-type ICMP 类型“的形式,针对的协议为ICMP,用来检查ICMP数据包的类型(–icmp-type)。ICMP类型使用字符串或数字代码表示:”Echo-Request“代码为8;”Echo-Reply“代码为0;”Destination-Unreachable“代码为3,分别对应ICMP协议的请求、回显、目标不可达。例如,若要禁止从其他主机ping本机,但是允许本机ping其他主机,执行下列操作:

3)显式匹配

显式匹配要求有额外的内核模块提供支持,必须手动以”-m 模块名称“的形式调用相应的模块,然后方可设置匹配条件。添加了带显式匹配条件的规则后,可以执行”lsmod | grep xt_"命令查看到相关的内核扩展模块。

常见的显式匹配包括多端口匹配、IP范围匹配、MAC地址匹配、状态匹配。

①多端口匹配

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

例如,若要允许本机开放25、80、110、143端口,以便提供电子邮件服务,可以执行操作:

②IP范围匹配

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

例如,若要禁止转发源IP地址位于192.168.10.150与192.168.10.160之间的TCP数据包,可以执行操作:

③MAC地址匹配

编写iptables规则时使用“-m mac --mac-source MAC地址”的形式,用来检查数据包的源MAC地址。由于MAC地址本身的局限性,禁止其访问主机的任何应用,可以执行操作:

④状态匹配

编写iptables规则时使用“-m state --state 连接状态”的形式,基于iptables的状态跟踪机制用来检查数据包的连接状态(State)。常见的连接状态包括NEW(与任何连接无关的)、ESTABLISHED(响应请求或者已建立连接的)和RELATED(与已有连接有相关性的,如FTP数据连接)。

例如,若要禁止转发与正常TCP连接无关的非–syn请求数据包(如伪造的网络攻击数据包),可以执行以下操作:

三、小结

  • filter是实现包过滤防火墙功能的内核机制,iptables是管理防火墙规则的用户态工具。
  • iptables的规则体系默认包括四个表(filter、nat、raw、mangle)和五种链(INPUT、OUTPUT、FORWARD、PREROUTING、POSTROUTING)。
  • 表的匹配顺序为raw→mangle→nat→filter;链的匹配顺序取决于具体的数据流向;链内的规则遵循“匹配即停止”的原则,但LOG操作除外。
  • iptables规则的匹配条件类型包括通用匹配、隐含匹配、显式匹配,其中显式匹配必须以“-m 模块名称”加载模块。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值