基础模型与参数介绍

什么是防火墙?防火墙的分类有哪些?

防火墙技术是通过有机结合各类用于安全管理与筛选的软件和硬件设备,帮助计算机网络于其内、外网之间构建一道相对隔绝的保护屏障,以保护用户资料与信息安全性的一种技术。

防火墙对流经它(进出)的网络通信进行扫描,这样能够过滤掉一些攻击,以免其在目标计算机上被执行。防火墙还可以关闭不使用的端口。而且它还能禁止特定端口的流出通信,封锁特洛伊木马。最后,它可以禁止来自特殊站点的访问,从而防止来自不明入侵者的所有通信。

一般情况下,防火墙分类:

从逻辑上防火墙可以大体分为主机防火墙和网络防火墙。

主机防火墙:针对于单个主机进行防护。

网络防火墙:针对于多个主机组成的网络进行防护。往往处于需要被保护的网络入口或边缘,对网络入口进行防护,服务于防火墙背后的本地局域网。

从物理上防火墙可以分为硬件防火墙和软件防火墙。

硬件防火墙:在硬件级别实现部分防火墙功能,另一部分功能基于软件实现,性能高,成本高。

软件防火墙:应用软件处理逻辑运行于通用硬件平台之上的防火墙,性能低,成本低,比如我们常见的windows自带防火墙,就属软件防火墙。

什么是网络边界

什么是iptables?

​ iptables 是与 3.5及以后版本 Linux 内核集成的 IP 信息包过滤系统。一般我们称iptables是防火墙,理解为linux上的软件防火墙,与大多数的Linux软件一样,这个包过滤防火墙是免费的,一般内置在Centos与RedHat中。但是在在RHEL7系统中,firewalld防火墙取代了iptables防火墙,Centos7中的默认防火墙也是firewalld,如果想要在Centos7系统中使用iptables,需要安装。

iptables可以根据数据包中的地址、端口、协议、状态、资源、内容等信息,对数据包进行过滤,并采取相应的处理措施。

​ 但是从严格意义来讲,iptables其实不是真正的防火墙,他的全称应该是“netfilter/iptables IP 数据包过滤系统”,由两个组件netfilter 和 iptables 组成。我们可以把它理解成一个客户端代理,用户通过iptables这个代理,将用户的安全设定执行到对应的”安全框架”中,这个”安全框架”才是真正的防火墙,这个框架的名字叫netfilter。位于内核空间。而iptables位于用户空间,是一个命令行工具,我们用这个工具操作netfilter,习惯上将两者组合起来称iptables防火墙。

Netfilter是Linux操作系统核心层内部的一个数据包处理模块,它具有如下功能:

网络地址转换(Network Address Translate)

数据包内容修改

以及数据包过滤的防火墙功能

所以说,虽然我们使用service iptables start启动iptables”服务”,但是其实准确的来说,iptables并没有一个守护进程,所以并不能算是真正意义上的服务,而应该算是内核提供的功能。

实验环境

防火墙主机:

系统类别:Centos 7.3
内核版本:3.10.0-693.el7.x86_64
操作软件:iptables v1.4.21
IP 地址:192.168.0.2

客户端主机:

系统类别:Kali Linux 2020.1
内核版本:5.5.0-kali2-amd64
IP地 址:192.168.0.4

本次实验共分为三个部分

1. iptables基础模型与概念介绍
2. iptables基础使用方式
3. iptables参数解释

iptables基础模型与概念介绍

iptables是由链、表和规则三个元素组成。

表是链的容器,链是规则的容器。他们三个之间的关系,我们下面细讲。

什么是规则?

规则是iptables面对不同网络报文时采取行动的依据,即iptables是按照规则来办事的。iptables根据规则中指定的匹配条件来尝试匹配每个流经此处的报文,一旦匹配成功,则由规则后面指定的处理动作进行处理;

