简介
Firewalld
是一种提供了支持网络/防火墙区域(zone)定义网络链接以及接口安全等级的动态防火墙管理工具,它自身并不具备防火墙的功能,而是和iptables
一样需要通过内核的netfilter
来实现,数据包过滤机制(Netfilter
)有两个软件:firewalld
与iptables。
也就是说firewalld和 iptables一样,他们的作用都是用于维护规则,而真正使用规则干活的是内核的netfilter,只不过firewalld和iptables的结构以及使用方法不一样。,firewalld的配置方法大致可以分为图形化和命令行以及编辑配置文件三种。
有关防火墙的分类在这里我们不再进行介绍,大家可以参照iptables基本概念这篇文章。
firewalld架构
firewalld采用两层设计:核心层和顶层的D-Bus层。核心层负责处理配置和后端,如iptables、ip6tables、ebtables、ipset和模块加载器。
firewalld D-Bus 接口:
- D-Bus 是一种消息总线系统,允许应用程序之间进行通信。
- 对于
firewalld
,D-Bus 接口是其主要方式,用于改变和创建防火墙配置。 - 这意味着当您使用如
firewall-cmd
、firewall-config
和firewall-applet
等在线工具时,它们实际上是通过 D-Bus 接口与firewalld
进行通信的。
firewall-cmd, firewall-config, firewall-applet:
- 这些是
firewalld
提供的在线工具,允许用户实时地查看和修改防火墙规则。 - 它们通过 D-Bus 接口与
firewalld
守护进程进行通信。
firewall-offline-cmd:
- 这不是一个常规的
firewalld
工具,但它是一个直接修改firewalld
配置文件的工具。 - 它不使用 D-Bus 接口,而是直接操作
firewalld
的配置文件和核心组件。 - 尽管
firewalld
在运行时可以使用firewall-offline-cmd
,但通常不推荐这样做,因为它只能修改永久配置,并且这些更改在firewalld
重新加载配置之前(大约五秒后)才会生效。
建议:
- 如果正在实时地管理防火墙规则,最好使用
firewall-cmd
或其他通过 D-Bus 与firewalld
通信的工具。 - 如果需要修改永久配置(即重启后仍然有效的配置),可以使用
firewall-cmd
的--permanent
选项,或者编辑firewalld
的配置文件(但通常建议通过命令行工具进行更改,因为这样可以避免手动错误)。 - 除非有特别的需求或理由,否则不建议使用
firewall-offline-cmd
。
firewalld
是一个用于管理Linux系统上的网络防火墙的工具。它允许用户定义防火墙规则来控制进出网络的数据包。firewalld
本身并不依赖于NetworkManager
,但推荐与NetworkManager
一起使用,因为NetworkManager
提供了对网络设备及其状态的管理。
不使用NetworkManager
时的限制:
-
网络设备重命名通知:如果系统没有使用
NetworkManager
,那么当网络设备被重命名时,firewalld
不会得到通知。这可能导致防火墙规则与预期的网络设备不匹配,因为它们仍然引用旧的设备名称。 -
连接和手动创建接口的绑定问题:如果
firewalld
在网络已经启动之后启动,那么现有的网络连接和手动创建的网络接口可能不会被绑定到任何防火墙区域(zone)。防火墙区域是一组具有相同安全要求的网络接口。默认情况下,这些接口可能不会被赋予任何区域,这意味着它们将不会受到任何防火墙规则的保护。
firewalld基本概念
Firewalld 是一个简单、基于状态和区域的防火墙管理工具。它使用策略和区域来组织防火墙规则。网络在逻辑上被划分为不同的区域,区域之间的流量可以通过策略进行管理。
术语
-
基于区域(Zone-based):Firewalld 将网络划分为不同的区域,每个区域可以具有不同的安全级别和访问控制策略。例如,一个区域可能允许所有流量,而另一个区域可能仅允许特定的服务或端口。
-
状态(Stateful):Firewalld 是一个状态防火墙,它跟踪每个会话的状态,并根据会话的状态来允许或拒绝流量。这有助于确保只有已建立的会话才能接收和发送流量,从而提高安全性。
-
策略(Policies):策略定义了如何管理进入和离开某个区域的流量。策略可以包括允许或拒绝特定服务的规则,以及如何处理进入和离开该区域的流量。
-
区域(Zones):区域是 Firewalld 的核心概念之一。每个区域都代表了一个网络区域,例如内部网络、外部网络或公共网络。每个区域都可以配置不同的防火墙规则,以满足不同的安全需求。
当网络流量到达系统时,Firewalld 会根据流量所属的区域来确定如何处理该流量。如果流量被允许进入该区域,那么它可能会进一步根据该区域的策略进行处理。策略定义了允许哪些流量通过以及如何处理该流量。如果流量不符合任何允许规则,那么它将被拒绝。
通过配置不同的区域和策略,可以灵活地控制进出系统的流量,以满足不同的安全需求。例如,可以配置一个内部区域,允许所有内部网络流量通过,并限制外部网络流量。同时,管理员还可以配置一个公共区域,仅允许特定的服务或端口从外部网络访问。

