Linux——firewalld防火墙(笔记)
目录
一:Firewalld防火墙的概述
(1)firewalld简介
(2)firewalld&iptables的关系
(3)firewalld与iptables service的区别
1. 规则管理方式
2. 默认策略与设计逻辑
3. 配置文件与持久化
4. 适用场景与兼容性
5. 底层实现与扩展性
二:Firewalld网络区域
三:Firewalld防火墙firewall——cmd命令设置
1、获取预定义信息
2、区域管理
3、服务管理
4、端口管理
5、两种配置模式
一:Firewalld防火墙的概述
(1)firewalld简介
它的主要作用为包过滤机制提供匹配规则(或策略),通过各种不同的规则告诉net filter对来自指定源、前往指定目的或具有某些协议特征的数据包采取何种处理方式为了更加方便地组织和管理防火墙。
firewalld提供了支持网站区域所定义的网络链接以及接口安全等级的动态防火墙管理工具,其设计以区域(Zone)和服务(Service)为核心,简化了传统防火墙规则的配置流程。并且拥有两种配置模式:短暂性配置与永久性配置,支持服务或应用程序直接添加防火墙规则接口。
(2)firewalld&iptables的关系
firewalld自身并不具备防火墙的功能,而是和iptables一样需要通过内核的net filter来实现。他们的作用都是用于维护规则,而真正使用规则干活的是内核的net filter,然而他们的结构以及使用方法并不相同。
系统提供了图形化的配置工具firewall-config、system-config-firewall,提供命令行客户端firewall-cmd,用于配置firewalld永久性或非永久性运行时间的改变:依次用iptables工具与执行数据包筛选的内核中的Netfilter通信。逻辑如下:
iptables服务和firewalld都是通过iptables命令与内核netfilter进行交互的。在Euler系统中,我们仍然可以使用iptables命令来管理我们的防火墙。唯一不同的是当我们重启服务器或重启firewalld时,iptables命令管理的规则不会自动加载,反而会被firewalld的规则代替。
(3)firewalld与iptables service的区别
1. 规则管理方式
- Firewalld
- 采用动态规则管理,支持运行时修改单条规则,无需重启服务即可生效(临时规则),永久规则需配合
--permanent
参数保存。 - 规则更新时不会中断现有网络连接。
- 采用动态规则管理,支持运行时修改单条规则,无需重启服务即可生效(临时规则),永久规则需配合
- iptables
- 规则修改后需全量刷新(
iptables-restore
或service iptables restart
),导致现有连接可能中断。 - 所有规则通过链式结构(INPUT/OUTPUT/FORWARD 等)管理,需手动维护规则顺序。
- 规则修改后需全量刷新(
2. 默认策略与设计逻辑
- Firewalld
- 默认拒绝所有流量,需显式开放服务或端口(如 HTTP、SSH)。
- 以区域(Zone)为核心,根据网络接口或源 IP 自动匹配规则(如
public
、trusted
),适用于多网络环境切换。
- iptables
- 默认允许所有流量,需显式拒绝不需要的访问。
- 基于接口和链式规则,直接控制具体端口或协议,适合精细化但复杂度高的场景。
3. 配置文件与持久化
- Firewalld
- 配置文件以 XML 格式存储于
/etc/firewalld/
,支持自定义服务模板和区域规则68。 - 临时规则与永久规则分离,需通过
--reload
同步配置。
- 配置文件以 XML 格式存储于
- iptables
- 规则保存于文本文件
/etc/sysconfig/iptables
,直接编辑后需手动加载。 - 所有规则修改需显式保存(
service iptables save
)才能持久化。
- 规则保存于文本文件
4. 适用场景与兼容性
- Firewalld
- 适合动态网络环境(如频繁切换信任区域)及追求配置便捷性的场景。
- 默认集成于 CentOS/RHEL 7+ 等现代 Linux 发行版。
- iptables
- 兼容老旧系统(如 CentOS 6 及更早版本),适合需要复杂规则(如深度包检测、自定义链)的场景。
- 与 Firewalld 冲突,二者不可同时启用。
5. 底层实现与扩展性
- 共同点
- 均依赖内核的 Netfilter 框架,实际流量控制由内核模块完成。
- 差异点
- Firewalld 可通过直接接口(Direct Interface)调用 iptables 语法添加自定义规则。
- iptables 提供更底层的控制,支持 NAT、流量整形等高级功能。
二:Firewalld网络区域
firewalld将所有的网络数据流量划分为多个区域,从而简化防火墙管理。根据数据包的源IP地址或传入网络接口等条件,将数据流量传入相应区域的防火墙规则。对于进入系统的数据包,首先检查的就是其源地址。逻辑如下:
- 若源地址关联到特定的区域,则执行该区域所制定的规则。
- 若源地址未关联到特定的区域,则使用传入网络接口的区域并执行该区域所指定的规则。
- 若网络接口未关联到特定的区域,则使用默认区域并执行该区域所制定的规则。
默认区域不是单独的区域,而是指向系统上定义的某个其他区域。默认情况下,默认区域是public,但是系统管理员可以更改默认区域。以上匹配规则,按照先后顺序,第一个匹配的规则胜出。
在每个区域中都可以配置其要打开或者关闭的一系列服务或端口,firewalld的每个预定义的区域都设置了默认打开的服务。预定义区域说明如下:
区域 | 默认策略规则 |
---|---|
trusted | 允许所有的数据包 |
home | 拒绝流入的流量,除非与流出的流量相关;而如果流量与ssh、mdns、ipp-client、amba-clent与dhcpv6-client服务相关,则允许流量 |
internal | 拒绝流入的流量,除非与流出的流量数相关;而如果流量与ssh、ipp-client与dhcpv6-client服务相关,则允许流量 |
work | 拒绝流入的流量。除非与流出的流量相关;而如果流量与ssh、dhcpv6-client服务相关,则允许流量 |
public | 拒绝流入的流量,除非与流出的流量相关;而如果流量与ssh、dhcpv6-client服务相关,则允许流量 |
external | 拒绝流入的流量,除非与流出的流量相关;而如果流量与ssh服务相关,则允许流量 |
dmz | 拒绝流入的流量,除非与流出的流量相关;而如果流量与ssh服务相关,则允许流量 |
block | 拒绝流入的流量,除非与流出的流量相关 |
drop | 拒绝流入的流量,除非与流出的流量相关 |
三:Firewalld防火墙firewall——cmd命令设置
1、获取预定义信息
firewal1-cmd 预定义信息主要包括三种:可用的区域、可用的服务以及可用的 ICMP 阻塞类型,具体的查看命令如下所示。
[root@localhost ~]# firewall-cmd --get-zones
work drop internal external trusted home dmz public block
[root@localhost ~]# firewall-cmd --get-service
RH-Satellite-6 amanda-client amanda-k5-client baculabacula-client cephceph-mondhcp
dhcpv6 dhcpv6-client dnsdocker-registry dropbox-lansyncfreeipa-ldap
... ... //省略部分内容
transmission-clientvdsmvnc-serverwbem-https xmpp-bosh xmpp-client xmpp-local
xmpp-server
[root@localhost ~]# firewall-cmd --get-icmptypes
... ... //省略部分内容
timestamp-request
firewall-cmd --get-icmptypes 命令的执行结果中各种阻塞类型的含义分别如下:
阻塞类型 含义 destination-unreachable 目的地址不可达 echo-reply 应答回应(pong) parameter-problem 参数问题 redirect 重新定向 router-advertisement 路由器通告 router-solicitation 路由器征寻 source-quench 源端抑制 time-exceeded 超时 timestamp-reply 时间戳应答回应 timestamp-request 时间戳请求
2、区域管理
使用firewall-cmd命令可以实现获取和管理区域,为指定区域绑定网络接口等功能。区域管理选项说明如下:
选项 | 说明 |
---|---|
--get-default-zone | 显示网络连接或接口的默认区域 |
--set-default-zone=<zone> | 设置网络连接或接口的默认区域 |
--get-active-zones | 显示已激活的所有区域 |
--get-zone-of-interface=<interface> | 显示指定接口绑定的区域 |
--zone=<zone> --add-interface=<interface> | 为指定接口绑定区域 |
--zone=<zone> --change-interface=<interface> | 为指定的区域更改绑定的网络接口 |
--zone=<zone> --remove-interface=<interface> | 为指定的区域删除绑定的网络接口 |
--list-all-zones | 显示所有区域及其规则 |
[--zone=<zone>] --list-all | 显示所有指定区域的所有规则 |
具体操作如下:
(1)显示当前系统中的默认区域.
[root@localhost ~]# firewall-cmd --get-default-zone
public
(2)显示默认区域的所有规则。
[root@localhost ]# firewall-cmd -list-all
public(active)target: default
icmp-block-inversion:no
interfaces:ens160
sources:
services:dhcpv6-client ssh
ports:
protocols:
masquerade:no
forward-ports:
sourceports:
icmp-blocks:rich rules:
(3)显示网络接口 ens160 对应区域。
[root@localhost ~]# firewall-cmd --get-zone-of-interface=ens160
public
(4)将网络接口 ens160 对应区域更改为 internal 区域,
[root@localhost ~]# firewall-cmd --zone=internal --change-interface=ens160
The interface is under control of NetworkManager, setting zone to 'internal'. success
[root@localhost ~]# firewall-cmd --zone=internal --list-interfaces
ens160
[root@localhost ~]# firewall-cmd --get-zone-of-interface=ens160
internal
(5)显示所有激活区域.
[root@localhost ~]# firewall-cmd--get-active-zones
internal
interfaces:ens160
3、服务管理
为了方便管理,firewalld 预先定义了很多服务,存放在 /usr/lib/firewalld/services/ 目录中,服务通过单个的 XML配置文件来指定。这些配置文件则按以下格式命名:service-name.xml,每个文件对应一项具体的网络服务,如 ssh 服务等。service 配置具有以下优点:
- 通过服务名字来管理规则更加人性化;
- 通过服务来组织端口分组的模式更加高效。如果一个服务使用了若干个网络端口,则服务的配置文件就相当于提供了到这些端口的规则管理的批量操作快捷方式。
下列为firewall-cmd命令区域中服务管理的常用选项:
参数 | 作用 |
---|---|
--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 | 关闭应急状态模式 |
(1)为默认区域设置允许访问的服务。
[root@localhost ~]# firewall-cmd --list-services //显示默认区域内允许访问的所有服务
dhcpv6-clientssh
[root@localhost ~]# firewall-cmd --add-service=http //设置默认区域允许访问 http 服务
success
[root@localhost ~]# firewall-cmd --add-service=https //设置默认区域允许访间 https 服务
success
[root@localhost ~]# firewall-cmd --list-services
dhcpv6-client ssh http https
(2)为 internal 区域设置允许访问的服务,
[root@localhost ~]# firewall-cmd --zone=internal --add-service=mysql //设置 internal 区域允许访问 mysq1 服务
success
[root@localhost~]# firewall-cmd --zone=internal--remove-service=samba-client //设置 internal 区域不允许访问 samba-client 服务
success
[root@localhost ~]# firewall-cmd --zone=internal --list-services //显示 internal 区域内允许访问的所有服务
ssh mdns dhcpv6-client mysql
4、端口管理
在进行服务配置时,预定义的网络服务可以使用服务名配置,服务所涉及的端口就会自动打开。但是,对于非预定义的服务只能手动为指定的区域添加端口。例如,执行以下操作即可实现在 internal 区域打开 443/TCP 端口。
[root@localhost ~]# firewall-cmd --zone=internal--add-port=443/tcp
success
若想实现在 internal 区域禁止 443/TCP 端口访问,可执行以下命令。
root@localhost ~]# firewall-cmd --zone=internal --remove-port=443/tcp
success
5、两种配置模式
前面提到 firewall-cmd 命令工具有两种配置模式:运行时模式表示当前内存中运行的防火墙配置,在系统或 firewalld 服务重启、停止时配置将失效;永久模式表示重启防火墙或重新加载防火墙时的规则配置,是永久存储在配置文件中的。
firewa11-cmd 命令工具与配置模式相关的选项有三个:
- --reload:重新加载防火墙规则并保持状态信息,即将永久配置应用为运行时配置。
- --permanent:带有此选项的命令用于设置永久性规则,这些规则只有在重新启动 firewalld 或重新加载防火墙规则时才会生效:若不带有此选项,表示用于设置运行时规则。
- --runtime-to-permanent:将当前的运行时配置写入规则配置文件中,使之成为永久性配置。