搜索

2.7. 配置防火墙

download PDF

Web 服务器需要一个开放端口,以便用户可以访问在我们的 Web 服务器上托管的页面。开放问题是,不同版本的 Red Hat Enterprise Linux 使用不同的方法来控制防火墙。对于 Red Hat Enterprise Linux 6 及以下,我们使用 iptables。对于 Red Hat Enterprise Linux 7,我们使用 firewalld

这一决策是使用条件逻辑和系统事实来处理的 Puppet。对于此步骤,我们添加一个语句来检查操作系统并运行相应的防火墙命令。

在您的 mymodule::httpd 类中添加以下代码:

  if versioncmp($::operatingsystemmajrelease, '6') <= 0 {
    exec { 'iptables':
      command => "iptables -I INPUT 1 -p tcp -m multiport --ports ${httpd_port} -m comment --comment 'Custom HTTP Web Host' -j ACCEPT &amp;&amp; iptables-save > /etc/sysconfig/iptables",
      path => "/sbin",
      refreshonly => true,
      subscribe => Package['httpd'],
    }
    service { 'iptables':
      ensure => running,
      enable => true,
      hasrestart => true,
      subscribe => Exec['iptables'],
    }
  }
  elsif $operatingsystemmajrelease == 7 {
    exec { 'firewall-cmd':
      command => "firewall-cmd --zone=public --add-port=${httpd_port}/tcp --permanent",
      path => "/usr/bin/",
      refreshonly => true,
      subscribe => Package['httpd'],
    }
    service { 'firewalld':
      ensure => running,
      enable => true,
      hasrestart => true,
      subscribe => Exec['firewall-cmd'],
    }
  }

这个代码执行以下操作:

  • 使用 操作系统majrelease 事实来确定操作系统是否为 Red Hat Enterprise Linux 6 还是 7。
  • 如果使用 Red Hat Enterprise Linux 6,则声明一个运行 iptablesiptables-save 的可执行(执行)资源来添加永久防火墙规则。httpd_port 变量是内嵌的,以定义要打开的端口。在 exec 资源完成后,我们触发 iptables 服务的刷新。为此,我们定义了一个服务资源,其中包含 subscribe 属性。此属性检查是否有对另一个资源的更改,如果是,则执行刷新。在这种情况下,它会检查 iptables 可执行文件资源。
  • 如果使用 Red Hat Enterprise Linux 7,声明了运行 firewall-cmd 的类似可执行文件资源来添加持久防火墙规则。此外,也使用 httpd_port 变量来定义要打开的端口。在 exec 资源完成后,我们触发 firewalld 服务的刷新,但使用 subscribe 属性指向 firewall-cmd 可执行资源。
  • 两个防火墙可执行文件的代码包含 刷新只刷新的 10.10.10.2 true并订阅 abrt Package['httpd'] 属性。这样可保证防火墙命令仅在 httpd 安装之后运行。如果没有这些属性,后续运行将添加同一防火墙规则的多个实例。

再次运行 puppet apply 命令,以测试对模块的更改。以下示例是 Red Hat Enterprise Linux 6 的测试:

# puppet apply mymodule/tests/init.pp --noop
...
Notice: /Stage[main]/Mymodule::Httpd/Exec[iptables]/returns: current_value notrun, should be 0 (noop)
...
Notice: /Stage[main]/Mymodule::Httpd/Service[iptables]: Would have triggered 'refresh' from 1 events
...

这些输出通知消息显示防火墙规则创建和执行,以及后续服务刷新(subscription 属性)。

重要

此配置仅充当使用条件语句的示例。如果您以后为您的系统管理多个防火墙规则,建议为防火墙创建自定义资源。使用可执行资源持续链很多 Bash 命令不足。

Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

© 2024 Red Hat, Inc.