规则就像是学校的纪律、公司的规章制度一样。是由网络管理员预定义的针对流经防火墙的网络数据包的一条或一系列的约束条件,一般可以将其格式理解为:“如果接收到的数据包头符合设定的条件,就按照设定的处理方式来处理这个数据包”。

规则存储在内核空间的信息包过滤表中,这些规则可以指定源地址、目的地址、传输协议(如TCP、UDP、ICMP)和服务类型(如HTTP、FTP和SMTP)等。当数据包的某些字段与某条规则指定的所有条件匹配时,iptables就根据规则所定义的处理动作来处理这些数据包,如放行(accept)、拒绝(reject)和丢弃(drop)等。

配置防火墙的主要工作就是添加、修改和删除这些规则。

什么是链?

我们知道,防火墙是根据规则办事的,而规则是一条一条的,根据每一条规则应用场景的不同,可以将这些规则进行分类,每一个分类中按顺序排列着多条规则,像一条链子,所以,这些规则所分成的类,就是我们所说的链。

当防火墙按照该条链上的规则对网络报文进行匹配的时候,是依次、按照顺序进行匹配,直到找到一条规则能够对该网络报文进行处理,或是直到这条链所有的规则都匹配完,没有匹配到合适的规则,采用默认规则进行处理。

iptables内置了5条链:PREROUTING链、FORWARD链、POSTROUTING链、INPUT链、OUTPUT链

PREROUTING: 路由前链,应用于对数据包进行路由选择前,即在网卡刚接收到网络报文时;

FORWARD:转发链,其作用是将数据包由一个网卡转发至另一个网卡;

POSTROUTING:路由选择之后所应用的链,应用于防火墙向其他主机转发网络报文时,可对报文进行重新封装;

INPUT:路由选择后所应用的链,应用于网络报文的目的是防火墙本机的上层应用时,即内核空间的TCP/IP协议栈将报文传给用户空间的上层应用时使用的链;

OUTPUT:防火墙用户空间的上层应用向内核空间的TCP/IP协议栈转发报文时使用的链;

我们用如下图进行一个解析:

(只是将网络流量流经防火墙时可能用到的链,及使用该链时流量的走向标了出来,并不是说流量完全按照下图表示的方向进行传送,具体情境具体分析)

image-20240531155402251

情境1: 网络1中的主机,访问网络2中的某个主机。

① 网络流量到达网卡eth1后,防火墙进行PREROUTING链的规则匹配,如果通过,则进入下一步

② 网络流量经过TCP/IP协议栈,进行路由选择。

③ 由于目的地址是网络2中的主机,所以TCP/IP协议栈需要将流量从网卡eth1转发到网卡eth0,防火前在此时进行FORWARD链的规则匹配

④ 防火墙进行POSTROUTING链的规则匹配,对流量进行重新封装,经由网卡eth0发送给网络2中的主机

⑤ 网络2中主机的响应流量,与前面的请求流量的路径差不多,eth0 –> PREROUTING链 –> TCP/IP协议栈 –> FORWARD链 –> POSTROUTING链 –> eth1

情境2: 网络1中的主机,访问防火墙本机上层的一个应用。

① 网络流量到达网卡eth1后,防火墙进行PREROUTING链的规则匹配,如果通过,则进入下一步

② 网络流量经过TCP/IP协议栈,进行路由选择。

③ 由于目的地址是防火墙本机的上层应用,所以TCP/IP协议栈向上层服务转发流量,防火墙进行INPUT链的规则匹配

④ 上层服务在处理完流量后,给与回应,防火墙进行OUTPUT链的规则匹配

⑤ 流量经过TCP/IP协议栈,进行路由选择后,TCP/IP协议栈将流量向网卡eth1转发

⑥ 防火墙进行POSTROUTING链的规则匹配,对流量报文进行重新封装后,经由网卡eth1发送给网络1

经过上面两个情境的分析,我们就可以知道防火墙中,链是如何运作的,也可以总结出更为准确的流程图:

image-20240531163716824

什么是表

