Linux 的防火墙

Linux 的防火墙

Linux防火墙基础知识

一:防火墙基础介绍

防火墙,其实说白了讲,就是用于实现Linux下访问控制的功能的,它分为硬件的或者软件的防火墙两种。无论是在哪个网络中,防火墙工作的地方一定是在网络的边缘。而我们的任务就是需要去定义到底防火墙如何工作,这就是防火墙的策略,规则,以达到让它对出入网络的IP、数据进行检测。
Linux中最常见的防火墙:iptables,firewalld

二:iptables 的历史以及工作原理

1、iptables的发展:

iptables的前身叫ipfirewall (内核1.x时代),这是一个作者从freeBSD上移植过来的,能够工作在内核当中的,对数据包进行检测的一款简易访问控制工具。但是ipfirewall工作功能极其有限(它需要将所有的规则都放进内核当中,这样规则才能够运行起来,而放进内核,这个做法一般是极其困难的)。当内核发展到2.x系列的时候,软件更名为ipchains,它可以定义多条规则,将他们串起来,共同发挥作用,而现在,它叫做iptables,可以将规则组成一个列表,实现绝对详细的访问控制功能。

他们都是工作在用户空间中,定义规则的工具,本身并不算是防火墙。它们定义的规则,可以让在内核空间当中的netfilter来读取,并且实现让防火墙工作。而放入内核的地方必须要是特定的位置,必须是tcp/ip的协议栈经过的地方。而这个tcp/ip协议栈必须经过的地方,可以实现读取规则的地方就叫做 netfilter.(网络过滤器)

作者一共在内核空间中选择了5个位置
1.内核空间中:从一个网络接口进来,到另一个网络接口去的
2.数据包从内核流入用户空间的
3.数据包从用户空间流出的
4.进入/离开本机的外网接口
5.进入/离开本机的内网接口

2、iptables简介

netfilter/iptables(简称为iptables)组成Linux平台下的包过滤防火墙,与大多数的Linux软件一样,这个包过滤防火墙是免费的,它可以代替昂贵的商业防火墙解决方案,完成封包过滤、封包重定向和网络地址转换(NAT)等功能。

Nefilter是Linux操作系统核心层内部的一个数据包处理模块,它具有如下功能:
网络地址转换(NetworkAddressTranslate)
数据包内容修改
数据包过滤

3、iptables的工作机制
从上面的发展我们知道了作者选择了5个位置,来作为控制的地方,但是你有没有发现,其实前三个位置已经基本上能将路径彻底封锁了,但是为什么已经在进出的口设置了关卡之后还要在内部卡呢? 由于数据包尚未进行路由决策,还不知道数据要走向哪里,所以在进出口是没办法实现数据过滤的。所以要在内核空间里设置转发的关卡,进入用户空间的关卡,从用户空间出去的关卡。那么,既然他们没什么用,那我们为什么还要放置他们呢?因为我们在做NAT和DNAT的时候,目标地址转换必须在路由之前转换。所以我们必须在外网而后内网的接口处进行设置关卡。

这五个位置也被称为五个钩子函数(hook functions),也叫五个规则链。
1.PREROUTING (路由前)
2.INPUT (数据包流入口) :负责过滤进入主机的数据包
3.FORWARD (转发管卡) :负责转发流经主机的数据包
4.OUTPUT(数据包出口) :负责处理从主机发出去的数据包
5.POSTROUTING(路由后)

这是NetFilter规定的五个规则链,任何一个数据包,只要经过本机,必将经过这五个链中的其中一个链。

三:iptables基础

1、规则(rule)

规则(rule)就是网络管理员预定的条件,规则一般定义为“如果数据包头符合这样的条件,就这样处理这个数据包”。规则存储在内核空间的信息包过滤表中,这些规则分别指定了源地址、目的地址、传输协议(TCP、UDP、ICMP)和服务类型(如HTTP、FTP、SMTP)。当数据包与规则匹配时,iptables就根据规则所定义的方法来处理这些数据包,如放行(ACCEPT)、拒绝(REJECT)、或丢弃(DROP)等。配置防火墙的主要规则就是添加、修改和删除这些规则。

