puppet-firewall模块
iptables是一个配置Linux内核防火墙的命令行工具,通过设定一些特殊的规则,以允许或拒绝数据包通过。
puppet-firewall模块是由Puppet公司维护的官方模块, 用于管理防火墙和其规则。该模块通过扩展自定义资源类型来管理firewall规则和 iptables chains, 当前支持iptables和ip6tables。
puppet-firewall项目地址:'https://github.com/puppetlabs/puppetlabs-firewall'
1.先睹为快
不想看下面大段的代码解析,已经跃跃欲试了?
先别激动,这个模块的使用是有风险的,操作不慎会把自己也拒之门外,请确保可以通过除ssh外的方式登陆。
创建learn_firewall.pp文件并编辑:
class my_fw::pre {
Firewall {
require => undef,
}
# Default firewall rules
firewall { '000 accept all icmp':
proto => 'icmp',
action => 'accept',
}->
firewall { '001 accept all to lo interface':
proto => 'all',
iniface => 'lo',
action => 'accept',
}->
firewall { '002 reject local traffic not on loopback interface':
iniface => '! lo',
proto => 'all',
destination => '127.0.0.1/8',
action => 'reject',
}->
firewall { '003 accept related established rules':
proto => 'all',
state => ['RELATED', 'ESTABLISHED'],
action => 'accept',
}
}
class my_fw::post {
firewall { '999 drop all':
proto => 'all',
action => 'drop',
before => undef,
}
}
class my_fw {
firewall { '004 Allow inbound SSH':
dport => 22,
proto => tcp,
action => accept,
provider => 'iptables',
}
firewall { '005 Allow inbound HTTP':
dport => 80,
proto => tcp,
action => accept,
provider => 'iptables',
}
}
Firewall {
before => Class['my_fw::post'],
require => Class['my_fw::pre'],
}
class { ['my_fw::pre', 'my_fw::post','my_fw']: }
class { 'firewall': }在终端下输入以下命令:
$ puppet apply -v learn_firewall.pp
在执行该命令前,操作系统的防火墙规则为空:
在执行完成该命令后,防火墙规则发生了以下变化:
2.代码讲解
2.1 class firewall
class firewallfirewall类用于管理Iptables软件包和服务,会根据内核类型申明不同的类进行管理。
以Linux为例,firewall::linux会根据操作系统的不同调用对应的firewall::linux::xxx类:
以RedHat为例,firewall::linux::redhat会根据操作系统和版本的不同跳转到相应的逻辑。通过这个模块可以发现,firewall类仅完成了安装软件包 和管理服务状态,但要维护一个支持多平台和版本的模块并非易事,需要投入大量的精力进去,这也是社区模式可以得到众多公司认可的原因。
在上述代码中,需要理解以下新知识点:
第一点,versioncmp函数用于比较两个版本号并返回比较结果,例如:
$result = versioncmp(a, b)
a大于b,返回1
a等于b,返回0
a小于b,返回-1
第二点,要理解运算的优先级顺序,在上述代码出现了一段比较复杂的条件语句:
首先()的优先级最高,因此以下表达式会优先进行计算:
($::operatingsystem != 'Amazon')
(($::operatingsystem != 'Fedora' and versioncmp($::operatingsystemrelease, '7.0') >= 0))
($::operatingsystem == 'Fedora' and versioncmp($::operatingsystemrelease, '15') >= 0))
其次,==的优先级等于!=高于>=高于and。 最后是最外层的and/or运算if statement1 and statement2 or statement 3,那么其运算顺序是哪一种?
if (statement1 and statement2) or (statement 3)
if statement1 and (statement2 or statement 3)
答案是前一种,因为and的优先级高于or
第三点,掌握case条件语句的语法。
case条件语句和if条件语句类似,均是选择其中的一个Puppet代码块进行执行,但其更适合用于字符串和数值的匹配。
2.2 type firewall
type firewall资源类型firewall用于管理防火墙规则,以下举例说明如何在真实环境中使用该类型:
2.2.1 为apache开启80和443端口
2.2.2 丢弃FIN/RST/ACK包如果没有对应的SYN包
2.2.3 SNAT 10.1.2.0/24
2.3 type firewallchain
type firewallchain资源类型firewallchain用于管理管理防火墙的规则链,以下举例说明如何在真实环境中使用该类型:
2.3.1 默认丢弃INPUT链上的包
需要说明的是,这个模块有一定的 局限性,如只支持管理iptable和ip6tables。此外,在和Neutron同时使用时会遇到iptable规则的冲突问题。
3.扩展阅读
4.动手练习
本章给出的第一个示例learn_firewall.pp存在一些问题,当修改防火墙规则时,旧的规则不会被删除,请修复这个问题
为OpenStack Nova服务编写firewall规则,开放相应的服务端口
Last updated
Was this helpful?