14.5. 使用和配置 firewalld


防火墙是保护机器不受来自外部的、不需要的网络数据的一种方式。它允许用户通过定义一组防火墙规则 来控制主机上的入站网络流量。这些规则用于对进入的流量进行排序,并可以阻断或允许流量。

firewalld 是一个防火墙服务守护进程,其提供一个带有 D-Bus 接口的、动态可定制的、基于主机的防火墙。如果是动态的,它可在每次修改规则时启用、修改和删除规则,而不需要在每次修改规则时重启防火墙守护进程。

firewalld 使用区和服务的概念来简化流量管理。zones 是预定义的规则集。网络接口和源可以分配给区。允许的流量取决于您计算机连接到的网络,并分配了这个网络的安全级别。防火墙服务是预定义的规则,覆盖了允许特定服务进入流量的所有必要设置,并在区中应用。

服务使用一个或多个端口或地址进行网络通信。防火墙会根据端口过滤通讯。要允许服务的网络流量,必须打开其端口。firewall d 阻止未明确设置为打开的端口上的所有流量。一些区(如可信区)默认允许所有流量。

请注意,带有 nftables 后端的 firewalld 不支持使用 --direct 选项将自定义的 nftables 规则传递到 firewalld

14.5.1. 使用 firewalld、nftables 或者 iptables 时

以下是您应该使用以下工具之一的概述:

  • firewalld:使用 firewalld 实用程序进行简单防火墙用例。此工具易于使用,并涵盖了这些场景的典型用例。
  • nftables:使用 nftables 实用程序设置复杂和高性能的防火墙,如为整个网络设置。
  • iptables:Red Hat Enterprise Linux 上的 iptables 工具使用 nf_tables 内核 API 而不是 传统的 后端。The nf_tables API 提供向后兼容性,因此使用 iptables 命令的脚本仍可在 Red Hat Enterprise Linux 上工作。对于新的防火墙脚本,红帽建议使用 nftables
重要

要防止不同的与防火墙相关的服务(firewalldnftablesiptables)相互影响,请在 RHEL 主机上仅运行其中一个服务,并禁用其他服务。

14.5.2. 防火墙区域

您可以使用 ⁠firewalld 工具,根据您与网络中接口和流量的信任级别,将网络划分为不同的区域。连接只能是一个区域的一部分,但您可以对许多网络连接使用这个区域。

firewalld 遵循严格的与区域相关的原则:

  1. 流量只进入一个区域。
  2. 流量只流出一个区域。
  3. 一个区域定义了一个信任级别。
  4. 默认情况下,允许区域内流量(在同一区域中)。
  5. 默认情况下,拒绝区域间流量(从区域到区域)。

原则 4 和 5 是原则 3 的结果。

原则 4 可以通过区选项 --remove-forward 进行配置。原则 5 可以通过添加新策略来进行配置。

NetworkManager 通知接口区的 firewalld。您可以使用以下工具将区域分配给接口:

  • NetworkManager
  • firewall-config 工具
  • firewall-cmd 工具
  • RHEL web 控制台

RHEL web 控制台、firewall-configfirewall-cmd 只能编辑合适的 NetworkManager 配置文件。如果您使用 web 控制台、firewall-cmdfirewall-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 区域。您可以更改默认区域。

注意

使网络区域名称自我解释,以帮助用户快速理解它们。

要避免安全问题,请查看默认区配置并根据您的需要和风险禁用任何不必要的服务。

其它资源

  • 您系统上的 firewalld.zone (5) 手册页

14.5.3. 防火墙策略

防火墙策略指定网络所需的安全状态。它们概述了对不同类型的流量所采取的规则和操作。通常,策略包含用于以下类型流量的规则:

  • 传入流量
  • 传出流量
  • 转发流量
  • 特定服务和应用程序
  • 网络地址转换(NAT)

防火墙策略使用防火墙区域的概念。每个区域都与一组决定允许的流量的特定的防火墙规则关联。策略以有状态、单向的方式应用防火墙规则。这意味着您只考虑流量的一个方向。由于 firewalld 的有状态过滤,流量返回路径被隐式允许。

策略与一个入口区域和一个出口区域关联。入口区域是流量起源的地方(接收)。出口区域是流量离开的地方(发送)。

策略中定义的防火墙规则可以引用防火墙区,以便在多个网络接口之间应用一致的配置。

14.5.4. 防火墙规则

您可以使用防火墙规则实现特定的配置,以允许或阻止网络流量。因此,您可以控制网络流量的流,以防止系统受到安全威胁。

防火墙规则通常根据各种属性定义某些条件。属性可以是如下:

  • 源 IP 地址
  • 目标 IP 地址
  • 传输协议(TCP、UDP、…​)
  • 端口
  • 网络接口

firewalld 工具将防火墙规则组织到区域(如publicinternal 等)和策略中。每个区域都有自己的一组规则,其决定与特定区域关联的网络接口的流量自由度的级别。

14.5.5. 区配置文件

firewalld 区配置文件包含区的信息。这些区描述、服务、端口、协议、icmp-blocks、masquerade、forward-ports 和丰富的语言规则采用 XML 文件格式。文件名必须是 zone-name.xml,其中 zone-name 的长度限制为 17 个字符。区域配置文件位于 /usr/lib/firewalld/zones//etc/firewalld/zones/ 目录中。

以下示例展示了允许 TCPUDP 协议的一个服务(SSH)和一个端口范围的配置:

<?xml version="1.0" encoding="utf-8"?>
<zone>
  <short>My Zone</short>
  <description>Here you can describe the characteristic features of the zone.</description>
  <service name="ssh"/>
  <port protocol="udp" port="1025-65535"/>
  <port protocol="tcp" port="1025-65535"/>
</zone>

其它资源

  • firewalld.zone 手册页

14.5.6. 预定义的 firewalld 服务

firewalld 服务是一组预定义的防火墙规则,其定义对特定应用程序或网络服务的访问。每个服务都代表了以下元素的组合:

  • 本地端口
  • 网络协议
  • 关联的防火墙规则
  • 源端口和目的地
  • 如果服务启用了,会自动载入防火墙帮助程序模块

服务简化了数据包过滤,并节省了时间,因为它一次可以完成多个任务。例如,firewalld 可以一次执行以下任务:

  • 打开端口
  • 定义网络协议
  • 启用数据包转发

服务配置选项和通用文件信息在系统的 firewalld.service (5) man page 中进行了描述。服务通过单独的 XML 配置文件来指定,这些文件采用以下格式命名:service-name.xml 。协议名称优先于 firewalld 中的服务或应用程序名称。

您可以使用以下方法配置 firewalld

  • 使用工具:

    • firewall-config - 图形化工具
    • firewall-cmd - 命令行工具
    • firewall-offline-cmd - 命令行工具
  • 编辑 /etc/firewalld/services/ 目录中的 XML 文件。

    如果您没有添加或更改服务,/etc/firewalld/services/ 中没有相应的 XML 文件存在。您可以使用 /usr/lib/firewalld/services/ 中的文件作为模板。