处理动作在iptables中被称为target
动作也可以分为基本动作和扩展动作。此处列出一些常用的动作。
ACCEPT:允许数据包通过。
DROP:直接丢弃数据包,不给任何回应信息。
REJECT:拒绝数据包通过,必要时会给数据发送端一个响应的信息, 客户端刚请求就会收到拒绝的信息。
SNAT:源地址转换,解决内网用户同一个公网地址上网的问题。
MASQUERADE:是SNAT的-种特殊形式,适用于动态的、临时会变的ip上。
DNAT:目标地址转换。
REDIRECT:在本机做端口映射。
LOG:在/var/log/messages文件中记录日志信息,然后将数据包传递给下一条规则,也就是说除了记录以外不对数据包做任何其他操作,仍然让下一条规则去匹配。

2、链(chains)

链(chains)是数据包传播的路径,每一条链其实就是众多规则中的一个检查清单,每一条链中可以有一条或数条规则。当一个数据包到达一个链时,iptables就会从链中的第一条规则开始检查,看该数据包是否满足规则所定义的条件,如果满足,系统就会根据该条规则所定义的方法处理该数据包, 否则iptables将继续检查下一条规则。如果该数据包不符合链中任何一何况规则,iptables就会根据该链预先定义的默认策略来处理该数据包。
如下图所示:
在这里插入图片描述

3、iptables的规则表和链

表(tables):提供特定的功能,iptables内置了4个表,即filter表、nat表、mangle表和raw表,分别用于实现包过滤,网络地址转换、包重构(修改)和数据跟踪处理。

链(chains):是数据包传播的路径,每一条链其实就是众多规则中的一个检查清单,每一条链中可以有一 条或数条规则。当一个数据包到达一个链时,iptables就会从链中第一条规则开始检查,看该数据包是否满足规则所定义的条件。如果满足,系统就会根据该条规则所定义的方法处理该数据包;否则iptables将继续检查下一条规则,如果该数据包不符合链中任一条规则,iptables就会根据该链预先定义的默认策略来处理数据包。

iptables采用“表”和“链”的分层结构,在Linux中现在是四张表五个链。下面罗列一下这四张表和五个链
在这里插入图片描述

规则表:
1)filter表——三个链:INPUT、FORWARD、OUTPUT
作用:过滤数据包
内核模块:iptables_filter.
2)Nat表——三个链:PREROUTING、POSTROUTING、OUTPUT
作用:用于网络地址转换(IP、端口)
内核模块:iptable_nat
3)Mangle表——五个链:PREROUTING、POSTROUTING、INPUT、OUTPUT、FORWARD
作用:修改数据包的服务类型、TTL、并且可以配置路由实现QOS
内核模块:iptable_mangle
(此表虽麻烦,设置策略时几乎都不会用到mangle表。)
4)Raw表——两个链:OUTPUT、PREROUTING
作用:决定数据包是否被状态跟踪机制处理
内核模块:iptable_raw

规则链:
1)INPUT——进来的数据包应用此规则链中的策略
2)OUTPUT——外出的数据包应用此规则链中的策略
3)FORWARD——转发数据包时应用此规则链中的策略
4)PREROUTING——对数据包作路由选择前应用此链中的规则(所有的数据包进来的时侯都先由这个链处理)
5)POSTROUTING——对数据包作路由选择后应用此链中的规则(所有的数据包出来的时侯都先由这个链处理)

4、iptables传输数据包的过程

传输数据包报文的流向:
到本机某进程的报文: PREROUTING –> INPUT
由本机转发的报文:PREROUTING –> FORWARD –> POSTROUTING
由本机的某进程发出报文(通常为响应报文) : OUTPUT –> POSTROUTING

在这里插入图片描述

  1. 当一个数据包进入网卡时,它首先进入prepouting链,内核根据数据包目的IP判断是否需要转送出去。
  2. 如果数据包就是进入本机的,它就会沿着图向下移动,到达INPUT链。数据包到了INPUT链后,任何进程都会收到它。本机上运行的程序可以发送数据包,这些数据包会经过OUTPUT链,然后到达POSTROUTING链输出。
  3. 如果数据包是要转发出去的,且内核允许转发,数据包就会如图所示向右移动,经过FORWARD链,然后到达POSTROUTING链输出。

5、管理和设置iptables规则:

在这里插入图片描述