表与链不同,表是根据规则功能的不同而进行的分类,把这些实现相同功能的规则放在一起形成一个分类,这个分类就叫做表。比如将都是对IP或者端口进行过滤过滤的规则分为一类。

不同功能的规则,我们可以放置在不同的表中进行管理,而iptables中默认有4种表,每种表对应了不同的功能,而我们所能定义的规则也基本都在这4种功能的范围之内,具体如下:

filter表:负责过滤功能,实现对数据包的过滤,起到真正的安全效果。

nat表:network address translation,网络地址转换功能,不能过滤数据包,仅仅是修改数据包中的IP和端口,即重新封装数据包

mangle表:拆解报文,做出修改,并重新封装的功能,不能过滤,也不能修改IP和端口,其修改的功能是指根据规则修改数据包的隐写标志位,比如TTL、TOS值,以便其他规则或程序可以根据这个标志来对数据包进行过滤或策略路由。

raw表:关闭nat表上启用的连接追踪机制。可以决定是否使用iptables对数据包进行跟踪处理,比如访问量很大的web服务80端口,就可以在raw表中设置规则,让iptables不对80端口的数据包进行链接追踪处理,以此来提高性能。

当然,iptables也支持我们定义自己的表。

表链关系

我们一开始说,表是链的容器,链是规则的容器,那么他们三个之间的关系究竟是怎样的?可以用如下图简单的表示:

image-20240531163813771

prerouting链上所能配置的规则,只拥有nat表、raw表和mangle表所对应的功能,所以,prerouting中的规则只能存放于nat表、raw表和mangle表中。也就是说,不是每个表中都包含所有的链。

他们之间的关系如下:

raw 表包含的链:PREROUTING,OUTPUT

mangle 表包含的链:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING

nat 表包含的链:PREROUTING,OUTPUT,POSTROUTING(centos7中还有INPUT,centos6中没有)

filter 表中包含的链:INPUT,FORWARD,OUTPUT

到这里,我们还需要注意一点,就是优先级的问题,iptables中,在数据包经过一个”链”的时候,会将当前链的所有规则都匹配一遍,但是匹配时总归要有顺序,又因为相同功能类型的规则会汇聚在一张”表”中,所以这里“优先级”的主题,就是“表”。总结为一下就是“哪些”表”中的规则会放在”链”的最前面执行?”

当iptables中的4种表处于同一条”链”时,执行的优先级为:

raw –> mangle –> nat –> filter

iptables防火墙的工作模型

结合上述所有的描述,我们可以将数据包通过防火墙的流程总结为下图:

image-20240531164122244

规则的组成

规则由匹配条件和处理动作组成。

匹配条件

匹配条件分为基本匹配条件与扩展匹配条件

基本匹配条件:

源地址Source IP;
目标地址 Destination IP;
协议类型 protocol;
网卡接口 ;
等。

扩展匹配条件:

除了上述的条件可以用于匹配,还有很多其他的条件可以用于匹配,这些条件泛称为扩展条件,这些扩展条件其实也是netfilter中的一部分,只是以模块的形式存在,如果想要使用这些条件,则需要依赖对应的扩展模块。如:
MAC地址;
字符串;
多个源/目的端口;
时间;

处理动作

处理动作也可以分为基本动作和扩展动作。

常用的处理动作有:

ACCEPT:允许数据包通过。
DROP:直接丢弃数据包,不给任何回应信息,这时候客户端会感觉自己的请求泥牛入海了,过了超时时间才会有反应。
REJECT:拒绝数据包通过,必要时会给数据发送端一个响应的信息,客户端刚请求就会收到拒绝的信息。
SNAT:源地址转换,解决内网用户用同一个公网地址上网的问题。
MASQUERADE:是SNAT的一种特殊形式,适用于动态的、临时会变的ip上。
DNAT:目标地址转换。
REDIRECT:在本机做端口映射。
LOG:在/var/log/messages文件中记录日志信息,然后将数据包传递给下一条规则,也就是说除了记录以外不对数据包做任何其他操作,仍然让下一条规则去匹配。