其它资源

  • 您系统上的 firewalld.service (5) 手册页

14.5.7. 使用 firewalld 区

zones 代表一种更透明管理传入流量的概念。这些区域连接到联网接口或者分配一系列源地址。您可以独立为每个区管理防火墙规则,这样就可以定义复杂的防火墙设置并将其应用到流量。

14.5.7.1. 自定义特定区域的防火墙设置,以增强安全性

您可以通过修改防火墙设置并将特定的网络接口或连接与特定的防火墙区域关联,来增强网络安全性。通过为区域定义细粒度规则和限制,您可以根据想要的安全级别控制入站和出站流量。

例如,您可以获得以下好处:

  • 保护敏感数据
  • 防止未授权访问
  • 缓解潜在的网络威胁

先决条件

  • firewalld 服务在运行。

流程

  1. 列出可用的防火墙区域:

    # firewall-cmd --get-zones

    firewall-cmd --get-zones 命令显示系统上所有可用的区,但不显示特定区的详情。要查看所有区域的详情,请使用 firewall-cmd --list-all-zones 命令。

  2. 选择您要用于此配置的区域。
  3. 修改所选区域的防火墙设置。例如,要允许 SSH 服务,并删除 ftp 服务:

    # firewall-cmd --add-service=ssh --zone=<your_chosen_zone>
    # firewall-cmd --remove-service=ftp --zone=<same_chosen_zone>
  4. 将一个网络接口分配给防火墙区域:

    1. 列出可用的网络接口:

      # firewall-cmd --get-active-zones

      区域的活动是由存在的网络接口或与其配置匹配的源地址范围确定的。默认区域对于未分类的流量处于活跃状态,但如果没有流量匹配其规则,则始终处于活跃状态。

    2. 将一个网络接口分配给所选区域:

      # firewall-cmd --zone=<your_chosen_zone> --change-interface=<interface_name> --permanent

      将一个网络接口分配给一个区域更适合将一致的防火墙设置应用到特定接口(物理或虚拟)上的所有流量。

      firewall-cmd 命令与 --permanent 选项一起使用时,通常涉及更新 NetworkManager 连接配置文件,以永久更改防火墙配置。firewalld 和 NetworkManager 之间的这种集成确保一致的网络和防火墙设置。

验证

  1. 显示选择区域的更新设置:

    # firewall-cmd --zone=<your_chosen_zone> --list-all

    命令输出显示所有区域设置,包括分配的服务、网络接口和网络连接(源)。

14.5.7.2. 更改默认区

系统管理员在其配置文件中为网络接口分配区域。如果接口没有被分配给指定区,它将被分配给默认区。每次重启 firewalld 服务后,firewalld 会加载默认区的设置,并使其处于活动状态。请注意,所有其他区域的设置都被保留,并随时可以使用。

通常,NetworkManager 根据 NetworkManager 连接配置文件中的 connection.zone 设置将区域分配给接口。另外,重启后, NetworkManager 管理“激活”这些区域的分配。

先决条件

  • firewalld 服务在运行。

流程

设置默认区:

  1. 显示当前的默认区:

    # firewall-cmd --get-default-zone
  2. 设置新的默认区:

    # firewall-cmd --set-default-zone <zone_name>
    注意

    按照此流程,设置是一个永久设置,即使没有 --permanent 选项。

14.5.7.3. 将网络接口分配给区

可以为不同区定义不同的规则集,然后通过更改所使用的接口的区来快速改变设置。使用多个接口,可以为每个具体区设置一个区来区分通过它们的网络流量。

流程

要将区分配给特定的接口:

  1. 列出活跃区以及分配给它们的接口:

    # firewall-cmd --get-active-zones
  2. 为不同的区分配接口:

    # firewall-cmd --zone=zone_name --change-interface=interface_name --permanent

14.5.7.4. 使用 nmcli 为连接分配区域

您可以使用 nmcli 工具将 firewalld 区域添加到 NetworkManager 连接。

流程

  1. 将区分配给 NetworkManager 连接配置文件:

    # nmcli connection modify profile connection.zone zone_name
  2. 激活连接:

    # nmcli connection up profile

14.5.7.5. 在连接配置文件文件中,手动将区域分配给网络连接

如果您无法使用 nmcli 工具修改连接配置文件,您可以手动编辑配置文件的对应文件来分配一个 firewalld 区域。

注意

使用 nmcli 工具修改连接配置文件来分配 firewalld 区域效率更高。详情请参阅 将网络接口分配给区域

流程

  1. 确定连接配置文件的路径及其格式:

    # nmcli -f NAME,FILENAME connection
    NAME    FILENAME
    enp1s0  /etc/NetworkManager/system-connections/enp1s0.nmconnection
    enp7s0  /etc/sysconfig/network-scripts/ifcfg-enp7s0

    NetworkManager 对不同的连接配置文件格式使用单独的目录和文件名称:

    • /etc/NetworkManager/system-connections/<connection_name>.nmconnection 文件中的配置文件使用 keyfile 格式。
    • /etc/sysconfig/network-scripts/ifcfg-<interface_name> 文件中的配置文件使用 ifcfg 格式。
  2. 根据格式,更新对应的文件:

    • 如果文件使用 keyfile 格式,请将 zone= <name> 附加到 /etc/NetworkManager/system-connections/<connection_name>.nmconnection 文件的 [connection] 部分:

      [connection]
      ...
      zone=internal
    • 如果文件使用 ifcfg 格式,请将 ZONE= <name> 附加到 /etc/sysconfig/network-scripts/ifcfg- <interface_name> 文件中:

      ZONE=internal
  3. 重新加载连接配置文件:

    # nmcli connection reload
  4. 重新激活连接配置文件

    # nmcli connection up <profile_name>

验证

  • 显示接口的区域,例如:

    # firewall-cmd --get-zone-of-interface enp1s0
    internal

14.5.7.6. 在 ifcfg 文件中手动将区分配给网络连接

当连接由 NetworkManager 管理时,必须了解它使用的区。对于每个网络连接配置文件,可以指定一个区域,其根据带有可移植设备的计算机的位置提供各种防火墙设置的灵活性。因此,可以为不同的位置(如公司或家)指定区域和设置。

流程

  • 要为连接设置一个区,请编辑 /etc/sysconfig/network-scripts/ifcfg-connection_name 文件,并添加将区分配给这个连接的行:

    ZONE=zone_name

14.5.7.7. 创建一个新区

要使用自定义区,创建一个新的区并使用它像预定义区一样。新区需要 --permanent 选项,否则命令无法工作。

先决条件

  • firewalld 服务在运行。

流程

  1. 创建一个新区:

    # firewall-cmd --permanent --new-zone=zone-name
  2. 使新区域可用:

    # firewall-cmd --reload

    命令将最新的更改应用到防火墙配置,而不中断已在运行的网络服务。

验证

  • 检查是否在您的永久设置中添加了新的区:

    # firewall-cmd --get-zones --permanent

14.5.7.8. 使用 Web 控制台启用区域

您可以通过 RHEL web 控制台对特定接口或 IP 地址范围应用预定义和现有的防火墙区域。

先决条件

流程

  1. 登录到 RHEL 8 web 控制台。

    详情请参阅 登录到 web 控制台

  2. Networking
  3. 编辑规则和区域按钮。

    Edit firewall rules and zones in the web console

    如果没有看到 Edit rules and zones 按钮,使用管理员权限登录到 web 控制台。

  4. Firewall 部分,点 Add new zone
  5. Add zone 对话框中,从信任级别选项选择一个区。

    Web 控制台显示 firewalld 服务中预定义的所有区域。

  6. 接口部分,选择一个应用所选区的接口或接口。
  7. Allowed Addresses 部分中,您可以选择是否应用该区:

    • 整个子网
    • 或者以以下格式表示的 IP 地址范围:

      • 192.168.1.0
      • 192.168.1.0/24
      • 192.168.1.0/24, 192.168.1.0
  8. Add zone 按钮。

    Add a firewall zone

验证

  • 检查 Firewall 部分中的配置:

    Active zones

14.5.7.9. 使用 Web 控制台禁用区域

您可以使用 Web 控制台在防火墙配置中禁用防火墙区域。

先决条件

流程

  1. 登录到 RHEL 8 web 控制台。

    详情请参阅 登录到 web 控制台

  2. Networking
  3. 编辑规则和区域按钮。

    cockpit edit rules and zones

    如果没有看到 Edit rules and zones 按钮,使用管理员权限登录到 web 控制台。

  4. 点您要删除的区的 Options 图标。

    cockpit delete zone

  5. 单击 Delete

区域现在被禁用,接口不包括在区域中配置的打开的服务和端口。

14.5.7.10. 使用区目标设定传入流量的默认行为

对于每个区,您可以设置一种处理尚未进一步指定的传入流量的默认行为。这种行为通过设置区的目标来定义。有四个选项:

  • ACCEPT:接受除特定规则禁止的数据包外的所有传入数据包。
  • REJECT:拒绝除特定规则允许的数据包外的所有传入数据包。当 firewalld 拒绝数据包时,会通知源机器。
  • DROP:丢弃除特定规则允许的数据包外的所有传入数据包。当 firewalld 丢弃数据包时,不会获得与数据包丢弃相关的源机器。
  • default:行为与 REJECT 类似,但在某些情况下有特殊含义。

先决条件

  • firewalld 服务在运行。

流程

为区设置目标:

  1. 列出特定区的信息以查看默认目标:

    # firewall-cmd --zone=zone-name --list-all
  2. 在区中设置一个新目标:

    # firewall-cmd --permanent --zone=zone-name --set-target=<default|ACCEPT|REJECT|DROP>

其它资源

  • 您系统上的 firewall-cmd (1) 手册页

14.5.8. 使用 firewalld 控制网络流量

firewalld 软件包安装了大量预定义的服务文件,您可以添加更多或自定义它们。然后,您可以使用这些服务定义为服务打开或关闭端口,而无需了解协议及它们使用的端口号。

14.5.8.1. 使用 CLI 控制预定义服务的流量

控制流量的最简单的方法是在 firewalld 中添加预定义的服务。这会打开所有必需的端口并根据 服务定义文件 修改其他设置。

先决条件

  • firewalld 服务在运行。

流程

  1. 检查 firewalld 中的服务是否没有被允许:

    # firewall-cmd --list-services
    ssh dhcpv6-client

    命令列出默认区域中启用的服务。

  2. 列出 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 ...

    命令显示默认区域的可用服务的列表。

  3. 将服务添加到 firewalld 允许的服务的列表中:

    # firewall-cmd --add-service=<service_name>

    命令将指定的服务添加到默认区域中。

  4. 使新设置具有持久性:

    # firewall-cmd --runtime-to-permanent

    命令将这些运行时更改应用到防火墙的永久配置中。默认情况下,它将这些更改应用到默认区域的配置中。

验证

  1. 列出所有永久防火墙规则:

    # 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)的永久防火墙规则的完整配置。

  2. 检查 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/ 目录中。

14.5.8.2. 使用 GUI 控制带有预定义服务的流量

您可以使用图形用户界面控制带有预定义服务的网络流量。防火墙配置应用程序提供命令行工具的一种可访问和用户友好的替代方案。

先决条件

  • firewall-config 软件包已安装 。
  • firewalld 服务在运行。

流程

  1. 启用或禁用预定义或自定义服务:

    1. 启动 firewall-config 工具,并选择要配置其服务的网络区域。
    2. 选择 Zones 选项卡,然后选择下面的" 服务 "选项卡。
    3. 选中您要信任的每种服务类型的复选框,或者清除复选框以阻止所选区域中的服务。
  2. 编辑服务:

    1. 启动 firewall-config 工具。
    2. 从标有 Configuration 的菜单中选择 Permanent。其它图标和菜单按钮会出现在服务窗口底部。
    3. 选择您要配置的服务。

PortsProtocolsSource Port 选项卡支持添加、更改和删除所选服务的端口、协议和源端口。模块选项卡是用于配置 Netfilter 助手模块的。Destination 选项卡允许将流量限制到特定的目标地址和互联网协议(IPv4IPv6)。

注意

Runtime 模式下无法更改服务设置。

验证

  • Super 键进入到活动概览。
  • 选择 Firewall Configuration 工具。

    • 您还可以通过输入 firewall-config 命令,使用命令行启动图形防火墙配置工具。
  • 查看防火墙配置的列表:

    防火墙配置

此时会打开 Firewall Configuration 窗口。请注意,这个命令可以以普通用户身份运行,但偶尔会提示您输入管理员密码。

14.5.8.3. 使用 Web 控制台在防火墙上启用服务

默认情况下,服务添加到默认防火墙区。如果在更多网络接口中使用更多防火墙区,您必须首先选择一个区域,然后添加带有端口的服务。

RHEL 8 web 控制台显示预定义的 firewalld 服务,您可以将其添加到活跃的防火墙区。

重要

RHEL 8 web 控制台配置 firewalld 服务。

Web 控制台不允许没有在 web 控制台中列出的通用 firewalld 规则。

先决条件

流程

  1. 登录到 RHEL 8 web 控制台。

    详情请参阅 登录到 web 控制台

  2. Networking
  3. 编辑规则和区域按钮。

    cockpit edit rules and zones

    如果没有看到 Edit rules and zones 按钮,使用管理员权限登录到 web 控制台。

  4. Firewall 部分,选择要添加该服务的区,然后点击 Add Services

    cockpit add services

  5. Add Services 对话框中,找到您要在防火墙中启用的服务。
  6. 根据您的场景启用服务:

    cockpit add service

  7. Add Services

此时,RHEL 8 web 控制台在区域的服务列表中显示该服务。

14.5.8.4. 使用 Web 控制台配置自定义端口

您可以通过 RHEL web 控制台为服务添加自定义端口。

先决条件

流程

  1. 登录到 RHEL 8 web 控制台。

    详情请参阅 登录到 web 控制台

  2. Networking
  3. 编辑规则和区域按钮。

    cockpit edit rules and zones

    如果没有看到 Edit rules and zones 按钮,使用管理员权限登录到 web 控制台。

  4. Firewall 部分,选择要配置自定义端口的区域,并点 Add Services

    RHEL web console: Add services

  5. Add services 对话框中,点 Custom Ports 单选按钮。
  6. 在 TCP 和 UDP 字段中,根据示例添加端口。您可以使用以下格式添加端口:

    • 端口号,如 22
    • 端口号范围,如 5900-5910
    • 别名,比如 nfs, rsync
    注意

    您可以在每个字段中添加多个值。值必须用逗号分开,且没有空格,例如:8080,8081,HTTP

  7. TCP 文件、UDP 文件或两者中添加端口号后,在 Name 字段中验证服务名称。

    Name 字段显示保留此端口的服务名称。如果您确定这个端口可用,且不需要在该端口上通信,则可以重写名称。

  8. Name 字段中,为服务添加一个名称,包括定义的端口。
  9. 添加端口 按钮。

    RHEL web console: Add ports

要验证设置,请进入防火墙页面,并在区域的服务列表中找到该服务。

RHEL web console: Active zones

14.5.8.5. 配置 firewalld 以允许托管一个安全的 Web 服务器

端口是逻辑服务,其使操作系统能够接收和区分网络流量,并将其转发给系统服务。系统服务由一个守护进程表示,其侦听端口,并等待任何进入此端口的任何流量。

通常,系统服务侦听为它们保留的标准端口。例如,httpd 守护进程监听 80 端口。但是,系统管理员可以直接指定端口号,而不是服务名称。

您可以使用 firewalld 服务配置到托管数据的安全的 Web 服务器的访问。

先决条件

  • firewalld 服务在运行。

流程

  1. 检查当前活跃的防火墙区域:

    # firewall-cmd --get-active-zones
  2. 将 HTTPS 服务添加到合适的区域:

    # firewall-cmd --zone=<zone_name> --add-service=https --permanent
  3. 重新载入防火墙配置:

    # firewall-cmd --reload

验证

  1. 检查端口是否在 firewalld 中打开:

    • 如果您通过指定端口号打开了端口,请输入:

      # firewall-cmd --zone=<zone_name> --list-all
    • 如果您通过指定一个服务定义打开了端口,请输入:

      # firewall-cmd --zone=<zone_name> --list-services

14.5.8.6. 关闭未使用的或不必要的端口,来增强网络安全性

当不再需要一个开放端口时,您可以使用 firewalld 工具关闭它。

重要

关闭所有不必要的端口,以减少潜在的攻击面,并降低未授权访问或利用漏洞的风险。

流程

  1. 列出所有允许的端口:

    # firewall-cmd --list-ports

    默认情况下,此命令列出默认区域中启用的端口。

    注意

    此命令只提供一个作为端口打开的端口的列表。您将无法看到任何作为服务打开的开放端口。在这种情况下,请考虑使用 --list-all 选项而不是 --list-ports

  2. 从允许的端口列表中删除端口来关闭它,来用于传入的流量:

    # firewall-cmd --remove-port=port-number/port-type

    这个命令从一个区域中删除端口。如果没有指定区域,它将从默认区域中删除端口。

  3. 使新设置具有持久性:

    # firewall-cmd --runtime-to-permanent

    不需要指定区域,这个命令将运行时更改应用到默认区域的永久配置。

验证

  1. 列出活跃区域,并选择要检查的区域:

    # firewall-cmd --get-active-zones
  2. 列出所选区域中当前打开的端口,来检查未使用的或不必要的端口是否已关闭:

    # firewall-cmd --zone=<zone_to_inspect> --list-ports

14.5.8.7. 通过 CLI 控制流量

您可以使用 firewall-cmd 命令来:

  • 禁用网络流量
  • 启用网络流量

因此,您可以加强系统防御,确保数据隐私或优化网络资源。

重要

启用 panic 模式可停止所有网络流量。因此,只有当您具有对机器的物理访问权限或使用串行控制台登录时,才应使用它。

流程

  1. 要立即禁用网络流量,请切换 panic 模式:

    # firewall-cmd --panic-on
  2. 关闭 panic 模式会使防火墙恢复到其永久设置。要关闭 panic 模式,请输入:

    # firewall-cmd --panic-off

验证

  • 要查看是否打开或关闭 panic 模式,请使用:

    # firewall-cmd --query-panic

14.5.8.8. 使用 GUI 控制协议的流量

如果想使用某种协议允许流量通过防火墙,您可以使用 GUI。

先决条件

  • firewall-config 软件包已安装

流程

  1. 启动 firewall-config 工具,并选择要更改其设置的网络区。
  2. 选择 Protocols 选项卡,然后点击右侧的 Add 按钮。此时会打开 协议 窗口。
  3. 从列表中选择协议,或者选择 Other Protocol 复选框,并在字段中输入协议。

14.5.9. 根据源使用区管理传入流量

您可以使用区管理传入的流量,根据其源管理传入的流量。此上下文中的传入流量是去往您系统的任何数据,或者通过运行 firewalld 的主机传递。源通常指的是流量源自的 IP 地址或网络范围。因此,您可以对传入的流量进行排序,并将其分配给不同的区域,以允许或禁止该流量可以到达的服务。

按源地址匹配优先于按接口名称匹配。当您向区域添加源时,对于传入的流量,防火墙优先考虑基于源的规则,而不是基于接口的规则。这意味着,如果传入的流量为特定区域指定的源地址匹配,与该源地址关联的区域将决定如何处理流量,而不管它通过哪个接口到达。另一方面,基于接口的规则通常是与特定的基于源的规则不匹配的流量的回退。这些规则应用到流量,因为源没有明确地与一个区域相关联。这允许您为没有特定的源定义区域的流量定义默认行为。

14.5.9.1. 添加源

要将传入的流量路由到特定区,请将源添加到那个区。源可以是一个使用 CIDR 格式的 IP 地址或 IP 掩码。

注意

如果您添加多个带有重叠网络范围的区域,则根据区名称排序,且只考虑第一个区。

  • 在当前区中设置源:

    # firewall-cmd --add-source=<source>
  • 要为特定区设置源 IP 地址:

    # firewall-cmd --zone=zone-name --add-source=<source>

以下流程允许来自 受信任 区中 192.168.2.15 的所有传入的流量:

流程

  1. 列出所有可用区:

    # firewall-cmd --get-zones
  2. 将源 IP 添加到持久性模式的信任区中:

    # firewall-cmd --zone=trusted --add-source=192.168.2.15
  3. 使新设置具有持久性:

    # firewall-cmd --runtime-to-permanent

14.5.9.2. 删除源

当您从区域删除源时,源自源的流量不再被通过该源指定的规则定向。相反,流量会返回到与它源自的接口关联的区域的规则和设置,或进到默认区域。

流程

  1. 列出所需区的允许源:

    # firewall-cmd --zone=zone-name --list-sources
  2. 从区永久删除源:

    # firewall-cmd --zone=zone-name --remove-source=<source>
  3. 使新设置具有持久性:

    # firewall-cmd --runtime-to-permanent

14.5.9.3. 删除源端口

通过删除源端口,您可以根据原始端口禁用对流量排序。

流程

  • 要删除源端口:

    # firewall-cmd --zone=zone-name --remove-source-port=<port-name>/<tcp|udp|sctp|dccp>

14.5.9.4. 使用区和源来允许一个服务只适用于一个特定的域

要允许特定网络的流量在机器上使用服务,请使用区和源。以下流程只允许来自 192.0.2.0/24 网络的 HTTP 流量,而阻止其他任何流量。

警告

当您配置此场景时,请使用具有 default 目标的区。使用目标设为 ACCEPT 的区存在安全风险,因为对于来自 192.0.2.0/24 的流量,所有网络连接都将被接受。

流程

  1. 列出所有可用区:

    # firewall-cmd --get-zones
    block dmz drop external home internal public trusted work
  2. 将 IP 范围添加到 internal 区,来将来自源的流量通过区:

    # firewall-cmd --zone=internal --add-source=192.0.2.0/24
  3. internal 区中添加 http 服务:

    # firewall-cmd --zone=internal --add-service=http
  4. 使新设置具有持久性:

    # firewall-cmd --runtime-to-permanent

验证

  • 检查 internal 区是否活跃,以及该区中服务是否被允许:

    # firewall-cmd --zone=internal --list-all
    internal (active)
      target: default
      icmp-block-inversion: no
      interfaces:
      sources: 192.0.2.0/24
      services: cockpit dhcpv6-client mdns samba-client ssh http
      ...

其它资源

  • 您系统上的 firewalld.zones (5) 手册页

14.5.10. 在区域间过滤转发的流量

firewalld 使您能够控制不同 firewalld 区域之间的网络数据流。通过定义规则和策略,您可以管理当流量在这些区域之间移动时,它们是如何被允许或阻止的。

策略对象功能在 firewalld 中提供转发和输出过滤。您可以使用 firewalld 过滤不同区域之间的流量,以允许访问本地托管的虚拟机,来连接主机。

14.5.10.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

HOSTANY 是 ingress 和 egress 区域列表中使用的符号区域。

  • HOST 符号区域允许流量源自或具有运行 firewalld 的主机的目标策略。
  • ANY 符号区对所有当前和将来的区域应用策略。ANY 符号区域充当所有区域的通配符。

14.5.10.2. 使用优先级对策略进行排序

多个策略可以应用到同一组流量,因此应使用优先级为可能应用的策略创建优先级顺序。

要设置优先级来对策略进行排序:

# firewall-cmd --permanent --policy mypolicy --set-priority -500

在上例中,-500 是一个较低优先级的值,但优先级更高。因此,-500 将在 -100 之前执行。

较低的数字优先级值有较高的优先级,并被首先应用。

14.5.10.3. 使用策略对象过滤本地托管的容器和物理连接到主机的网络之间的流量

策略对象功能允许用户过滤 Podman 和 firewalld 区域之间的流量。

注意

红帽建议默认阻止所有流量,并打开 Podman 工具所需的可选择的服务。

流程

  1. 创建一个新的防火墙策略:

    # firewall-cmd --permanent --new-policy podmanToAny
  2. 阻止从 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
  3. 创建一个新的 Podman 区域:

    # firewall-cmd --permanent --new-zone=podman
  4. 为策略定义 ingress 区域:

    # firewall-cmd --permanent --policy podmanToHost --add-ingress-zone podman
  5. 为所有其他区域定义 egress 区域:

    # firewall-cmd --permanent --policy podmanToHost --add-egress-zone ANY

    将 egress 区域设置为 ANY 意味着您从 Podman 过滤到其他区域。如果要过滤到主机,那么将 egress 区域设置为 HOST。

  6. 重启 firewalld 服务:

    # systemctl restart firewalld

验证

  • 验证到其他区域的 Podman 防火墙策略:

    # firewall-cmd --info-policy podmanToAny
    podmanToAny (active)
      ...
      target: REJECT
      ingress-zones: podman
      egress-zones: ANY
      services: dhcp dns https
      ...

14.5.10.4. 设置策略对象的默认目标

您可以为策略指定 --set-target 选项。可用的目标如下:

  • ACCEPT - 接受数据包
  • DROP - 丢弃不需要的数据包
  • REJECT - 拒绝不需要的数据包,并带有 ICMP 回复
  • CONTINUE(默认)- 数据包将遵循以下策略和区域中的规则。

    # firewall-cmd --permanent --policy mypolicy --set-target CONTINUE

验证

  • 验证有关策略的信息

    # firewall-cmd --info-policy mypolicy

14.5.10.5. 使用 DNAT 将 HTTPS 流量转发到不同主机

如果您的 web 服务器使用私有 IP 地址在 DMZ 中运行,您可以配置目标网络地址转换 (DNAT) 以使互联网上的客户端能够连接到此 web 服务器。在本例中,Web 服务器的主机名解析为路由器的公共 IP 地址。当客户端建立到路由器上定义的端口的连接时,路由器会将数据包转发到内部 Web 服务器。

先决条件

  • DNS 服务器将 Web 服务器的主机名解析为路由器的 IP 地址。
  • 您知道以下设置:

    • 您要转发的专用 IP 地址和端口号
    • 要使用的 IP 协议
    • 要重定向数据包的 web 服务器的目标 IP 地址和端口

流程

  1. 创建防火墙策略:

    # firewall-cmd --permanent --new-policy <example_policy>

    与区域不同,策略也允许数据包过滤输入、输出和转发流量。这很重要,因为将流量转发到本地的 web 服务器、容器或虚拟机上的端点需要此类功能。

  2. 为入站和出站流量配置符号链接区域,以便路由器本身连接到其本地 IP 地址并转发此流量:

    # firewall-cmd --permanent --policy=<example_policy> --add-ingress-zone=HOST
    # firewall-cmd --permanent --policy=<example_policy> --add-egress-zone=ANY

    --add-ingress-zone=HOST 选项是指本地产生的,并传出本地主机的数据包。--add-egress-zone=ANY 选项指的是移动到任何区域的流量。

  3. 添加将流量转发到 Web 服务器的富规则:

    # firewall-cmd --permanent --policy=<example_policy> --add-rich-rule='rule family="ipv4" destination address="192.0.2.1" forward-port port="443" protocol="tcp" to-port="443" to-addr="192.51.100.20"'

    富规则将来自路由器 IP 地址(192.0.2.1)上端口 443 的 TCP 流量转发到 Web 服务器 IP 地址(192.51.100.20)的端口 443。

  4. 重新载入防火墙配置文件:

    # firewall-cmd --reload
    success
  5. 在内核中激活 127.0.0.0/8 的路由:

    • 对于持久性更改,请运行:

      # echo "net.ipv4.conf.all.route_localnet=1" > /etc/sysctl.d/90-enable-route-localnet.conf

      命令永久配置 route_localnet 内核参数,并确保设置在系统重启后保持不变。

    • 要在不重启系统的情况下立即应用设置,请运行:

      # sysctl -p /etc/sysctl.d/90-enable-route-localnet.conf

      sysctl 命令对于应用实时更改很有用,但配置在系统重启后不会持久。

验证

  1. 连接到路由器的 IP 地址以及您已转发到 web 服务器的端口:

    # curl https://192.0.2.1:443
  2. 可选:验证 net.ipv4.conf.all.route_localnet 内核参数是否活跃:

    # sysctl net.ipv4.conf.all.route_localnet
    net.ipv4.conf.all.route_localnet = 1
  3. 验证 <example_policy> 是否活跃,是否包含您需要的设置,特别是源 IP 地址和端口,要使用的协议以及目标 IP 地址和端口:

    # firewall-cmd --info-policy=<example_policy>
    example_policy (active)
      priority: -1
      target: CONTINUE
      ingress-zones: HOST
      egress-zones: ANY
      services:
      ports:
      protocols:
      masquerade: no
      forward-ports:
      source-ports:
      icmp-blocks:
      rich rules:
    	rule family="ipv4" destination address="192.0.2.1" forward-port port="443" protocol="tcp" to-port="443" to-addr="192.51.100.20"

其它资源

14.5.11. 使用 firewalld 配置 NAT

使用 firewalld,您可以配置以下网络地址转换(NAT)类型:

  • 伪装
  • 目标 NAT(DNAT)
  • 重定向

14.5.11.1. 网络地址转换类型

这些是不同的网络地址转换(NAT)类型:

伪装

使用以上 NAT 类型之一更改数据包的源 IP 地址。例如,互联网服务提供商(ISP)不会路由私有 IP 范围,如 10.0.0.0/8。如果您在网络中使用私有 IP 范围,用户应该能够访问互联网上的服务器,请将来自这些范围的数据包的源 IP 地址映射为公共 IP 地址。

伪装自动使用传出接口的 IP 地址。因此,如果传出接口使用了动态 IP 地址,则使用伪装。

目标 NAT(DNAT)
使用此 NAT 类型重写传入数据包的目标地址和端口。例如,如果您的 Web 服务器使用来自私有 IP 范围的 IP 地址,因此无法直接从互联网访问,您可以在路由器上设置 DNAT 规则,来将传入的流量重定向到此服务器。
重定向
此类型是 DNAT 的一种特殊情况,其将数据包重定向到本地机器上的不同端口。例如,如果服务运行在与其标准端口不同的端口上,您可以将传入的流量从标准端口重定向到此特定端口。

14.5.11.2. 配置 IP 地址伪装

您可以在系统上启用 IP 伪装。在访问互联网时,IP 伪装会隐藏网关后面的单个机器。

流程

  1. 要检查是否启用了 IP 伪装(例如,对于 external 区),以 root 用户身份输入以下命令:

    # firewall-cmd --zone=external --query-masquerade

    如果已启用,命令将会打印 yes,且退出状态为 0。否则,将打印 no ,且退出状态为 1。如果省略了 zone,则将使用默认区。

  2. 要启用 IP 伪装,请以 root 用户身份输入以下命令:

    # firewall-cmd --zone=external --add-masquerade
  3. 要使此设置持久,请将 --permanent 选项传给命令。
  4. 要禁用 IP 伪装,请以 root 身份输入以下命令:

    # firewall-cmd --zone=external --remove-masquerade

    要使此设置永久生效,请将 --permanent 选项传递给 命令。

14.5.11.3. 使用 DNAT 转发传入的 HTTP 流量

您可以使用目标网络地址转换(DNAT)将传入的流量从一个目标地址和端口定向到另一个目标地址和端口。通常,这对于将来自外部网络接口的传入请求重定向到特定的内部服务器或服务非常有用。

先决条件

  • firewalld 服务在运行。

流程

  1. 使用以下内容创建 /etc/sysctl.d/90-enable-IP-forwarding.conf 文件:

    net.ipv4.ip_forward=1

    此设置在内核中启用 IP 转发。它使内部 RHEL 服务器充当路由器,并将数据包从一个网络转发到另一个网络。

  2. /etc/sysctl.d/90-enable-IP-forwarding.conf 文件中载入设置:

    # sysctl -p /etc/sysctl.d/90-enable-IP-forwarding.conf
  3. 转发传入的 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 规则在重启后持久的选项。
  4. 重新载入防火墙配置,以应用更改:

    # 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>

其它资源

14.5.11.4. 重定向来自非标准端口的流量,以使 Web 服务在标准端口上可访问

您可以使用重定向机制使内部运行在非标准端口上的 Web 服务可访问,而无需用户在 URL 中指定端口。因此,URL 更为简单,提供更好的浏览体验,而非标准端口仍然在内部使用或用于特定的要求。

先决条件

  • firewalld 服务在运行。

流程

  1. 使用以下内容创建 /etc/sysctl.d/90-enable-IP-forwarding.conf 文件:

    net.ipv4.ip_forward=1

    此设置在内核中启用 IP 转发。

  2. /etc/sysctl.d/90-enable-IP-forwarding.conf 文件中载入设置:

    # sysctl -p /etc/sysctl.d/90-enable-IP-forwarding.conf
  3. 创建 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 - 使规则在重启后持久的选项。
  4. 重新载入防火墙配置,以应用更改:

    # 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>

其它资源

14.5.12. 管理 ICMP 请求

Internet 控制消息协议 (ICMP)是一种支持协议,其被各种网络设备用来进行测试、故障排除和诊断。ICMP 与 TCP 和 UDP 等传输协议不同,因为它不用于在系统之间交换数据。

您可以使用 ICMP 消息(特别是 echo-requestecho-reply )来显示有关网络的信息,以及将这些信息滥用于各种欺诈活动。因此,firewalld 启用了控制 ICMP 请求,来保护您的网络信息。

14.5.12.1. 配置 ICMP 过滤

您可以使用 ICMP 过滤来定义您希望防火墙允许或拒绝哪些 ICMP 类型和代码到达您的系统。ICMP 类型和代码是 ICMP 消息的特定类别和子类别。

例如,在以下区域中,ICMP 过滤帮助:

  • 安全增强 - 阻止潜在的有危害的 ICMP 类型和代码,以减少攻击面。
  • 网络性能 - 仅允许必要的 ICMP 类型,以优化网络性能,并防止过量的 ICMP 流量导致的潜在网络拥塞。
  • 排除控制问题 - 为排除网络故障维护基本的 ICMP 功能,并阻止表示潜在安全风险的 ICMP 类型。

先决条件

  • firewalld 服务在运行。