区域(zone)
Firewalld在处理区域时遵循一些严格原则:
-
流量仅进入一个区域(traffic ingresses one and only one zone):
这意味着每个到达系统的网络包都会被分配到一个且仅一个区域。Firewalld根据网络接口的配置或包的源地址来确定包应该进入哪个区域。 -
流量仅从一个区域出去(traffic egresses one and only one zone):
同样地,从系统发出的每个网络包都会被视为来自一个且仅一个区域。这通常是基于网络接口或路由表来确定的。 -
区域定义了信任级别(a zone defines a level of trust):
每个区域代表了一个不同的信任级别。例如,一个“内部”区域可能信任来自该区域的所有流量,而一个“公共”区域可能仅信任一小部分流量。 -
默认允许同区域流量(intra-zone (within the same zone) is allowed by default):
这是原则3的直接后果。由于区域内的流量被视为高度可信的,因此默认情况下,Firewalld允许同区域内的流量通过,无需进一步的规则配置。 -
默认拒绝跨区域流量(inter-zone (zone to zone) is denied by default):
这也是原则3的直接后果。由于Firewalld假设不同区域之间的流量是不可信的,因此默认情况下会拒绝跨区域的流量。但是,管理员可以添加新的策略来允许特定的跨区域流量。
原则4和5的可配置性:
-
原则4的可配置性(via zone option --remove-forward):
在某些情况下,管理员可能想要更改默认行为并阻止同区域内的流量。虽然这不太常见,但可以通过在区域配置中使用--remove-forward
选项来实现。 -
原则5的可配置性(by adding new policies):
默认情况下,跨区域流量是被拒绝的。但是,管理员可以通过添加新的策略来允许特定的跨区域流量。这些策略可以基于各种条件(如源地址、目标地址、端口、协议等)来定义允许或拒绝的流量。
区域 | 区域含义 |
---|---|
drop | 任何传入网络数据包都会被丢弃,没有回复。只有传出的网络连接是可能的。 |
block | 任何传入的网络连接都会被拒绝,对于IPv4会发送 icmp-host-prohibited 消息,对于IPv6则为 icmp6-adm-prohibited。只有在系统内发起的网络连接才是可能的。 |
public | 用于公共区域。你不信任网络上的其他计算机不会损害你的计算机。只有选定的进入连接会被接受。 |
external | 用于外部网络,特别是启用了IPv4伪装(masquerading)的路由器。你不信任网络上的其他计算机不会损害你的计算机。只有选定的进入连接会被接受。 |
dmz | 用于你的非军事化区(Demilitarized Zone,DMZ)中的计算机,这些计算机是公开可访问的,但对你的内部网络访问有限。只有选定的进入连接会被接受。 |
work | 用于工作区域。你大多信任网络上的其他计算机不会损害你的计算机。只有选定的进入连接会被接受。 |
home | 用于家庭区域。你大多信任网络上的其他计算机不会损害你的计算机。只有选定的进入连接会被接受。 |
internal | 用于内部网络。你大多信任网络上的其他计算机不会损害你的计算机。只有选定的进入连接会被接受。 |
trusted | 所有网络连接都会被接受。 |
注意:firewalld的默认区域是public
firewalld区域配置文件
firewalld默认提供了九个zone配置文件:block.xml
、dmz.xml
、drop.xml
、external.xml
、 home.xml
、internal.xml
、public.xml
、trusted.xml
、work.xml
,都保存在/usr/lib/firewalld/zones/
目录下
Firewall Rules
在firewalld
中,策略以有状态(stateful)和单向(unidirectional)的方式应用防火墙规则。这意味着当您为某个区域(zone)定义规则时,通常只需要考虑一个方向的流量,因为firewalld
的有状态过滤会自动处理返回流量。
-
有状态过滤(Stateful Filtering):当流量通过防火墙时,
firewalld
会跟踪该流量的状态。例如,如果一个出站(egress)连接(如一个TCP连接请求)被允许,那么与这个连接相关的所有后续返回流量(如TCP响应)也会被自动允许,而无需定义额外的规则。这大大简化了防火墙规则的配置。 -
区域(Zones):
firewalld
使用区域的概念来组织和管理防火墙规则。每个区域都有一组与之关联的预定义规则,这些规则定义了允许或拒绝哪些类型的流量。 -
入站区域(Ingress Zone):这是流量进入系统的区域,即流量被接收的地方。当流量到达网络接口时,
firewalld
会根据该接口所属的区域来决定如何处理这些流量。 -
出站区域(Egress Zone):这是流量离开系统的区域,即流量被发送的地方。然而,在
firewalld
的上下文中,通常不直接讨论“出站区域”,因为出站流量通常基于源地址(即哪个接口或IP地址发送了流量)和目标地址来应用规则。但概念上,您可以认为每个流量都有一个“出站”的方向,即使firewalld
不直接通过“出站区域”来管理这些规则。
Service
在 /usr/lib/firewalld/services/
目录中,还保存了另外一类配置文件,每个文件对应一项具体的网络服务
