Red Hat Training

A Red Hat training course is available for RHEL 8

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

您可以使用 firewall 系统角色一次性在多个客户端上配置 firewalld 服务的设置。这个解决方案:

  • 提供具有有效输入设置的接口。
  • 将所有预期的 firewalld 参数保存在一个地方。

在控制节点上运行 防火墙 角色后,系统角色会立即向受管节点应用 firewalld 参数,并使其在重启后保持不变。

9.17.1. firewall RHEL 系统角色简介

RHEL 系统角色是一组用于 Ansible 自动化实用程序的内容。此内容与 Ansible 自动化工具一起提供了一致的配置界面,来远程管理多个系统。

RHEL 系统角色中的 rhel-system-roles.firewall 角色是为 firewalld 服务的自动配置而引入的。rhel-system-roles 软件包中包含这个系统角色以及参考文档。

要以自动化的方式在一个或多个系统上应用 firewalld 参数,请在 playbook 中使用 firewall 系统角色变量。playbook 是一个或多个以基于文本的 YAML 格式编写的 play 的列表。

您可以使用清单文件来定义您希望 Ansible 来配置的一组系统。

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

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

其他资源

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

使用 firewall RHEL 系统角色,您可以将 firewalld 设置重置为其默认状态。如果在变量列表中添加 previous:replaced 参数,则系统角色会删除所有现有用户定义的设置,并将 firewalld 重置为默认值。如果将 previous:replaced 参数与其他设置相结合,则 firewall 角色会在应用新设置前删除所有现有设置。

在 Ansible 控制节点上执行此步骤。

前提条件

  • 您已准备好控制节点和受管节点
  • 以可在受管主机上运行 playbook 的用户登录到控制节点。
  • 用于连接到受管节点的帐户对其具有 sudo 权限。
  • 要在其上运行此 playbook 的受管节点或受管节点组列在 Ansible 清单文件中。

流程

  1. 创建包含以下内容的 playbook 文件,如 ~/reset-firewalld.yml

    ---
    - name: Reset firewalld example
      hosts: managed-node-01.example.com
      tasks:
      - name: Reset firewalld
        include_role:
          name: rhel-system-roles.firewall
    
        vars:
          firewall:
            - previous: replaced
  2. 验证 playbook 语法:

    # ansible-playbook ~/configure-ethernet-device-with-ethtoolcoalesce-settings.yml --syntax-check

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

  3. 运行 playbook:

    # ansible-playbook ~/reset-firewalld.yml

验证

  • 在受管节点上以 root 用户身份运行这个命令,以检查所有区域:

    # firewall-cmd --list-all-zones

其他资源

  • /usr/share/ansible/roles/rhel-system-roles.firewall/README.md

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

使用 firewall 角色,您可以远程配置 firewalld 参数,使其对多个受管主机有效。

在 Ansible 控制节点上执行此步骤。

前提条件

  • 您已准备好控制节点和受管节点
  • 以可在受管主机上运行 playbook 的用户登录到控制节点。
  • 用于连接到受管节点的帐户对其具有 sudo 权限。
  • 要在其上运行此 playbook 的受管节点或受管节点组列在 Ansible 清单文件中。

流程

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

    ---
    - name: Configure firewalld
      hosts: managed-node-01.example.com
      tasks:
      - name: Forward incoming traffic on port 8080 to 443
        include_role:
          name: rhel-system-roles.firewall
    
        vars:
          firewall:
            - { forward_port: 8080/tcp;443;, state: enabled, runtime: true, permanent: true }
  2. 验证 playbook 语法:

    # ansible-playbook ~/port_forwarding.yml --syntax-check

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

  3. 运行 playbook:

    # ansible-playbook ~/port_forwarding.yml

验证

  • 在受管主机上显示 firewalld 设置:

    # firewall-cmd --list-forward-ports

其他资源

  • /usr/share/ansible/roles/rhel-system-roles.firewall/README.md

9.17.4. 使用 RHEL 系统角色管理 firewalld 中的端口

您可以使用 RHEL firewall 系统角色为入站流量在本地防火墙中打开或关闭端口,并使新配置在重启后保留不变。例如,您可以将默认区配置为允许 HTTPS 服务的传入流量。

在 Ansible 控制节点上执行此步骤。

前提条件

  • 您已准备好控制节点和受管节点
  • 以可在受管主机上运行 playbook 的用户登录到控制节点。
  • 用于连接到受管节点的帐户对其具有 sudo 权限。
  • 要在其上运行此 playbook 的受管节点或受管节点组列在 Ansible 清单文件中。

流程

  1. 创建包含以下内容的 playbook 文件,如 ~/opening-a-a-port.yml

    ---
    - name: Configure firewalld
      hosts: managed-node-01.example.com
      tasks:
      - name: Allow incoming HTTPS traffic to the local host
        include_role:
          name: rhel-system-roles.firewall
    
        vars:
          firewall:
            - port: 443/tcp
              service: http
              state: enabled
              runtime: true
              permanent: true

    permanent: true 选项可使新设置在重启后保持不变。

  2. 验证 playbook 语法:

    # ansible-playbook ~/opening-a-port.yml --syntax-check

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

  3. 运行 playbook:

    # ansible-playbook ~/opening-a-port.yml

验证

  • 在受管节点上,验证与 HTTPS 服务关联的 443/tcp 端口是否已打开:

    # firewall-cmd --list-ports
    443/tcp

其他资源

  • /usr/share/ansible/roles/rhel-system-roles.firewall/README.md

9.17.5. 使用 RHEL 系统角色配置 firewalld DMZ 区

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

在 Ansible 控制节点上执行此步骤。

前提条件

  • 您已准备好控制节点和受管节点
  • 以可在受管主机上运行 playbook 的用户登录到控制节点。
  • 用于连接到受管节点的帐户对其具有 sudo 权限。
  • 要在其上运行此 playbook 的受管节点或受管节点组列在 Ansible 清单文件中。

流程

  1. 创建包含以下内容的 playbook 文件,如 ~/configuring-a-dmz.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
        include_role:
          name: rhel-system-roles.firewall
    
        vars:
          firewall:
            - zone: dmz
              interface: enp1s0
              service: https
              state: enabled
              runtime: true
              permanent: true
  2. 验证 playbook 语法:

    # ansible-playbook ~/configuring-a-dmz.yml --syntax-check

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

  3. 运行 playbook:

    # ansible-playbook ~/configuring-a-dmz.yml

验证

  • 在受管节点上,查看关于 dmz 区的详细信息:

    # firewall-cmd --zone=dmz --list-all
    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