简 述

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

Netfilter与iptables的关系

Netfilter: 是指Linux内核中的一个框架,它可以用于在不同阶段将某些钩子函数(hook)作用域网络协议栈。Netfilter本身并不对数据包进行过滤,它只是允许可以过滤数据包或修改数据包的函数连接到内核网络协议栈中的适当位置,这些函数是可以自定义的,它属于“内核态”的防火墙功能体系。

iptables: 是用户层的工具,它提供命令行接口,能够向Netfilter中添加规则策略,从而实现报文过滤,修改等功能。Linux系统中并不止有iptables能够生成防火墙规则,其他的工具如firewalld等也能实现类似的功能。它通常位于/sbin/iptables目录下,属于“用户态”的防火墙体系。

iptables 四表五链

iptables的作用是为包过滤机制的实现提供规则,通过各种不同的规则,告诉netfilter对来自某些源、前往某些目的或具有某些协议特征的数据包应该如何处理。为了方便地组织和管理防火墙规则,iptables采用了“表”和“链”的分层结构,其中,每个规则表相当于内核空间的一个容器,根据规则集的不同用途划分为默认的四个表;在每个表容器内包含不同的链,根据数据包的不同时机划分为五种链;而决定是否过滤或处理数据包的各种规则,按先后顺序存放在各规则链中。

iptables 规则表

iptables根据功能分类,iptables共有4个表:filter、nat、mangle和raw;

filter表: 主要实现过滤功能,根据具体的规则要求决定如何处理一个数据包。filter表对应的内核模块为iptable_filter,表内包含三个链,即INPUT、FORWARD、OUTPUT。

nat表: 实现Nat功能,主要用来修改数据包的IP地址、端口号等信息。nat表对应的内核模块为iptable_nat,表内包含三个链,即PREROUTING /POSTROUTING/OUTPUT。

mangle表: 用于修改分组数据,mangle表对应的内核模块为iptable_managle,表内包含五个链,即PREROUTING、POSTROUTING、INPUT、OUTPUT、FORWARD。

raw表: 用来决定是否对数据包进行状态跟踪。raw表对应的内核模块为iptable_raw,表内包含两个链,即OUTPUT、PREROUTING。

iptables 规则链

每个表都有一组内置链,用户还可以添加自定义的链,最重要的内置链是filter表中的额INPUT、OUTPUT和FORWARD链。

  • PREROUTING链: 在进行路由选择前处理数据包
  • INPUT链: 处理流入的数据包
  • OUTPUT链: 处理流出的数据包
  • FORWARD链: 处理转发的数据包
  • POSTROUTING链: 在进行路由选择后处理数据包

一般从内网向外网发送的流量一般都是可控且良性的,因此我们使用最多的就是INPUT规则链,该规则链可以增大破坏人员从外网×××内网的难度。

其中,INPUT、OUTPUT链主要用在“主机型防火墙”中,主要针对服务器本身进行保护的防火墙;而FORWARD、PREROUTING、POSTROUTING链多用在“网络型防火墙”中,主要用于网关服务器,在公司内网和Internet之间进行安全控制。

如下图展现了一个数据包是如何通过内核中的net表和filter表的:

详谈iptables防火墙_第1张图片

匹配过程

1. 规则表之间的顺序

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

2. 规则链之间的顺序

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

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

当数据包经过每条规则链时,依次按第一条规则、第二条规则...的顺序进行匹配和处理。链内的过滤遵循“匹配及停止”的原则,一旦找到了一条相匹配的规则,则不再检查本链内后续的其他规则。如果对比完整个链,也找不到与数据包相匹配的规则,就按照规则链的默认策略进行处理。

编写防火墙规则

基本命令格式

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

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

  • ACCEPT:允许数据包通过;
  • DROP:直接丢弃数据包,不给出任何回应信息;
  • REJECT:拒绝数据包通过,必要时会给数据发送端一个响应信息;
  • LOG:在/var/log/message文件中记录日志信息,然后将数据包传递给下一条规则,防火墙规则的“匹配即停止”对于LOG操作是一个特例,因为LOG只是一种辅助动作,并没有真正处理数据包。

管理规则基本操作

选项名 功能及特点
-A 在指定链的末尾添加一条新的规则(追加)
-I 在指定链中插入一条新的规则,未指定序号时默认作为第一条规则
-D 删除指定链中的某一条规则,可指定规则序号或具体内容
-R 修改、替换指定链中的某一条规则,可指定规则序号或具体内容
-L 列出指定链中所有的规则,若未指定链名,则列出表中的所有链
-F 清空指定链中的所有规则,若未指定链名,则清空表中的所有链
-P 设置指定链的默认策略
--line-numbers 查看规则列表时,同时显示规则在链中的顺序号

举例:

  1. 添加新规则,允许tcp协议通过

详谈iptables防火墙

  1. 查看规则表

详谈iptables防火墙

  1. 删除规则

详谈iptables防火墙

  1. 清空规则

详谈iptables防火墙

  1. 设置默认策略
    默认策略是当找不到任何一条能够匹配数据包的规则时,则执行默认策略。默认策略的控制类型为ACCEPT、DROP两种。