iptables基础使用方式

如何在centos中查看iptables是否启动?

使用 “service iptables  status” 查看防火墙的状态

如图,绿色的active表示防火墙处于激活状态,即正在运行中。

image-20240531164316414

使用“service iptables stop” 关闭防火墙

怎样查看表中的规则?比如查看filter表中的规则

使用 “iptables -t filter -L” 将iptables表的内容展示出来

如上命令中,-t表示指定查看哪个表的规则,-L 表示将结果列出来。

如下图所示,iptables会返回filter表中存在的各个链(INPUT、FORWARD、OUTPUT)以及链中存在的规则

image-20240531165325541

其实上列中的命令可以使用 “iptables -L” 来代替,因为filter表是iptables的默认表,在不使用-t参数指定表名的情况下,默认是对filter进行操作。

我们也可以查看其它表中的规则,示例如下。

iptables -t raw -L
iptables -t mangle -L
iptables -t nat -L

如何查看指定表中的指定链的规则?

比如,我们只查看filter表中INPUT链的规则,示例如下(注意链名的大小写)。

iptables -L INPUT //-t filter被省略

image-20240531165425661

可以看到,使用-v选项后,iptables展示的信息更多了,多出了很多原来没有的字段,这些字段就是规则对应的属性。具体如下:

pkts:对应规则匹配到的报文的个数。

bytes:对应匹配到的报文包的大小总和。

target:规则对应的target,往往表示规则对应的”动作”,即规则匹配成功后需要采取的措施。

prot:protocol的简写,表示规则对应的协议,是否只针对某些协议应用此规则。

opt:表示规则对应的选项。

in:表示数据包由哪个接口(网卡)流入,我们可以设置通过哪块网卡流入的报文需要匹配当前规则。

out:表示数据包由哪个接口(网卡)流出,我们可以设置通过哪块网卡流出的报文需要匹配当前规则。

source:表示规则对应的源头地址,可以是一个IP,也可以是一个网段。

destination:表示规则对应的目标地址。可以是一个IP,也可以是一个网段。anywhere是iptables默认对IP地址进行了名称解析,如果规则较多的情况下,会降低iptables的工作效率,可以使用-n参数表示不对名称进行反解,直接显示IP地址。

使用-n参数不对名称进行反解

iptables -vnL INPUT

image-20240531165520132

使用–line-numberc 显示规则的序号

iptables --line-number -vnL INPUT

image-20240531165550757

如果觉得 –line-number 比较长,也可以使用–line:

iptables --line -vnL INPUT

默认策略

每条链都有自己的默认策略,如何查看默认策略?默认策略的表述就在每个链后面的括号里:

policy表示当前链的默认策略,policy ACCEPT表示上图中INPUT的链的默认动作为ACCEPT,换句话说就是,当没有没有匹配到相应的规则时,默认接受通过INPUT链的所有请求。

packets表示当前链(上例为INPUT链)默认策略匹配到的包的数量,0 packets表示默认策略匹配到0个包。

bytes表示当前链默认策略匹配到的所有包的大小总和。

其实,我们可以把packets与bytes称作”计数器”,上图中的计数器记录了默认策略匹配到的报文数量与总大小,”计数器”只会在使用-v选项时,才会显示出来。

当被匹配到的包达到一定数量时,计数器会自动将匹配到的包的大小转换为可读性较高的单位。如果想要查看精确的计数值,可以使用-x参数。

可以使用如下命令来修改默认规则(可以尝试修改其他链的默认规则,修改INPUT的默认规则,可能导致远程连接的断开):

iptables -P INPUT DROP //将filter表的INPUT链的默认规则更改为DROP

iptables参数解释

现在开始详细了解iptables的语法和部分参数。

使用man命令查看帮助信息:

image-20240531165843715

如上图,使用man命令查看之后,列出了iptables的大多数参数的使用示例。可总结出iptables的使用语法:

格式:iptables [-t 表名] COMMAND 链名 [规则序号] 匹配条件 -j 执行操作

