一.firewalld基本概述

1.1 什么是firewalld

firewalld是Linux系统中主流的动态防火墙管理工具,核心作用是定义和管理防火墙规则,真正执行数据包过滤的是Linux内核的netfilter模块,它本身不具备过滤能力,仅负责向netfilter传递规则。与传统iptables相比,它支持动态配置规则且无需重启服务,还通过网络区域实现精细化流量管控,广泛应用于CentOS 7+、EulerOS等主流Linux发行版。

firewalld采用D-Bus接口提供动态可定制的基于主机的防火墙,修改规则时无需重启守护进程,可直接生效,极大提升了配置效率和灵活性。

firewalld和iptables的关系

相同点:都得靠内核里的 netfilter 来实现防火墙效果,作用都是用来维护防火墙规则的

不同点:结构、使用方法不一样

系统提供了图形化的配置工具(firewall-configsystem-config-firewal),还有命令行工具 firewall-cmd

firewall-config:专门配 firewalld 防火墙的图形工具,能直观设置网络区域、开放端口、允许服务(比如 HTTP、SSH)等,改完能实时生效,也能保存成永久设置。

system-config-firewall:比较老的工具,主要给传统 iptables 防火墙用的,功能类似,也是通过界面配置哪些端口能访问、哪些 IP 能连接等,但现在更多被 firewall-config 替代了

firewall-cmd 可以配置 firewalld 的永久或临时规则,它会通过 iptables 工具和内核里的 netfilter 通信来实现数据包筛选

1.2 核心特性

  • 动态规则:修改规则后无需重启服务,不中断现有网络连接,支持热更新。

  • 区域管理(Zone):按信任度划分不同区域,每个区域预设不同访问策略,简化规则管理,是firewalld的核心特性。

  • 两种配置模式:运行时配置(临时生效)和永久配置(持久化生效),满足不同场景需求。

  • 支持服务与端口双重管理:预定义70+常用网络服务,可直接通过服务名配置,也可手动指定端口/协议配置非预定义服务。

  • 高级规则(Rich Rule):优先级高于普通区域规则,可实现更精细的访问控制(如限制特定IP访问)。

1.3 与iptables的核心区别

特性 firewalld iptables
配置存储 /usr/lib/firewalld/、/etc/firewalld/(XML文件) /etc/sysconfig/iptables(单一配置文件)
规则生效 动态修改,无需清除旧规则,不中断现有连接 修改需清除所有旧规则,重新加载新规则
配置模式 运行时配置(临时)、永久配置(持久化) 仅一种配置,修改即生效(重启后丢失需手动保存)
管理方式 区域化管理,支持图形/命令行 规则链管理,仅命令行

注意:同一Linux主机中,firewalld、nftables、iptables不可同时运行,需禁用其他服务避免相互影响。

二、firewalld核心配置(区域与模式)

2.1 区域(Zone)详解

区域是firewalld的核心,将网络流量按源IP、网络接口划分到不同安全等级的区域,每个区域预设不同访问策略。流量匹配区域的顺序为:源地址→网络接口→默认区域,匹配即停止。

2.1.1 常用预定义区域(按信任度从高到低)

区域名称 核心策略 适用场景
trusted(信任区) 允许所有数据包流入流出 内网信任服务器、本地测试环境
home/internal(家庭/内部区) 拒绝入站,允许ssh/mdns等常用内网服务 家庭、企业内网环境
work(工作区) 拒绝入站,允许ssh/ipp等办公服务 办公网络环境
public(公共区) 拒绝入站,仅允许ssh/dhcpv6-client 公网服务器(默认区域)
external(外部区) 拒绝入站,仅允许ssh,支持IP伪装 外网网关服务器
dmz(非军事区) 拒绝入站,仅允许ssh 公网可访问的应用服务器
block(阻塞区) 拒绝所有入站,仅回应icmp拒绝包 需严格限制访问的服务器
drop(丢弃区) 丢弃所有入站,无任何回应 高安全要求服务器,防止端口探测

2.2 两种配置模式

  • 运行时配置(临时配置):不加--permanent参数,修改后立即生效,但firewalld服务或系统重启后失效,适合临时调试规则。

  • 永久配置:加--permanent参数,配置保存在XML文件中,需执行firewall-cmd --reload重载后生效,重启后不丢失,适合生产环境固定规则。

补充:firewall-cmd --runtime-to-permanent可将当前运行时规则同步到永久配置,避免临时规则丢失。

2.3“区域”选项

”服务“子选项卡

