23.5. 使用和配置 firewalld
防火墙是保护机器不受来自外部的、不需要的网络数据的一种方式。它允许用户通过定义一组防火墙规则 来控制主机上的入站网络流量。这些规则用于对进入的流量进行排序,并可以阻断或允许流量。
firewalld 是一个防火墙服务守护进程,其提供一个带有 D-Bus 接口的、动态可定制的、基于主机的防火墙。如果是动态的,它可在每次修改规则时启用、修改和删除规则,而不需要在每次修改规则时重启防火墙守护进程。
firewalld 使用区和服务的概念来简化流量管理。zones 是预定义的规则集。网络接口和源可以分配给区。允许的流量取决于您计算机连接到的网络,并分配了这个网络的安全级别。防火墙服务是预定义的规则,覆盖了允许特定服务进入流量的所有必要设置,并在区中应用。
服务使用一个或多个端口或地址进行网络通信。防火墙会根据端口过滤通讯。要允许服务的网络流量,必须打开其端口。firewall d 阻止未明确设置为打开的端口上的所有流量。一些区(如可信区)默认允许所有流量。
请注意,带有 nftables 后端的 firewalld 不支持使用 --direct 选项将自定义的 nftables 规则传递到 firewalld。
23.5.1. 使用 firewalld、nftables 或者 iptables 时 复制链接链接已复制到粘贴板!
以下是您应该使用以下工具之一的概述:
-
firewalld:使用firewalld实用程序进行简单防火墙用例。此工具易于使用,并涵盖了这些场景的典型用例。 -
nftables:使用nftables实用程序设置复杂和高性能的防火墙,如为整个网络设置。 -
iptables:Red Hat Enterprise Linux 上的iptables工具使用nf_tables内核 API 而不是传统的后端。Thenf_tablesAPI 提供向后兼容性,因此使用iptables命令的脚本仍可在 Red Hat Enterprise Linux 上工作。对于新的防火墙脚本,红帽建议使用nftables。
要防止不同的与防火墙相关的服务(firewalld、nftables 或 iptables)相互影响,请在 RHEL 主机上仅运行其中一个服务,并禁用其他服务。
23.5.2. 防火墙区域 复制链接链接已复制到粘贴板!
您可以使用 firewalld 工具,根据您与网络中接口和流量的信任级别,将网络划分为不同的区域。连接只能是一个区域的一部分,但您可以对许多网络连接使用这个区域。
firewalld 遵循严格的与区域相关的原则:
- 流量只进入一个区域。
- 流量只流出一个区域。
- 一个区域定义了一个信任级别。
- 默认情况下,允许区域内流量(在同一区域中)。
- 默认情况下,拒绝区域间流量(从区域到区域)。
原则 4 和 5 是原则 3 的结果。
原则 4 可以通过区选项 --remove-forward 进行配置。原则 5 可以通过添加新策略来进行配置。
NetworkManager 通知接口区的 firewalld。您可以使用以下工具将区域分配给接口:
-
NetworkManager -
firewall-config工具 -
firewall-cmd工具 - RHEL web 控制台
RHEL web 控制台、firewall-config 和 firewall-cmd 只能编辑合适的 NetworkManager 配置文件。如果您使用 web 控制台、firewall-cmd 或 firewall-config 更改接口的区域,请求被转发到 NetworkManager,且不会被 firewalld 处理。
/usr/lib/firewalld/zones/ 目录存储预定义的区域,您可以立即将它们应用到任何可用的网络接口。只有在修改后,这些文件才会被拷贝到 /etc/firewalld/zones/ 目录中。预定义区的默认设置如下:
block-
适用于:任何传入的网络连接都会被拒绝,并报
IPv4的 icmp-host-prohibited 消息和IPv6的 icmp6-adm-prohibited 消息 。 - 接受:只从系统内启动的网络连接。
-
适用于:任何传入的网络连接都会被拒绝,并报
dmz- 适用于:DMZ 中的计算机可以公开访问,但对您的内部网络有有限的访问权限。
- 接受:仅所选的传入连接。
drop适用于:所有传入的网络数据包都会丢失,没有任何通知。
- 接受:仅传出的网络连接。
external- 适用于:启用了伪装的外部网络,特别是路由器。不信任网络上其他计算机的情况。
- 接受:仅所选的传入连接。
home- 适用于:您主要信任网络上其他计算机的家庭环境。
- 接受:仅所选的传入连接。
internal- 适用于:您主要信任网络上其他计算机的内部网络。
- 接受:仅所选的传入连接。
public- 适用于:您不信任网络上其他计算机的公共区域。
- 接受:仅所选的传入连接。
trusted- 接受:所有网络连接。
work适用于:您主要信任网络上其他计算机的工作环境。
- 接受:仅所选的传入连接。
这些区中的一个被设置为 default 区。当接口连接被添加到 NetworkManager 中时,它们会被分配到默认区。安装时,firewalld 中的默认区域是 public 区域。您可以更改默认区域。
使网络区域名称自我解释,以帮助用户快速理解它们。
要避免安全问题,请查看默认区配置并根据您的需要和风险禁用任何不必要的服务。
23.5.3. 防火墙策略 复制链接链接已复制到粘贴板!
防火墙策略指定网络所需的安全状态。它们概述了对不同类型的流量所采取的规则和操作。通常,策略包含用于以下类型流量的规则:
- 传入流量
- 传出流量
- 转发流量
- 特定服务和应用程序
- 网络地址转换(NAT)
防火墙策略使用防火墙区域的概念。每个区域都与一组决定允许的流量的特定的防火墙规则关联。策略以有状态、单向的方式应用防火墙规则。这意味着您只考虑流量的一个方向。由于 firewalld 的有状态过滤,流量返回路径被隐式允许。
策略与一个入口区域和一个出口区域关联。入口区域是流量起源的地方(接收)。出口区域是流量离开的地方(发送)。
策略中定义的防火墙规则可以引用防火墙区,以便在多个网络接口之间应用一致的配置。
23.5.4. 防火墙规则 复制链接链接已复制到粘贴板!
您可以使用防火墙规则实现特定的配置,以允许或阻止网络流量。因此,您可以控制网络流量的流,以防止系统受到安全威胁。
防火墙规则通常根据各种属性定义某些条件。属性可以是如下:
- 源 IP 地址
- 目标 IP 地址
- 传输协议(TCP、UDP、…)
- 端口
- 网络接口
firewalld 工具将防火墙规则组织到区域(如public、internal 等)和策略中。每个区域都有自己的一组规则,其决定与特定区域关联的网络接口的流量自由度的级别。
23.5.5. 防火墙直接规则 复制链接链接已复制到粘贴板!
firewalld 服务提供多种配置规则的方法,包括:
- 常规规则
- 直接规则
这两者的一个区别在于,每个方法与底层后端(iptables 或 nftables)交互的方式。
直接规则是高级低级别规则,允许直接与 iptables 交互。它们绕过 firewalld 的结构化管理,为您提供更多控制。您可以使用原始 iptables 语法使用 firewall-cmd 命令手动定义直接规则。例如,firewall-cmd --direct --add-rule ipv4 filter INPUT 0 -s 198.51.100.1 -j DROP。此命令添加了一个 iptables 规则来丢弃来自 198.51.100.1 源 IP 地址的流量。
但是,使用直接规则也具有其缺点。特别是当 nftables 是您的主要防火墙后端时。例如:
-
直接规则很难维护,并可能会与基于
nftables的firewalld配置冲突。 -
直接规则不支持您可以在
nftables中找到的高级功能,如原始表达式和有状态对象。 -
直接规则不永不。
iptables组件已弃用,最终将从 RHEL 中删除。
因此,您可以考虑使用 nftables 替换 firewalld 直接规则。查看知识库解决方案 如何将 firewalld 直接规则替换为 nftables? 以查看更多详情。
23.5.6. 预定义的 firewalld 服务 复制链接链接已复制到粘贴板!
预定义的 firewalld 服务在低级防火墙规则中提供内置抽象层。它通过将常用的网络服务(如 SSH 或 HTTP)映射到其相应的端口和协议来实现。您可以引用指定预定义服务,而不是每次手动指定它们。这使得防火墙管理变得更加简单、更易出错且更直观。
查看可用的预定义服务:
# firewall-cmd --get-services RH-Satellite-6 RH-Satellite-6-capsule afp amanda-client amanda-k5-client amqp amqps apcupsd audit ausweisapp2 bacula bacula-client bareos-director bareos-filedaemon bareos-storage bb bgp bitcoin bitcoin-rpc bitcoin-testnet bitcoin-testnet-rpc bittorrent-lsd ceph ceph-exporter ceph-mon cfengine checkmk-agent cockpit collectd condor-collector cratedb ctdb dds...要进一步检查特定的预定义服务:
# sudo firewall-cmd --info-service=RH-Satellite-6 RH-Satellite-6 ports: 5000/tcp 5646-5647/tcp 5671/tcp 8000/tcp 8080/tcp 9090/tcp protocols: source-ports: modules: destination: includes: foreman helpers:示例输出显示
RH-Satellite-6预定义服务侦听端口 5000/tcp 5646-5647/tcp 5671/tcp 8000/tcp 8080/tcp 9090/tcp 9090/tcp 9090。另外,RH-Satellite-6继承了其他预定义服务中的规则。本例中为foreman。
每个预定义的服务都作为 XML 文件存储在 /usr/lib/firewalld/services/ 目录中。
23.5.7. 使用 firewalld 区 复制链接链接已复制到粘贴板!
zones 代表一种更透明管理传入流量的概念。这些区域连接到联网接口或者分配一系列源地址。您可以独立为每个区管理防火墙规则,这样就可以定义复杂的防火墙设置并将其应用到流量。
23.5.7.1. 自定义特定区域的防火墙设置,以增强安全性 复制链接链接已复制到粘贴板!
您可以通过修改防火墙设置并将特定的网络接口或连接与特定的防火墙区域关联,来增强网络安全性。通过为区域定义细粒度规则和限制,您可以根据想要的安全级别控制入站和出站流量。
例如,您可以获得以下好处:
- 保护敏感数据
- 防止未授权访问
- 缓解潜在的网络威胁
先决条件
-
firewalld服务在运行。
流程
列出可用的防火墙区域:
# firewall-cmd --get-zonesfirewall-cmd --get-zones命令显示系统上所有可用的区,但不显示特定区的详情。要查看所有区域的详情,请使用firewall-cmd --list-all-zones命令。- 选择您要用于此配置的区域。
修改所选区域的防火墙设置。例如,要允许
SSH服务,并删除ftp服务:# firewall-cmd --add-service=ssh --zone=<your_chosen_zone> # firewall-cmd --remove-service=ftp --zone=<same_chosen_zone>将一个网络接口分配给防火墙区域:
列出可用的网络接口:
# firewall-cmd --get-active-zones区域的活动是由存在的网络接口或与其配置匹配的源地址范围确定的。默认区域对于未分类的流量处于活跃状态,但如果没有流量匹配其规则,则始终处于活跃状态。
将一个网络接口分配给所选区域:
# firewall-cmd --zone=<your_chosen_zone> --change-interface=<interface_name> --permanent将一个网络接口分配给一个区域更适合将一致的防火墙设置应用到特定接口(物理或虚拟)上的所有流量。
当
firewall-cmd命令与--permanent选项一起使用时,通常涉及更新 NetworkManager 连接配置文件,以永久更改防火墙配置。firewalld和 NetworkManager 之间的这种集成确保一致的网络和防火墙设置。
验证
显示选择区域的更新设置:
# firewall-cmd --zone=<your_chosen_zone> --list-all命令输出显示所有区域设置,包括分配的服务、网络接口和网络连接(源)。
23.5.7.2. 更改默认区 复制链接链接已复制到粘贴板!
系统管理员在其配置文件中为网络接口分配区域。如果接口没有被分配给指定区,它将被分配给默认区。每次重启 firewalld 服务后,firewalld 会加载默认区的设置,并使其处于活动状态。请注意,所有其他区域的设置都被保留,并随时可以使用。
通常,NetworkManager 根据 NetworkManager 连接配置文件中的 connection.zone 设置将区域分配给接口。另外,重启后, NetworkManager 管理“激活”这些区域的分配。
先决条件
-
firewalld服务在运行。
流程
设置默认区:
显示当前的默认区:
# firewall-cmd --get-default-zone设置新的默认区:
# firewall-cmd --set-default-zone <zone_name>注意按照此流程,设置是一个永久设置,即使没有
--permanent选项。
23.5.7.3. 将网络接口分配给区 复制链接链接已复制到粘贴板!
可以为不同区定义不同的规则集,然后通过更改所使用的接口的区来快速改变设置。使用多个接口,可以为每个具体区设置一个区来区分通过它们的网络流量。
流程
要将区分配给特定的接口:
列出活跃区以及分配给它们的接口:
# firewall-cmd --get-active-zones为不同的区分配接口:
# firewall-cmd --zone=zone_name --change-interface=interface_name --permanent
23.5.7.4. 添加源 复制链接链接已复制到粘贴板!
要将传入的流量路由到特定区,请将源添加到那个区。源可以是一个使用 CIDR 格式的 IP 地址或 IP 掩码。
如果您添加多个带有重叠网络范围的区域,则根据区名称排序,且只考虑第一个区。
在当前区中设置源:
# firewall-cmd --add-source=<source>要为特定区设置源 IP 地址:
# firewall-cmd --zone=zone-name --add-source=<source>
以下流程允许来自 受信任 区中 192.168.2.15 的所有传入的流量:
流程
列出所有可用区:
# firewall-cmd --get-zones将源 IP 添加到持久性模式的信任区中:
# firewall-cmd --zone=trusted --add-source=192.168.2.15使新设置具有持久性:
# firewall-cmd --runtime-to-permanent
23.5.7.5. 删除源 复制链接链接已复制到粘贴板!
当您从区域删除源时,源自源的流量不再被通过该源指定的规则定向。相反,流量会返回到与它源自的接口关联的区域的规则和设置,或进到默认区域。
流程
列出所需区的允许源:
# firewall-cmd --zone=zone-name --list-sources从区永久删除源:
# firewall-cmd --zone=zone-name --remove-source=<source>使新设置具有持久性:
# firewall-cmd --runtime-to-permanent
23.5.7.6. 使用 nmcli 为连接分配区域 复制链接链接已复制到粘贴板!
您可以使用 nmcli 工具将 firewalld 区域添加到 NetworkManager 连接。
流程
将区分配给
NetworkManager连接配置文件:# nmcli connection modify profile connection.zone zone_name激活连接:
# nmcli connection up profile
23.5.7.7. 在 ifcfg 文件中手动将区分配给网络连接 复制链接链接已复制到粘贴板!
当连接由 NetworkManager 管理时,必须了解它使用的区。对于每个网络连接配置文件,可以指定一个区域,其根据带有可移植设备的计算机的位置提供各种防火墙设置的灵活性。因此,可以为不同的位置(如公司或家)指定区域和设置。
流程
要为连接设置一个区,请编辑
/etc/sysconfig/network-scripts/ifcfg-connection_name文件,并添加将区分配给这个连接的行:ZONE=zone_name
23.5.7.8. 创建一个新区 复制链接链接已复制到粘贴板!
要使用自定义区,创建一个新的区并使用它像预定义区一样。新区需要 --permanent 选项,否则命令无法工作。
先决条件
-
firewalld服务在运行。
流程
创建一个新区:
# firewall-cmd --permanent --new-zone=zone-name使新区域可用:
# firewall-cmd --reload命令将最新的更改应用到防火墙配置,而不中断已在运行的网络服务。
验证
检查是否在您的永久设置中添加了新的区:
# firewall-cmd --get-zones --permanent
23.5.7.9. 使用 Web 控制台启用区域 复制链接链接已复制到粘贴板!
您可以通过 RHEL web 控制台对特定接口或 IP 地址范围应用预定义和现有的防火墙区域。
先决条件
- 已安装 RHEL 8 web 控制台。
- 您已启用了 cockpit 服务。
您的用户帐户被允许登录到 web 控制台。
具体步骤请参阅安装并启用 Web 控制台。
流程
登录到 RHEL 8 web 控制台。
详情请参阅 登录到 web 控制台。
- 点 Networking。
点按钮。
如果没有看到 按钮,使用管理员权限登录到 web 控制台。
- 在 Firewall 部分,点 Add new zone。
在 Add zone 对话框中,从信任级别选项选择一个区。
Web 控制台显示
firewalld服务中预定义的所有区域。- 在接口部分,选择一个应用所选区的接口或接口。
在 Allowed Addresses 部分中,您可以选择是否应用该区:
- 整个子网
或者以以下格式表示的 IP 地址范围:
- 192.168.1.0
- 192.168.1.0/24
- 192.168.1.0/24, 192.168.1.0
点 按钮。
验证
检查 Firewall 部分中的配置:
23.5.7.10. 使用 Web 控制台禁用区域 复制链接链接已复制到粘贴板!
您可以使用 Web 控制台在防火墙配置中禁用防火墙区域。
先决条件
- 已安装 RHEL 8 web 控制台。
- 您已启用了 cockpit 服务。
您的用户帐户被允许登录到 web 控制台。
具体步骤请参阅安装并启用 Web 控制台。
流程
登录到 RHEL 8 web 控制台。
详情请参阅 登录到 web 控制台。
- 点 Networking。
点按钮。
如果没有看到 按钮,使用管理员权限登录到 web 控制台。
点您要删除的区的 Options 图标。
- 单击 Delete。
区域现在被禁用,接口不包括在区域中配置的打开的服务和端口。
23.5.7.11. 使用区目标设定传入流量的默认行为 复制链接链接已复制到粘贴板!
对于每个区,您可以设置一种处理尚未进一步指定的传入流量的默认行为。此行为是通过设置区的目标来定义的。有四个选项:
-
ACCEPT:接受除特定规则不允许的所有传入的数据包。 -
REJECT:拒绝所有传入的数据包,但特定规则允许的数据包除外。当firewalld拒绝数据包时,源机器会发出有关拒绝的信息。 -
DROP:除非由特定规则允许,丢弃所有传入数据包。当firewalld丢弃数据包时,源机器不知道数据包丢弃的信息。 -
default:与REJECT的行为类似,但在某些情况下有特殊含义。
先决条件
-
firewalld服务在运行。
流程
为区设置目标:
列出特定区的信息以查看默认目标:
# firewall-cmd --zone=zone-name --list-all在区中设置一个新目标:
# firewall-cmd --permanent --zone=zone-name --set-target=<default|ACCEPT|REJECT|DROP>
23.5.7.12. 使用 IP 集为允许列表配置动态更新 复制链接链接已复制到粘贴板!
您可以进行接近实时的更新,来灵活地允许 IP 集中特定的 IP 地址或范围,即使在无法预计的情况下也是如此。这些更新可以被各种事件触发,如检测安全威胁或更改网络行为。通常,此类解决方案利用自动化来减少手工工作,并通过快速响应情况来提高安全性。
先决条件
-
firewalld服务在运行。
流程
创建一个有有意义名称的 IP 集:
# firewall-cmd --permanent --new-ipset=allowlist --type=hash:ip名为
allowlist的新 IP 集包含您希望防火墙允许的 IP 地址。向 IP 集添加动态更新:
# firewall-cmd --permanent --ipset=allowlist --add-entry=198.51.100.10此配置使用新添加的 IP 地址更新防火墙允许传输网络流量的
allowlistIP 集。创建一个引用之前创建的 IP 集的防火墙规则:
# firewall-cmd --permanent --zone=public --add-source=ipset:allowlist没有此规则,IP 集不会对网络流量有任何影响。默认防火墙策略将占先。
重新载入防火墙配置以应用更改:
# firewall-cmd --reload
验证
列出所有 IP 集:
# firewall-cmd --get-ipsets allowlist列出活跃的规则:
# firewall-cmd --list-all public (active) target: default icmp-block-inversion: no interfaces: enp0s1 sources: ipset:allowlist services: cockpit dhcpv6-client ssh ports: protocols: ...命令行输出的
sources部分提供了对哪些流量源(主机名、接口、IP 集、子网等)被允许或拒绝访问特定防火墙区域的见解。在这种情况下,包含在allowlistIP 集中的 IP 地址被允许通过防火墙,为public区域传输流量。探索 IP 集的内容:
# cat /etc/firewalld/ipsets/allowlist.xml <?xml version="1.0" encoding="utf-8"?> <ipset type="hash:ip"> <entry>198.51.100.10</entry> </ipset>
后续步骤
-
使用脚本或安全工具获取您的威胁情报源,并以一种自动化的方式更新
allowlist。
23.5.8. 使用 firewalld 控制网络流量 复制链接链接已复制到粘贴板!
firewalld 软件包安装了大量预定义的服务文件,您可以添加更多或自定义它们。然后,您可以使用这些服务定义为服务打开或关闭端口,而无需了解协议及它们使用的端口号。
23.5.8.1. 使用 CLI 控制预定义服务的流量 复制链接链接已复制到粘贴板!
控制流量的最简单的方法是在 firewalld 中添加预定义的服务。这会打开所有必需的端口并根据 服务定义文件 修改其他设置。
先决条件
-
firewalld服务在运行。
流程
检查
firewalld中的服务是否没有被允许:# firewall-cmd --list-services ssh dhcpv6-client命令列出默认区域中启用的服务。
列出
firewalld中所有预定义的服务:# firewall-cmd --get-services RH-Satellite-6 amanda-client amanda-k5-client bacula bacula-client bitcoin bitcoin-rpc bitcoin-testnet bitcoin-testnet-rpc ceph ceph-mon cfengine condor-collector ctdb dhcp dhcpv6 dhcpv6-client dns docker-registry ...命令显示默认区域的可用服务的列表。
将服务添加到
firewalld允许的服务的列表中:# firewall-cmd --add-service=<service_name>命令将指定的服务添加到默认区域中。
使新设置具有持久性:
# firewall-cmd --runtime-to-permanent命令将这些运行时更改应用到防火墙的永久配置中。默认情况下,它将这些更改应用到默认区域的配置中。
验证
列出所有永久防火墙规则:
# firewall-cmd --list-all --permanent public target: default icmp-block-inversion: no interfaces: sources: services: cockpit dhcpv6-client ssh ports: protocols: forward: no masquerade: no forward-ports: source-ports: icmp-blocks: rich rules:命令显示带有默认防火墙区域(
public)的永久防火墙规则的完整配置。检查
firewalld服务的永久配置的有效性。# firewall-cmd --check-config success如果永久配置无效,命令返回一个带有更多详情的错误:
# firewall-cmd --check-config Error: INVALID_PROTOCOL: 'public.xml': 'tcpx' not from {'tcp'|'udp'|'sctp'|'dccp'}您还可以手动检查永久配置文件,以验证设置。主配置文件为
/etc/firewalld/firewalld.conf。特定于区域的配置文件位于/etc/firewalld/zones/目录中,策略位于/etc/firewalld/policies/目录中。
23.5.8.2. 使用 Web 控制台在防火墙上启用服务 复制链接链接已复制到粘贴板!
默认情况下,服务添加到默认防火墙区。如果在更多网络接口中使用更多防火墙区,您必须首先选择一个区域,然后添加带有端口的服务。
RHEL 8 web 控制台显示预定义的 firewalld 服务,您可以将其添加到活跃的防火墙区。
RHEL 8 web 控制台配置 firewalld 服务。
Web 控制台不允许没有在 web 控制台中列出的通用 firewalld 规则。
先决条件
- 已安装 RHEL 8 web 控制台。
- 您已启用了 cockpit 服务。
您的用户帐户被允许登录到 web 控制台。
具体步骤请参阅安装并启用 Web 控制台。
流程
登录到 RHEL 8 web 控制台。
详情请参阅 登录到 web 控制台。
- 点 Networking。
点按钮。
如果没有看到 按钮,使用管理员权限登录到 web 控制台。
在 Firewall 部分,选择要添加该服务的区,然后点击 Add Services。
- 在 Add Services 对话框中,找到您要在防火墙中启用的服务。
根据您的场景启用服务:
- 点 Add Services。
此时,RHEL 8 web 控制台在区域的服务列表中显示该服务。
23.5.8.3. 使用 Web 控制台配置自定义端口 复制链接链接已复制到粘贴板!
您可以通过 RHEL web 控制台为服务配置自定义端口。
先决条件
- 您已安装了 RHEL 8 web 控制台。
- 您已启用了 cockpit 服务。
您的用户帐户被允许登录到 web 控制台。
具体步骤请参阅安装并启用 Web 控制台。
-
firewalld服务在运行。
流程
登录到 RHEL 8 web 控制台。
详情请参阅 登录到 web 控制台。
- 点 Networking。
点按钮。
如果没有看到 按钮,使用管理员权限登录到 web 控制台。
在 Firewall 部分,选择要配置自定义端口的区域,并点 Add Services。
- 在 Add services 对话框中,点 单选按钮。
在 TCP 和 UDP 字段中,根据示例添加端口。您可以使用以下格式添加端口:
- 端口号,如 22
- 端口号范围,如 5900-5910
- 别名,比如 nfs, rsync
注意您可以在每个字段中添加多个值。值必须用逗号分开,且没有空格,例如:8080,8081,http
在 TCP 文件、UDP 文件或两者中添加端口号后,在 Name 字段中验证服务名称。
Name 字段显示保留此端口的服务名称。如果您确定这个端口可用,且不需要在该端口上通信,则可以重写名称。
- 在 Name 字段中,为服务添加一个名称,包括定义的端口。
点 按钮。
要验证设置,请进入防火墙页面,并在区域的服务列表中找到该服务。
23.5.9. 在区域间过滤转发的流量 复制链接链接已复制到粘贴板!
firewalld 可让您控制不同 firewalld 区域之间的网络数据流。通过定义规则和策略,您可以管理流量在这些区域之间移动时是如何被允许或被拒绝的。
策略对象功能在 firewalld 中提供转发和输出过滤。您可以使用 firewalld 过滤不同区域之间的流量,以允许访问本地托管的虚拟机来连接主机。
23.5.9.1. 策略对象和区域之间的关系 复制链接链接已复制到粘贴板!
策略对象允许用户将 firewalld 的原语(如服务、端口和富规则)附加到策略。您可以将策略对象应用到以有状态和单向的方式在区域间传输的流量上。
# firewall-cmd --permanent --new-policy myOutputPolicy
# firewall-cmd --permanent --policy myOutputPolicy --add-ingress-zone HOST
# firewall-cmd --permanent --policy myOutputPolicy --add-egress-zone ANY
HOST 和 ANY 是 ingress 和 egress 区域列表中使用的符号区域。
-
HOST符号区域对于来自运行 firewalld 的主机的流量,或具有到运行 firewalld 的主机的流量允许策略。 -
ANY符号区对所有当前和将来的区域应用策略。ANY符号区域充当所有区域的通配符。
23.5.9.2. 使用优先级对策略进行排序 复制链接链接已复制到粘贴板!
多个策略可以应用到同一组流量,因此应使用优先级为可能应用的策略创建优先级顺序。
要设置优先级来对策略进行排序:
# firewall-cmd --permanent --policy mypolicy --set-priority -500
在上例中,-500 是较低的优先级值,但具有较高的优先级。因此,-500 将在 -100 之前执行。
较低数字的优先级值具有较高的优先级,被首先应用。
23.5.9.3. 使用策略对象过滤本地托管的容器和物理连接到主机的网络之间的流量 复制链接链接已复制到粘贴板!
策略对象功能允许用户过滤 Podman 和 firewalld 区域之间的流量。
红帽建议默认阻止所有流量,并打开 Podman 工具所需的可选择的服务。
流程
创建一个新的防火墙策略:
# firewall-cmd --permanent --new-policy podmanToAny阻止从 Podman 到其它区域的所有流量,并只允许 Podman 上必要的服务:
# firewall-cmd --permanent --policy podmanToAny --set-target REJECT # firewall-cmd --permanent --policy podmanToAny --add-service dhcp # firewall-cmd --permanent --policy podmanToAny --add-service dns # firewall-cmd --permanent --policy podmanToAny --add-service https创建一个新的 Podman 区域:
# firewall-cmd --permanent --new-zone=podman为策略定义 ingress 区域:
# firewall-cmd --permanent --policy podmanToHost --add-ingress-zone podman为所有其他区域定义 egress 区域:
# firewall-cmd --permanent --policy podmanToHost --add-egress-zone ANY将 egress 区域设置为 ANY 意味着您可以从 Podman 过滤到其他区域。如果要过滤到主机,请将 egress 区域设置为 HOST。
重启 firewalld 服务:
# systemctl restart firewalld
验证
验证到其他区域的 Podman 防火墙策略:
# firewall-cmd --info-policy podmanToAny podmanToAny (active) ... target: REJECT ingress-zones: podman egress-zones: ANY services: dhcp dns https ...
23.5.9.4. 设置策略对象的默认目标 复制链接链接已复制到粘贴板!
您可以为策略指定 --set-target 选项。可用的目标如下:
-
ACCEPT- 接受数据包 -
DROP- 丢弃不需要的数据包 -
REJECT- 拒绝不需要的数据包,并带有 ICMP 回复 CONTINUE(默认)- 数据包将遵循以下策略和区域中的规则。# firewall-cmd --permanent --policy mypolicy --set-target CONTINUE
验证
验证有关策略的信息
# firewall-cmd --info-policy mypolicy
23.5.10. 使用 firewalld 配置 NAT 复制链接链接已复制到粘贴板!
使用 firewalld,您可以配置以下网络地址转换(NAT)类型:
- 伪装
- 目标 NAT(DNAT)
- 重定向
23.5.10.1. 网络地址转换类型 复制链接链接已复制到粘贴板!
这些是不同的网络地址转换(NAT)类型:
- 伪装
使用以上 NAT 类型之一更改数据包的源 IP 地址。例如,互联网服务提供商(ISP)不会路由私有 IP 范围,如
10.0.0.0/8。如果您在网络中使用私有 IP 范围,用户应该能够访问互联网上的服务器,请将来自这些范围的数据包的源 IP 地址映射为公共 IP 地址。伪装自动使用传出接口的 IP 地址。因此,如果传出接口使用了动态 IP 地址,则使用伪装。
- 目标 NAT(DNAT)
- 使用此 NAT 类型重写传入数据包的目标地址和端口。例如,如果您的 Web 服务器使用来自私有 IP 范围的 IP 地址,因此无法直接从互联网访问,您可以在路由器上设置 DNAT 规则,来将传入的流量重定向到此服务器。
- 重定向
- 这个类型是 DNAT 的一种特殊情况,其将数据包重定向到本地计算机上的不同端口。例如,如果服务运行在与其标准端口不同的端口上,您可以将传入的流量从标准端口重定向到此特定端口。
23.5.10.2. 配置 IP 地址伪装 复制链接链接已复制到粘贴板!
您可以在系统上启用 IP 伪装。在访问互联网时,IP 伪装会隐藏网关后面的单个机器。
流程
要检查是否启用了 IP 伪装(例如,对于
external区),以root用户身份输入以下命令:# firewall-cmd --zone=external --query-masquerade如果已启用,命令将会打印
yes,且退出状态为0。否则,将打印no,且退出状态为1。如果省略了zone,则将使用默认区。要启用 IP 伪装,请以
root用户身份输入以下命令:# firewall-cmd --zone=external --add-masquerade-
要使此设置持久,请将
--permanent选项传给命令。 要禁用 IP 伪装,请以
root身份输入以下命令:# firewall-cmd --zone=external --remove-masquerade要使此设置永久生效,请将
--permanent选项传给命令。
23.5.10.3. 使用 DNAT 转发传入的 HTTP 流量 复制链接链接已复制到粘贴板!
您可以使用目标网络地址转换(DNAT)将传入的流量从一个目标地址和端口定向到另一个目标地址和端口。通常,这对于将来自外部网络接口的传入请求重定向到特定的内部服务器或服务非常有用。
先决条件
-
firewalld服务在运行。
流程
转发传入的 HTTP 流量:
# firewall-cmd --zone=public --add-forward-port=port=80:proto=tcp:toaddr=198.51.100.10:toport=8080 --permanent之前的命令使用以下设置定义 DNAT 规则:
-
--zone=public- 您为其配置 DNAT 规则的防火墙区域。您可以将其调整到您需要的任何区域。 -
--add-forward-port- 指示您正在添加端口转发规则的选项。 -
port=80- 外部目标端口。 -
proto=tcp- 表示您转发 TCP 流量的协议。 -
toaddr=198.51.100.10- 目标 IP 地址。 -
toport=8080- 内部服务器的目标端口。 -
--permanent- 使 DNAT 规则在重启后保持不变的选项。
-
重新载入防火墙配置以应用更改:
# firewall-cmd --reload
验证
验证您使用的用于防火墙区域的 DNAT 规则:
# firewall-cmd --list-forward-ports --zone=public port=80:proto=tcp:toport=8080:toaddr=198.51.100.10或者,查看相应的 XML 配置文件:
# cat /etc/firewalld/zones/public.xml <?xml version="1.0" encoding="utf-8"?> <zone> <short>Public</short> <description>For use in public areas. You do not trust the other computers on networks to not harm your computer. Only selected incoming connections are accepted.</description> <service name="ssh"/> <service name="dhcpv6-client"/> <service name="cockpit"/> <forward-port port="80" protocol="tcp" to-port="8080" to-addr="198.51.100.10"/> <forward/> </zone>
23.5.10.4. 将来自非标准端口的流量重定向,以使 Web 服务在标准端口上可访问 复制链接链接已复制到粘贴板!
您可以使用重定向机制使在非标准端口上内部运行的 Web 服务可访问,而无需用户在 URL 中指定端口。因此,URL 更简单,并提供更好的浏览体验,而非标准端口仍在内部或用于特定的要求。
先决条件
-
firewalld服务在运行。
流程
创建 NAT 重定向规则:
# firewall-cmd --zone=public --add-forward-port=port=<standard_port>:proto=tcp:toport=<non_standard_port> --permanent之前的命令使用以下设置定义 NAT 重定向规则:
-
--zone=public- 您为其配置规则的防火墙区域。您可以将其调整到您需要的任何区域。 -
--add-forward-port=port=<non_standard_port>- 指示您正在使用最初接收传入流量的源端口添加端口转发(重定向)规则。 -
proto=tcp- 表示您重定向 TCP 流量的协议。 -
toport=<standard_port>- 目标端口,在源端口上收到传入流量后,应将其重定向到的端口。 -
--permanent- 使规则在重启后保持不变的选项。
-
重新载入防火墙配置以应用更改:
# firewall-cmd --reload
验证
验证您使用的防火墙区域的重定向规则:
# firewall-cmd --list-forward-ports port=8080:proto=tcp:toport=80:toaddr=或者,查看相应的 XML 配置文件:
# cat /etc/firewalld/zones/public.xml <?xml version="1.0" encoding="utf-8"?> <zone> <short>Public</short> <description>For use in public areas. You do not trust the other computers on networks to not harm your computer. Only selected incoming connections are accepted.</description> <service name="ssh"/> <service name="dhcpv6-client"/> <service name="cockpit"/> <forward-port port="8080" protocol="tcp" to-port="80"/> <forward/> </zone>
23.5.11. 丰富规则的优先级 复制链接链接已复制到粘贴板!
富规则提供了一种更高级且更灵活的方法来定义防火墙规则。富规则特别有用,其中服务、端口等服务不足以表达复杂的防火墙规则。
富规则背后的概念:
- 粒度和灵活性
- 您可以根据更为具体的标准为网络流量定义详细条件。
- 规则结构
富规则由家族(IPv4 或 IPv6)组成,后跟条件和操作。
rule family="ipv4|ipv6" [conditions] [actions]- conditions
- 它们允许富规则仅在符合特定条件时才适用。
- 操作
- 您可以定义与条件匹配的网络流量发生的情况。
- 组合多个条件
- 您可以创建更为具体的和复杂的过滤。
- 分层控制和可重复利用
- 您可以将丰富的规则与其他防火墙机制(如区域或服务)相结合。
默认情况下,富规则是根据其规则操作进行组织的。例如,deny 规则优先于 allow 规则。富规则中的 priority 参数可让管理员对富规则及其执行顺序进行精细的控制。在使用 priority 参数时,规则首先按其优先级值以升序排序。当更多的规则有同样的 优先级 时,其顺序是由规则行动决定的,如果行动也相同,则顺序可以是未定义。
23.5.11.1. priority 参数如何将规则组织到不同的链 复制链接链接已复制到粘贴板!
您可以在富规则中将 priority 参数设置为 -32768 和 32767 之间的任意数,较低的数值具有较高的优先级。
firewalld 服务根据优先级值将规则组织到不同的链中:
-
优先级低于 0:规则被重定向到带有
_pre后缀的链中。 -
优先级高于 0:规则被重定向到带有
_post后缀的链中。 -
优先级等于 0:根据操作,规则会被重定向到带有
_log、_deny或_allow操作的链中。
在这些子链中,firewalld 根据其优先级值对规则进行排序。
23.5.11.2. 设置丰富的规则的优先级 复制链接链接已复制到粘贴板!
以下是如何创建一条富规则的示例,该规则使用 priority 参数来记录其他规则不允许或拒绝的所有流量。您可以使用此规则标记意非预期的流量。
流程
添加一个带有非常低优先级的丰富规则来记录未由其他规则匹配的所有流量:
# firewall-cmd --add-rich-rule='rule priority=32767 log prefix="UNEXPECTED: " limit value="5/m"'这个命令还将日志条目数量限制为每分钟
5条。
验证
显示命令在上一步中创建的
nftables规则:# nft list chain inet firewalld filter_IN_public_post table inet firewalld { chain filter_IN_public_post { log prefix "UNEXPECTED: " limit rate 5/minute } }
23.5.12. 启用 firewalld 区域中不同接口或源之间的流量转发 复制链接链接已复制到粘贴板!
区内转发是 firewalld 的一种功能,它允许 firewalld 区域内接口或源之间的流量转发。
23.5.12.1. 区内转发与默认目标设置为 ACCEPT 的区域之间的区别 复制链接链接已复制到粘贴板!
启用区域内转发后,单个 firewalld 区域中的流量可以从一个接口或源流到另一个接口或源。区指定接口和源的信任级别。如果信任级别相同,流量会保持在同一区域内。
在 firewalld 的默认区域中启用区域内转发仅适用于添加到当前默认区域的接口和源。
firewalld 使用不同的区域管理传入和传出流量。每个区域都有自己的一组规则和行为。例如,trusted 区域默认允许所有转发的流量。
其他区域可以有不同的默认行为。在标准区域中,当区域的目标被设置为 default 时,转发的流量通常默认被丢弃。
要控制流量如何在区域内的不同接口或源之间转发,请确保您理解并相应地配置了区域的目标。
23.5.12.2. 使用区内转发来在以太网和 Wi-Fi 网络间转发流量 复制链接链接已复制到粘贴板!
您可以使用区内转发来在同一 firewalld 区内的接口和源之间转发流量。此功能带来以下好处:
-
有线设备和无线设备间的无缝连接(您可以在连接到
enp1s0的以太网网络和连接到wlp0s20的 Wi-Fi 网络之间转发流量) - 支持灵活的工作环境
- 可被网络中的多个设备或用户访问和使用的共享资源(如打印机、数据库、网络连接的存储等)
- 高效的内部网络(如顺畅通信、减少的延迟、资源可访问性等)
您可以为单个 firewalld 区域启用此功能。
流程
在内核中启用数据包转发:
# echo "net.ipv4.ip_forward=1" > /etc/sysctl.d/95-IPv4-forwarding.conf # sysctl -p /etc/sysctl.d/95-IPv4-forwarding.conf确保您要在其间启用区域内转发的接口只分配到
internal区域:# firewall-cmd --get-active-zones如果接口当前被分配给了不是
internal的区,请重新分配它:# firewall-cmd --zone=internal --change-interface=interface_name --permanent将
enp1s0和wlp0s20接口添加到internal区:# firewall-cmd --zone=internal --add-interface=enp1s0 --add-interface=wlp0s20启用区域内部转发:
# firewall-cmd --zone=internal --add-forward
验证
以下验证要求 nmap-ncat 软件包已安装在两个主机上。
-
登录到与您启用了区域转发的主机的
enp1s0接口位于同一网络的主机。 使用
ncat启动 echo 服务来测试连接:# ncat -e /usr/bin/cat -l 12345-
登录到与
wlp0s20接口在同一网络的主机。 连接到在与
enp1s0在同一网络的主机上运行的 echo 服务器:# ncat <other_host> 12345- 输入一些内容并按 。验证文本是否被发送回来。
23.5.13. 使用 RHEL 系统角色配置 firewalld 复制链接链接已复制到粘贴板!
RHEL 系统角色是 Ansible 自动化工具的一组内容。此内容与 Ansible 自动化工具一起提供一个一致的配置接口,来一次远程管理多个系统。
rhel-system-roles 软件包包含 rhel-system-roles.firewall RHEL 系统角色。此角色是为了自动配置 firewalld 服务而引入的。
使用 firewall RHEL 系统角色,您可以配置许多不同的 firewalld 参数,例如:
- 区域
- 应允许数据包的服务
- 授予、拒绝或丢弃访问端口的流量
- 区域的端口或端口范围的转发
23.5.13.1. 使用 firewall RHEL 系统角色重置 firewalld 设置 复制链接链接已复制到粘贴板!
随着时间的推移,对防火墙配置的更新可能会积累到一定程度,从而导致意外的安全风险。使用 firewall RHEL 系统角色,您可以以一种自动的方式将 firewalld 设置重置为其默认状态。这样,您可以有效地删除任何无意的或不安全的防火墙规则,并简化其管理。
先决条件
- 您已准备好控制节点和受管节点
- 以可在受管主机上运行 playbook 的用户登录到控制节点。
-
用于连接到受管节点的帐户具有
sudo权限。
步骤
创建一个包含以下内容的 playbook 文件,如
~/playbook.yml:--- - name: Reset firewalld example hosts: managed-node-01.example.com tasks: - name: Reset firewalld ansible.builtin.include_role: name: redhat.rhel_system_roles.firewall vars: firewall: - previous: replaced示例 playbook 中指定的设置包括以下内容:
previous: replaced删除所有现有的用户定义的设置,并将
firewalld设置重置为默认值。如果将previous:replaced参数与其他设置相结合,则firewall角色会在应用新设置前删除所有现有设置。有关 playbook 中使用的所有变量的详情,请查看控制节点上的
/usr/share/ansible/roles/rhel-system-roles.firewall/README.md文件。
验证 playbook 语法:
$ ansible-playbook --syntax-check ~/playbook.yml请注意,这个命令只验证语法,不会防止错误但有效的配置。
运行 playbook:
$ ansible-playbook ~/playbook.yml
验证
在控制节点上运行这个命令,来远程检查受管节点上的所有防火墙配置是否已被重置为其默认值:
# ansible managed-node-01.example.com -m ansible.builtin.command -a 'firewall-cmd --list-all-zones'
您可以使用 firewall RHEL 系统角色进行远程配置,将传入流量从一个本地端口转发到不同的本地端口。
例如,如果您有一个环境,其中同一机器上有多个服务共存且需要同样的默认端口,则可能会出现端口冲突。这些冲突可能会破坏服务并导致停机。使用 firewall RHEL 系统角色,您可以有效地将流量转发到替代端口,以确保您的服务可以同时运行,而无需修改其配置。
先决条件
- 您已准备好控制节点和受管节点
- 以可在受管主机上运行 playbook 的用户登录到控制节点。
-
用于连接到受管节点的帐户具有
sudo权限。
步骤
创建一个包含以下内容的 playbook 文件,如
~/playbook.yml:--- - name: Configure firewalld hosts: managed-node-01.example.com tasks: - name: Forward incoming traffic on port 8080 to 443 ansible.builtin.include_role: name: redhat.rhel_system_roles.firewall vars: firewall: - forward_port: 8080/tcp;443; state: enabled runtime: true permanent: true示例 playbook 中指定的设置包括以下内容:
forward_port :8080/tcp;443- 使用 TCP 协议到达本地端口 8080 的流量被转发到端口 443。
runtime: true启用运行时配置中的更改。默认值被设置为
true。有关 playbook 中使用的所有变量的详情,请查看控制节点上的
/usr/share/ansible/roles/rhel-system-roles.firewall/README.md文件。
验证 playbook 语法:
$ ansible-playbook --syntax-check ~/playbook.yml请注意,这个命令只验证语法,不会防止错误但有效的配置。
运行 playbook:
$ ansible-playbook ~/playbook.yml
验证
在控制节点上,运行以下命令远程检查受管节点上的转发端口:
# ansible managed-node-01.example.com -m ansible.builtin.command -a 'firewall-cmd --list-forward-ports' managed-node-01.example.com | CHANGED | rc=0 >> port=8080:proto=tcp:toport=443:toaddr=
23.5.13.3. 使用 firewall RHEL 系统角色配置 firewalld DMZ 区域 复制链接链接已复制到粘贴板!
作为系统管理员,您可以使用 firewall RHEL 系统角色在 enp1s0 接口上配置 dmz 区域,以允许到区域的 HTTPS 流量。这样,您可以让外部用户访问您的 web 服务器。
先决条件
- 您已准备好控制节点和受管节点
- 以可在受管主机上运行 playbook 的用户登录到控制节点。
-
用于连接到受管节点的帐户具有
sudo权限。
步骤
创建一个包含以下内容的 playbook 文件,如
~/playbook.yml:--- - name: Configure firewalld hosts: managed-node-01.example.com tasks: - name: Creating a DMZ with access to HTTPS port and masquerading for hosts in DMZ ansible.builtin.include_role: name: redhat.rhel_system_roles.firewall vars: firewall: - zone: dmz interface: enp1s0 service: https state: enabled runtime: true permanent: true有关 playbook 中使用的所有变量的详情,请查看控制节点上的
/usr/share/ansible/roles/rhel-system-roles.firewall/README.md文件。验证 playbook 语法:
$ ansible-playbook --syntax-check ~/playbook.yml请注意,这个命令只验证语法,不会防止错误但有效的配置。
运行 playbook:
$ ansible-playbook ~/playbook.yml
验证
在控制节点上,运行以下命令远程检查受管节点上
dmz区域的信息:# ansible managed-node-01.example.com -m ansible.builtin.command -a 'firewall-cmd --zone=dmz --list-all' managed-node-01.example.com | CHANGED | rc=0 >> dmz (active) target: default icmp-block-inversion: no interfaces: enp1s0 sources: services: https ssh ports: protocols: forward: no masquerade: no forward-ports: source-ports: icmp-blocks: