Red Hat Training

A Red Hat training course is available for RHEL 8

9.7. 使用 firewalld 区

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

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

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

9.7.2. 更改默认区

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

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

前提条件

  • firewalld 服务正在运行。

流程

设置默认区:

  1. 显示当前的默认区:

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

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

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

9.7.3. 将网络接口分配给区

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

流程

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

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

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

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

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

您可以使用 nmcli 实用程序在 NetworkManager 连接中添加 firewalld 区域。

流程

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

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

    # nmcli connection up profile

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

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

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

流程

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

    ZONE=zone_name

9.7.7. 创建一个新区

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

前提条件

  • firewalld 服务正在运行。

流程

  1. 创建一个新区:

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

    # firewall-cmd --reload

    该命令会在不中断已在运行的网络服务的情况下对防火墙配置应用最新的更改。

验证

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

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

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

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

  • 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) 手册页