可以选择预定义的网络服务(如 HTTP、SSH 等)。当选择某个服务后,该服务对应的默认端口等配置会自动应用,无需手动指定端口,方便快捷地开启对应服务的网络访问权限。

”端口“子选项卡

用于手动指定具体的端口号(如 80、443、22 等)。对于一些没有被预定义为服务的网络应用,或者需要自定义端口的情况,通过这里可以指定允许访问的端口,从而控制特定端口的网络流量

”协议“子选项卡

选择网络通信所使用的协议,常见的有 TCP、UDP 等。不同的网络应用会使用不同的协议,指定协议能更精确地控制网络流量,比如 HTTP 通常使用 TCP 协议,DNS 可能使用 UDP 协议

”源端口”子选项卡

设置允许访问的源端口范围。源端口是发送网络请求的一端所使用的端口,通过指定源端口,可以限制只有从特定端口发起的请求才能访问这台主机,增加了访问控制的粒度

“伪装”子选项卡

“端口转发”子选项卡

“ICMP过滤器”子选项卡

三.Firewalld防火墙 firewalld-cmd命令设置

3.1获取预定义信息

firewall -cmd 预定义信息主要包括三种

  • 可用的区域:就是防火墙划分的不同网络区域(比如公共区、家庭区等),不同区域有不同的防火墙规则。

  • 可用的服务:像 HTTP、SSH 这些网络服务,firewall-cmd 能知道系统里有哪些可以通过防火墙的服务。
  • 可用的 ICMP 阻塞类型:ICMP 是网络里的一种消息协议,这里指能被防火墙阻塞的 ICMP 消息类型(比如 “目标不可达” 这类消息)

① firewall-cmd --get-zones :是用来查看防火墙(firewalld)里预定义的所有区域

②firewall-cmd --get-services :这条命令的作用是:查看防火墙(firewalld)里预定义的所有服务

③firewall-cmd --get-icmptypes 这条命令的作用是:查看防火墙(firewalld)里预定义的所有 ICMP 类型

destination-unreachable:目的地址不可达
echo-reply:应答回答
parameter-problem:参数问题
redirect:重新定向
router-advertisement:路由器通告
router-solicitation:路由器征寻
source-quench:源端抑制
time-exceeded:超时
timestamp-reply:时间戳应回答
timestamp-request:时间戳请求

3.2区域管理

选项说明:

表格

选项 说明
--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 显示所有指定区域的所有规则(--zone 为可选参数,省略则显示所有区域)

3.3服务管理

  • firewalld 为了方便管理,预先定义了很多服务,这些服务的配置文件存在 /usr/lib/firewalld/services/ 目录里
  • 每个服务对应一个 XML 配置文件,文件名是 服务名.xml(比如 ssh 服务的配置文件),文件里记录了服务用的 tcp/udp 端口
  • 每个网络区域都能配置允许访问的服务。要是默认服务不合适或者要自定义服务端口,就把服务配置文件放到 /etc/firewalld/services/ 目录

用服务配置有好处:按照组织端口分组,管理高效

常用选项说明:

参数 作用
--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

关闭应急状况模式

端口管理

  • 要是用的是预定义好的网络服务(比如常见的 HTTP、SSH 这些),直接用服务名配置,对应的端口就会自动开启。
  • 但要是服务不是预定义的,就得手动给特定区域开端口
例如1:
  • 在 internal 区域开启 443/TCP 端口(443 是 HTTPS 常用端口,TCP 是传输协议),就执行 
firewall-cmd --zone=internal --add-port=443/tcp 
看到 success 就说明成功开启了。
例如2:
  • 在 internal 区域禁止 443/TCP 端口的访问,就执行 
firewall-cmd --zone=internal --remove-port=443/tcp 
看到 success 就表示成功禁止了

3.4两种配置模式

  • 运行时模式:配置只在当前内存里生效,要是系统或者 firewalld 服务重启、停止,配置就没了。
  • 永久模式:配置会永久存在配置文件里,重启防火墙或者重新加载防火墙时,规则也会生效。

和配置模式相关的有三个选项:

  • --reload:重新加载防火墙规则,还能保持状态信息,就是把永久配置变成运行时配置。
  • --permanent:带这个选项的命令是设置永久性规则,这些规则得重启 firewalld 或者重新加载防火墙规则才会生效;要是不带这个选项,就是设置运行时规则(重启就失效)。
  • --runtime-to-permanent:把当前运行时的配置写到规则配置文件里,让它变成永久性配置。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