1)命令选项(command)
命令选项用于指定iptables的执行方式,包括插入规则、删除规则和添加规则等:
-P 或–policy 定义默认策略
-L 或–list 查看iptables规则列表
-A 或–append 在规则列表的最后增加一条规则
-I 或–insert 在指定的位置插入一条规则
-D 或–delete 在规则列表中删除一条规则
-R 或–replace 替换规则列表中的某条规则
-F 或–flush 删除表中的所有规则
-Z 或–zero 将表中所有链的计数和流量计数器都清零
``
2)匹配选项(parameter)
匹配选项指定数据包与规则匹配所应具有的特征,包括源地址、目的地址、传输协议(如TCP、UDP、ICMP)和端口号(如80、21、110)等:
-i 或–in-interface 指定数据包是从哪个网络接口进入
-o 或–out-interface 指定数据包是从哪个网络接口输出
-p 或–porto 指定数据包匹配的协议,如TCP、UDP
-s 或–source 指定数据包匹配的源地址
-sport 指定数据包匹配的源端口号,可以使用“起始端口号:结束端口号”的格式指定一个范围的端口
-d 或–destination 指定数据包匹配的目标地址
-dport 指定数据包匹配的目标端口号,可以使用“起始端口号:结束端口号”的格式指定一个范围的端口

四:firewalld

1、firewalld简介

CentOS 7默认的防火墙管理工具,取代之前的iptables防火墙,属于用户态。
firewalld和iptables内部结构都指向netfilter这个强大的网络过滤子系统,以实现包过滤防火墙功能。
支持动态更新、加入防火墙zone概念,支持IPv4和IPv6地址。

2、firewalld与iptables区别

名称 firewalld iptables
配置文件 /usr/lib/firewalld/和/etc/firewalld/ /etc/sysconfig/iptables
对规则的修改 不需要全部刷新策略,不丢失现行连接 需要全部刷新策略,丢失连接
防火墙类型 动态防火墙 静态防火墙

3、firewalld的区域

firewalld将所有的网络数据流量划分为多个区域,从而简化防火墙管理。根据数据包的源IP地址或传入网络接口等条件,将数据流量转入相应区域的防火墙规则。对于进入系统的数据包,首先检查的就是其源地址。

区域介绍:

区域 默认策略规则
trusted 允许所有的数据包
home 拒绝流入的流量,除非与流出的流量相关;而如果流量与 ssh、mdns、ipp-client、amba-client 与 dhcpv6-client 服务相关,则允许流量
internal 等同于 home 区域
work 拒绝流入的流量,除非与流出的流量数相关;而如果流量与 ssh、ipp-client 与 dhcv6-client 服务相关则允许流量
public 拒绝流入的流量,除非与流出的流量相关;而如果流量与 ssh、dhcpv6-client 服务 相关则允许流量
external 拒绝流入的流量,除非与流出的流量相关;而如果流量与 ssh 服务相关,则允许流量
dmz 拒绝流入的流量,除非与流出的流量相关;而如果流量与 ssh 服务相关,则允许流量
block 拒绝流入的流量,除非与流出的流量相关
drop 拒绝流入的流量,除非与流出的流量相关

数据处理流程:
检查数据来源的源地址

  • 若源地址关联到特定的区域,则执行该区域所指定的规则
  • 若源地址未关联到特定的区域,则使用传入网络接口的区域并执行该区域所指定的规则
  • 若网络接口未关联到特定的区域,则使用默认区域并执行该区域所指定的规则

4、终端管理工具 firewall-cmd

firewall-cmd 是 firewalld 防火墙配置管理工具的 CLI(命令行界面)版本。

参数 作用
–get-default-zone 查询默认的区域名称
–set-default-zone=<区域名称> 设置默认的区域,使其永久生效
–get-zones 显示可用的区域
–get-services 显示预先定义的服务
–get-active-zones 显示当前正在使用的区域与网卡名称
–add-source= 将源自此 IP 或子网的流量导向指定的区域
–remove-source= 不再将源自此 IP 或子网的流量导向某个指定区域
–add-interface=<网卡名称> 将源自该网卡的所有流量都导向某个指定区域
–change-interface=<网卡名称> 将某个网卡与区域进行关联
–list-all 显示当前区域的网卡配置参数、资源、端口以及服务等信息
–list-all-zones 显示所有区域的网卡配置参数、资源、端口以及服务等信息
–add-service=<服务名> 设置默认区域允许该服务的流量
–add-port=<端口号/协议> 设置默认区域允许该端口的流量
–remove-service=<服务名> 设置默认区域不再允许该服务的流量
–remove-port=<端口号/协议> 设置默认区域不再允许该端口的流量
–reload 让“永久生效”的配置规则立即生效,并覆盖当前的配置规则
–panic-on 开启应急状况模式
–panic-off 关闭应急状况模式

5、终端管理工具 firewall-cmd的使用

查询操作

[ 查看当前所使用的区域]
firewall-cmd –get-default-zone

[ 查看指定网卡在firewalld服务中的区域]
firewall-cmd –get-zone-of-interface=网卡名