[-t 表名]: 表示该项可省略,省略该参数的情况下,默认是对filter表进行操作。
COMMAND:要执行的命令,比如添加、删除、修改、替换规则。
[规则序号]:规则序号就是对该链下的第几条规则进行操作,如果省略的话,默认是对最后一条规则进行操作。
匹配条件: 对什么样的数据包进行匹配
执行操作: 对匹配到的数据包执行的操作,比如ACCEPT(接受)、DROP(丢弃)、REJECT(拒绝)

接下来我们详细介绍部分COMMAND常用参数的作用,如下图

例如: -A 表示短项,–append表示长项,使用的时候选其一即可。

-A --append 链名 :在指定的链中追加规则,一般是在末尾追加。
-I --insert 链名 [规则序号num]:在指定的链中插入规则,默认是在首部插入,可指定位置。
-D --delete 链名 [规则序号num]:删除指定链中的指定规则,默认是删除最后一个,可指定位置。
-R --replace 链名 [规则序号num]:替换规则,可指定位置。
-F --flush [链名] :清除指定链中的规则,如果没有指定链名的话,则默认是清除指定表中的所有链下的规则。
-N --new-chain 链名:除自有的5条链之外,还可使用该参数创建新的链。
-X --delete-chain 链名:删除自定义的链。但是链必须是在空链的状态下。
-Z --zero 链名:将指定链的计数器置零。
-P --policy 链名:修改指定链的默认策略。
-L --list :显示iptables中的规则列表。这个参数,我们在上面的章节中已经接触过了,它还有几个可以结合使用的参数:
-n : 使用数字显示,如果不加该参数,iptables会将数字反解为服务名,当规则数量较多时,会影响iptables的效率,速度会变慢,所以一般情况下要添加该参数。
-v : 显示规则的详细信息,包阔每一个规则的计数器。
--line:显示规则的时候,在规则的前面显示序号。

那么上面的是COMMAND部分的常用参数,那么在匹配条件部分也有一些常用的参数:

-p --protocol 协议:指定需要匹配的目标协议,比如tcp、icmp、http等
-s --source 地址:指定需要匹配的源地址
-d --destination 地址:指定需要匹配的目标地址
-i --in-interface 名称:指定网络流量包流入的网卡,即对流入该网卡的流量包进行匹配
-o --out-interface 名称:指定网络流量包流出的网卡,即对流出该网卡的流量包进行匹配

我们可以使用几个例子来练习一下这些参数的使用:

假设我们现在要进行的规则匹配,是其他主机对防火墙本机的请求流量,所以我们需要对INPUT链进行规则的添加:

我们先查看INPUT现有的规则:

iptables -L INPUT -n --line

假设我们现在要禁止别的主机对本机进行ping探测,所以要配置一个icmp协议相关的规则,并且其采用的处理方式是拒绝。

所以我们看上图中的规则,发现第二条规则是跟icmp协议相关的规则,但是其处理方式是ACCEPT接受。这样的话,如果有ping探测包到达本机的时候,进行规则的匹配,等匹配到第二条规则的时候,就会直接通过,不会再匹配到我们新的规则。

我们可以做如下测试:

先添加规则:

iptables -A INPUT -p icmp -s 192.168.0.4 -j DROP

查看规则,可以看见现在有两条跟icmp相关的规则(此处的情况在不同人的实验环境中,可能会有不同):

然后我们使用kali对本机进行ping探测:

发现可以正常探测,说明我们刚刚添加的拒绝规则没有起到效果。我们删除第二条规则:

iptables -D INPUT 2

发现可以正常探测,说明我们刚刚添加的拒绝规则没有起到效果。我们删除第二条规则:

image-20240531170806691

image-20240531170810715

清空规则,只是清空了系统加载在内存中的规则,并没有保存。所以如果要使添加的规则不在重启后消失,需要保存。

可以使用如下命令进行保存

service iptables save  或者 iptables-save > /etc/sysconfig/iptables