流程

  1. 列出可用的 ICMP 类型和代码:

    # firewall-cmd --get-icmptypes
    address-unreachable bad-header beyond-scope communication-prohibited destination-unreachable echo-reply echo-request failed-policy fragmentation-needed host-precedence-violation host-prohibited host-redirect host-unknown host-unreachable
    ...

    从该预定义列表中选择要允许或阻止哪些 ICMP 类型和代码。

  2. 通过以下方法过滤特定的 ICMP 类型:

    • 允许 ICMP 类型:

      # firewall-cmd --zone=<target-zone> --remove-icmp-block=echo-request --permanent

      命令删除 echo requests ICMP 类型的任何现有的阻塞规则。

    • 阻止 ICMP 类型:

      # firewall-cmd --zone=<target-zone> --add-icmp-block=redirect --permanent

      命令确保重定向消息 ICMP 类型被防火墙阻止。

  3. 重新载入防火墙配置,以应用更改:

    # firewall-cmd --reload

验证

  • 验证您的过滤规则是否生效:

    # firewall-cmd --list-icmp-blocks
    redirect

    命令输出显示您允许或阻止的 ICMP 类型和代码。

其它资源

  • firewall-cmd (1) 手册页

14.5.13. 使用 firewalld 设置和控制 IP 集

IP 集是一种 RHEL 功能,用于将 IP 地址和网络分组到集合中,以实现更灵活、有效的防火墙规则管理。

例如,当您需要时 IP 集合非常有价值,例如:

  • 处理大量 IP 地址列表
  • 对大量 IP 地址列表实施动态更新
  • 创建基于 IP 的自定义策略,以增强网络安全性和控制
警告

红帽建议使用 firewall-cmd 命令来创建和管理 IP 集合。

14.5.13.1. 配置动态更新,以允许 IP 集合

您可以进行接近实时更新,来灵活地允许 IP 集中特定的 IP 地址或范围,即使在无法预计的情况下也是如此。这些更新可由各种事件触发,如安全威胁检测或网络行为的更改。通常,此类解决方案利用自动化来减少手工工作,并通过快速响应情况来提高安全性。

先决条件

  • firewalld 服务在运行。

流程

  1. 创建一个有有意义名称的 IP 集:

    # firewall-cmd --permanent --new-ipset=allowlist --type=hash:ip

    名为 allowlist 的新 IP 集包含您希望防火墙允许的 IP 地址。

  2. 向 IP 集添加一个动态更新:

    # firewall-cmd --permanent --ipset=allowlist --add-entry=198.51.100.10

    此配置使用新添加的、防火墙允许传输网络流量的 IP 地址更新 allowlist IP 集。

  3. 创建一个引用之前创建的 IP 集的防火墙规则:

    # firewall-cmd --permanent --zone=public --add-source=ipset:allowlist

    没有此规则,IP 集不会对网络流量有任何影响。以默认防火墙策略为准。

  4. 重新载入防火墙配置,以应用更改:

    # firewall-cmd --reload

验证

  1. 列出所有 IP 集:

    # firewall-cmd --get-ipsets
    allowlist
  2. 列出活跃的规则:

    # 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 集、子网等)被允许或拒绝访问特定防火墙区域的信息。在这种情况下,允许 allowlist IP 集中包含的 IP 地址通过 public 区域的防火墙传输流量。

  3. 探索 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

其他资源

  • firewall-cmd (1) 手册页

14.5.14. 丰富规则的优先级

默认情况下,富规则是根据其规则操作进行组织的。例如,deny 规则优先于 allow 规则。富规则中的 priority 参数可让管理员对富规则及其执行顺序进行精细的控制。在使用 priority 参数时,规则首先按其优先级值升序排序。当许多规则有相同的 priority 时,其顺序是由规则操作决定的,如果操作也相同,则顺序可能未定义。

14.5.14.1. priority 参数如何将规则组织为不同的链

您可以将富规则中的 priority 参数设置为 -3276832767 之间的任何数,较小的数字值有较高的优先级。

firewalld 服务根据优先级值将规则组织到不同的链中:

  • 优先级低于 0:规则被重定向到带有 _pre 后缀的链中。
  • 优先级高于 0:规则被重定向到带有 _post 后缀的链中。
  • 优先级等于 0:根据操作,规则会被重定向到带有 _log_deny_allow 操作的链中。

在这些子链中,firewalld 根据其优先级值对规则进行排序。

14.5.14.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
      }
    }

14.5.15. 配置防火墙锁定

如果本地应用或服务以 root 身份运行(如 libvirt),则可以更改防火墙配置。使用这个特性,管理员可以锁定防火墙配置,从而达到没有应用程序或只有添加到锁定白名单中的应用程序可以请求防火墙更改的目的。锁定设置默认会被禁用。如果启用,用户就可以确定,防火墙没有被本地的应用程序或服务进行了不必要的配置更改。

14.5.15.1. 使用 CLI 配置锁定

您可以使用命令行启用或禁用锁定功能。

流程

  1. 查询是否启用了锁定:

    # firewall-cmd --query-lockdown
  2. 通过以下方法管理锁定配置:

    • 启用锁定:

      # firewall-cmd --lockdown-on
    • 禁用锁定:

      # firewall-cmd --lockdown-off

14.5.15.2. 锁定 allowlist 配置文件概述

默认允许列表配置文件包含 NetworkManager 上下文和 libvirt 的默认上下文。用户 ID 0 也位于列表中。

allowlist 配置文件存储在 /etc/firewalld/ 目录中。

<?xml version="1.0" encoding="utf-8"?>
	<whitelist>
		<command name="/usr/bin/python3 -s /usr/bin/firewall-config"/>
	  <selinux context="system_u:system_r:NetworkManager_t:s0"/>
	  <selinux context="system_u:system_r:virtd_t:s0-s0:c0.c1023"/>
	  <user id="0"/>
	</whitelist>

以下是一个允许列表配置文件的示例,它为名为 user ID 为 815 的用户允许 firewall-cmd 工具的所有命令:

<?xml version="1.0" encoding="utf-8"?>
	<whitelist>
	  <command name="/usr/libexec/platform-python -s /bin/firewall-cmd*"/>
	  <selinux context="system_u:system_r:NetworkManager_t:s0"/>
	  <user id="815"/>
	  <user name="user"/>
	</whitelist>

此示例展示了 user id user name ,但只需要其中一个选项。Python 是程序解释器,它位于命令行的前面。

在 Red Hat Enterprise Linux 中,所有工具都放在 /usr/bin/ 目录中,/bin/ 目录被符号链接到 /usr/bin/ 目录。换句话说,尽管以 root 身份输入的 firewall-cmd 的路径可能会被解析为 /bin/firewall-cmd,但现在 /usr/bin/firewall-cmd 可以使用。所有新脚本都应该使用新位置。但请注意,如果以 root 身份运行的脚本被写为使用 /bin/firewall-cmd 路径,那么除了必须添加到非 root 用户传统使用的 /usr/bin/firewall-cmd 外,该命令还必须添加到允许列表中。