[查询指定服务在指定区域下当前是否允许请求服务协议的流量]
firewall-cmd –zone=区域 –query-service=服务名

[查看指定服务在指定区域下当前的端口所有状态]
firewall-cmd –zone=区域 –list-ports

[查看指定区域下当前所有状态]
firewall-cmd –zone=区域 –list-all

配置策略

[修改指定网卡内使用的永久模式区域、系统重启后生效]
firewall-cmd –permanent –zone=区域 –change-interface=网卡名称

[修改当前区域修改成指定区域]
firewall-cmd –set-default-zone=区域

[修改指定服务在指定区域下当前允许协议流量访问、立即生效、重启后失效]
firewall-cmd –zone=区域 –add-service=服务名

[修改指定服务在指定区域下永久允许协议流量访问、重启后生效]
firewall-cmd –permanent –zone=区域 –add-service=服务名

[修改指定服务再指定区域下当前拒绝协议流量访问、立即生效、重启后失效]
firewall-cmd –zone=区域 –remove-service=服务名

[修改指定服务再指定区域下永久拒绝协议流量访问、重启生效]
firewall-cmd –permanent –zone=区域 –remove-service=服务名

[允许指定端口再指定区域下当前允许访问、立即生效]
firewall-cmd –zone=区域 –add-port=端口号/tcp

[允许指定端口再指定区域下永久允许访问、重启生效]
firewall-cmd –permanent –zone=区域 –add-port=端口号/tcp

[把访问指定源端口再指定区域下临时转发到指定目标端口、立即生效]
firewall-cmd –zone=区域 –add-forward-port=port=源端口:proto=tcp:toport=目标端口:toaddr=目标IP地址

[把访问指定源端口再指定区域下永久转发到指定目标端口、重启生效]
firewall-cmd –permanent –zone=区域 –add-forward-port=port=源端口:proto=tcp:toport=目标端口:toaddr=目标IP地址

[指定源端口再指定区域下临时转发到目标网段端口、立即生效]
firewall-cmd –zone=区域 –add-rich-rule ‘rule family=“ipv4” source address=“网段/掩码位” forward-port port=“源端口” protocol=“tcp” to-port=“目标端口”

[把指定源端口再指定区域下永久转发到目标网段端口、重启生效]
firewall-cmd –permanent –zone=区域 –add-rich-rule ‘rule family=“ipv4” source address=“网段/掩码位” forward-port port=“源端口” protocol=“tcp” to-port=“目标端口”’

[指定区域下临时禁用指定IP地址的访问、accept 为允许]
firewall-cmd –zone=区域 –add-rich-rule=‘rule family=ipv4 source address=“IP地址” reject’

[指定区域下永久禁用指定IP地址的访问、重启生效、accept 为允许]
firewall-cmd –permanent –zone=区域 –add-rich-rule=‘rule family=“ipv4” source address=“IP地址” reject’

[指定区域下指定服务临时拒绝一个网段访问、适用于单个IP、accept 为允许]
firewall-cmd –zone=区域 –add-rich-rule=“rule family=“ipv4” source address=“网段/掩码位” service name=“服务名” reject”

[指定区域下指定服务永久拒绝一个网段访问、重启生效、适用于单个IP、accept 为允许]
firewall-cmd –permanent –zone=区域 –add-rich-rule=“rule family=“ipv4” source address=“网段/掩码位” service name=“服务名” reject”

[指定区域下指定端口临时拒绝一个网段访问、适用于单个IP、accept 为允许]
firewall-cmd –zone=区域 –add-rich-rule=“rule family=“ipv4” source address=“网段/掩码位” port protocol=“tcp” port=“端口号” reject”

[指定区域下指定端口永久拒绝一个网段访问、重启生效、适用于单个IP、accept 为允许]
firewall-cmd –permanent –zone=区域 –add-rich-rule=“rule family=“ipv4” source address=“网段/掩码位” port protocol=“tcp” port=“端口号” reject”

其他操作

[启动/关闭 firewalld 防火墙服务的应急状况模式,阻断一切网络连接(当远程控制服务器时请慎用)]
firewall-cmd –panic-on
firewall-cmd –panic-off

[保存设置、可立即生效permanent配置]
firewall-cmd –reload

[删除操作、将参数签的 add 改为 remove]
firewall-cmd … –zone=区域 –remove-…


本文参考:


Linux 的防火墙
http://example.com/2023/08/01/计算机基础/Linux-的防火墙/
作者
where
发布于
2023年8月1日
许可协议