规则的匹配条件

1. 通用匹配

可以独立使用,不依赖于其他条件或扩展模块。常见的有以下三种:

1) 协议匹配

使用“-p 协议名”指定,用来检查数据包所使用的网络协议,如tcp、udp、icmp和all等,支持协议可以查询/etc/protocols文件。

例题:
丢弃通过icmp协议访问防火墙本机的数据包,允许转发经过防火墙的除icmp协议外的数据包?

详谈iptables防火墙_第2张图片

2) 地址匹配

使用“-s 源地址”或“-d 目标地址”指定,用来检查数据包的源地址或目的地址,IP地址、网段地址等都是支持的,但是不建议使用主机名、域名,因为解析过程会影响效率。

例题:
拒绝转发源地址为192.168.100.10的数据,允许转发源地址为192.168.1.0/24网段的数据?

详谈iptables防火墙_第3张图片

3) 网络接口匹配

使用“-i 接口名”和“-o 接口名”指定,用来检查数据包从防火墙的哪一个接口进入或发出,分别对应入站网卡、出站网卡。

例题:
丢弃从外网接口(eth1)访问防火墙本机且源地址为私有地址的数据包?

详谈iptables防火墙_第4张图片

2. 隐含匹配

无法独立使用,需要以指定的协议匹配作为前提条件,相当于子条件,其对应的功能由iptables在需要时自动(隐含)载入内核。常见的有以下三种:

1) 端口匹配

使用“--sport 源端口”或“--dport 目标端口”指定,主要针对TCP、UDP协议,用爱来检查数据包的源端口、目标端口,单个端口号或以冒号“:”间隔的端口连续的端口范围都是可以接受的。

例题:
允许转发网段为192.168.1.0/24转发DNS查询数据包

详谈iptables防火墙_第5张图片

2) ICMP类型匹配

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

例题:
禁止从其他主机ping本机,但是允许本机ping其他主机?

详谈iptables防火墙

3. 显示匹配

需要有额外的内核模块提供支持,必须以“-m 模块名称”的形式调用相应的模块,然后设置匹配条件。常见的有以下六种:

1) 多端口匹配

使用“-m multiport --dports 端口列表”、“-m multiport --sports”的形式,检查数据包的源端口、目标端口,多端口时以逗号进行间隔。
例题:
允许本机开放25、80、110、143端口,以提供电子邮件服务?

详谈iptables防火墙_第6张图片

2) IP范围匹配

使用"-m iprange --src-range IP"、“-m iprange --dst-range IP"的形式,用来检查数据包的源地址、目标地址。

例题:
禁止转发源IP地址位于192.168.1.10 ~ 192.168.1.20之间的TCP数据包?

详谈iptables防火墙_第7张图片

3) MAC地址匹配

使用“-m mac --mac-source MAC地址”的形式,用来检查数据包的源MAC地址。

例题:
根据MAC地址封锁主机,禁止其访问本机的任何应用?

详谈iptables防火墙_第8张图片

详谈iptables防火墙_第9张图片

详谈iptables防火墙_第10张图片

4) 状态匹配

使用“-m state --state 连接状态”的形式,基于iptables的状态跟踪机制用来检查数据包的连接状态。

例题:
只开放本机的web服务(80端口),但对发给本机的TCP应答数据包予以放行,其他入站数据包均丢弃?

详谈iptables防火墙_第11张图片

5) 连接数限制

使用“-m connlimit [!] --connlimit-above N"限制同时连接数量

6) 基于时间控制

使用“-m time"

#匹配起始时间与结束时间
--datestart YYYY[-MM[[-DD[Thh[:mm[:ss]]]]]
--datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]]

#根据时间和星期几来匹配
--timestart hh:mm[:ss]
--timestop hh:mm[:ss]
[!] --monthdays day[,day...]
[!] --weekdays day[,day...]

SNAT策略(源地址转换)

SNAT是Linux防火墙的一种地址转换操作,也是iptables命令中的一种数据包控制类型,其作用是根据指定条件修改数据包的源IP地址。

可以在网关中应用SNAT策略,解决局域网共享上网的问题,同时Internet中的服务器并不知道局域网PC的实际IP地址,中间的转换完全由网关来完成,一定程度上保护了内部网络的作用。

SNAT应用

待续写中...

DNAT策略(目标地址转换)

DNAT是Linux防火墙的另一种地址转换操作,同样也是iptables命令中的一种数据包控制类型,其作用是根据指定条件修改数据包的目标IP地址和目标端口。

可以应用于发布企业内部Web服务器。

DNAT应用

待续写中...

规则导出、导入

iptables规则提供了批量导出与导入命令功能,即iptables-save和iptables-restore。

1. 规则导出

iptables-save #规则将被保存至/etc/sysconfig/iptables

iptables-save > /opt/iptables.20180613

2. 规则导入

#iptables-restore #规则将被保存至/etc/sysconfig/iptables

#iptables-restore < /opt/iptables.20180613