命令的 name 属性末尾的 * 表示所有以这个字符串开头的命令都匹配。如果没有 *,则包括参数的绝对命令必须匹配。

14.5.16. 启用 firewalld 区域中不同接口或源之间的流量转发

区内转发是 firewalld 的一种功能,它允许 firewalld 区域内接口或源之间的流量转发。

14.5.16.1. 区内转发与默认目标设置为 ACCEPT 的区域之间的区别

启用了区域内转发后,单个 firewalld 区域中的流量可以从一个接口或源流到另一个接口或源。区指定接口和源的信任级别。如果信任级别相同,则流量保持在同一区域内。

注意

firewalld 的默认区域中启用区域内转发,仅适用于添加到当前默认区域的接口和源。

firewalld 使用不同的区域来管理传入流量和传出流量。每个区域都有自己的一组规则和行为。例如,trusted 区域默认允许所有转发的流量。

其他区域可以有不同的默认行为。在标准区域中,当区域的目标设置为 default 时,转发的流量通常默认被丢弃。

要控制如何在区域内的不同接口或源之间转发流量,请确保理解并相应配置了区域的目标。

14.5.16.2. 使用区内转发来在以太网和 Wi-Fi 网络间转发流量

您可以使用区内转发来在同一 firewalld 区内的接口和源之间转发流量。此功能带来以下好处:

  • 有线设备和无线设备间的无缝连接(您可以在连接到 enp1s0 的以太网网络和连接到 wlp0s20 的 Wi-Fi 网络之间转发流量)
  • 支持灵活的工作环境
  • 可以被网络中的多个设备或用户访问和使用的共享资源(如打印机、数据库、连接网络的存储等)
  • 高效的内部网络(如平稳通信、降低的延迟、资源可访问性等)

您可以为单个 firewalld 区域启用此功能。

流程

  1. 在内核中启用数据包转发:

    # echo "net.ipv4.ip_forward=1" > /etc/sysctl.d/95-IPv4-forwarding.conf
    # sysctl -p /etc/sysctl.d/95-IPv4-forwarding.conf
  2. 确保您要在它们之间启用区域内转发的接口只分配给 internal 区域:

    # firewall-cmd --get-active-zones
  3. 如果接口当前被分配给了不是 internal 的区,请重新分配它:

    # firewall-cmd --zone=internal --change-interface=interface_name --permanent
  4. enp1s0wlp0s20 接口添加到 internal 区:

    # firewall-cmd --zone=internal --add-interface=enp1s0 --add-interface=wlp0s20
  5. 启用区域内部转发:

    # firewall-cmd --zone=internal --add-forward

验证

以下验证要求 nmap-ncat 软件包已安装在两个主机上。

  1. 登录到与您在其上启用了区域转发的主机的 enp1s0 接口位于同一网络的主机。
  2. 使用 ncat 启动 echo 服务来测试连接:

    # ncat -e /usr/bin/cat -l 12345
  3. 登录到与 wlp0s20 接口在同一网络的主机。
  4. 连接到在与 enp1s0 在同一网络的主机上运行的 echo 服务器:

    # ncat <other_host> 12345
  5. 输入一些内容并按 Enter。验证文本是否被发送回来。

其他资源

  • 您系统上的 firewalld.zones (5) 手册页

14.5.17. 使用 RHEL 系统角色配置 firewalld

RHEL 系统角色是 Ansible 自动化工具的一组内容。此内容与 Ansible 自动化工具一起提供一致的配置接口,来一次远程管理多个系统。

rhel-system-roles 软件包包含 rhel-system-roles.firewall RHEL 系统角色。此角色是为 firewalld 服务的自动配置而引入的。

使用 firewall RHEL 系统角色,您可以配置许多不同的 firewalld 参数,例如:

  • 区域
  • 应允许哪些数据包的服务
  • 授予、拒绝或丢弃访问端口的流量
  • 区域的端口转发或端口范围

14.5.17.1. 使用 firewall RHEL 系统角色重置 firewalld 设置

随着时间的推移,对防火墙配置的更新可能会积累到一定程度,从而导致意外的安全风险。使用 firewall RHEL 系统角色,您可以以自动的方式将 firewalld 设置重置为其默认状态。这样,您可以有效地删除任何非预期的或不安全的防火墙规则,并简化其管理。

先决条件

流程

  1. 创建一个包含以下内容的 playbook 文件,如 ~/playbook.yml

    ---
    - name: Reset firewalld example
      hosts: managed-node-01.example.com
      tasks:
        - name: Reset firewalld
          ansible.builtin.include_role:
            name: 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 文件。

  2. 验证 playbook 语法:

    $ ansible-playbook --syntax-check ~/playbook.yml

    请注意,这个命令只验证语法,不会防止错误但有效的配置。

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml

验证

  • 在控制节点上运行此命令,来远程检查受管节点上的所有防火墙配置是否已重置为其默认值:

    # ansible managed-node-01.example.com -m ansible.builtin.command -a 'firewall-cmd --list-all-zones'

其他资源

  • /usr/share/ansible/roles/rhel-system-roles.firewall/README.md 文件
  • /usr/share/doc/rhel-system-roles/firewall/ 目录

14.5.17.2. 使用 firewall RHEL 系统角色,将 firewalld 中的传入流量从一个本地端口转发到另一个本地端口

您可以使用 firewall RHEL 系统角色来远程配置流量从一个本地端口到另一个本地端口的转发。

例如,如果您有一个环境,其中同一机器上有多个服务共存,且需要相同的默认端口,则可能会出现端口冲突。这些冲突可能会中断服务并导致停机。使用 firewall RHEL 系统角色,您可以高效地将流量转发到替代端口,以确保您的服务可以在不修改其配置的情况下同时运行。

先决条件

流程

  1. 创建一个包含以下内容的 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: 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 文件。

  2. 验证 playbook 语法:

    $ ansible-playbook --syntax-check ~/playbook.yml

    请注意,这个命令只验证语法,不会防止错误但有效的配置。

  3. 运行 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=

其他资源

  • /usr/share/ansible/roles/rhel-system-roles.firewall/README.md 文件
  • /usr/share/doc/rhel-system-roles/firewall/ 目录

14.5.17.3. 使用 firewall RHEL 系统角色配置 firewalld DMZ 区域

作为系统管理员,您可以使用 firewall RHEL 系统角色在 enp1s0 接口上配置 dmz 区域,以允许到区域的 HTTPS 流量。这样,您可以让外部用户访问您的 web 服务器。

先决条件

流程

  1. 创建一个包含以下内容的 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: 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 文件。

  2. 验证 playbook 语法:

    $ ansible-playbook --syntax-check ~/playbook.yml

    请注意,这个命令只验证语法,不会防止错误但有效的配置。

  3. 运行 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:

其他资源

  • /usr/share/ansible/roles/rhel-system-roles.firewall/README.md 文件
  • /usr/share/doc/rhel-system-roles/firewall/ 目录
Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.