linux – 使用Puppet管理iptables
|
已经提出了用Puppet管理我们的iptables规则的想法.我看到augeas有一个iptables镜头但它目前是实验性的. 有没有人对如何处理这个有任何建议?理想情况下,我想基于服务器类构建链. 解决方法这就是我在使用Red Hat Enterprise(RHEL)时所做的.RHEL有一个iptables服务,它从/ etc / sysconfig / iptables加载规则,我正在修改该文件并重新启动iptables服务.许多人喜欢将片段放入iptables.d目录并构建一个iptables(通过make或类似的东西)规则集.我包含了用于重建默认规则集的内容,但通常从不执行任何操作.如果您的需求很简单,您只需将iptables文件复制到系统即可. 尽管看起来有多丑,但它在RHEL4,RHEL5和RHEL6上进行了彻底的测试. 在augeas支持傀儡之前,我已经做到了这一点.如果我今天再次写它,我会先看看augeas iptables镜头,然后再使用exec {“perl …”:}. 一些全局定义用于编辑文件 基于最初来自http://reductivelabs.com/trac/puppet/wiki/SimpleTextRecipes的东西 # Ensure that the line "line" exists in "file":
# Usage:
# append_if_no_such_line { dummy_modules:
# file => "/etc/modules",# line => dummy
# }
#
define append_if_no_such_line($file,$line,$refreshonly = 'false') {
exec { "/bin/echo '$line' >> '$file'":
unless => "/bin/grep -Fxqe '$line' '$file'",refreshonly => $refreshonly,}
}
# Ensure that the line "line" exists in "file":
# Usage:
# prepend_if_no_such_line { dummy_modules:
# file => "/etc/modules",# line => dummy
# }
#
define prepend_if_no_such_line($file,$refreshonly = 'false') {
$line_no_slashes = slash_escape($line)
exec { "/usr/bin/perl -p0i -e 's/^/$line_no_slashesn/;' '$file'":
unless => "/bin/grep -Fxqe '$line' '$file'",}
}
define insert_line_after_if_no_such_line($file,$after) {
$line_no_slashes = slash_escape($line)
$after_no_slashes = slash_escape($after)
exec { "/usr/bin/perl -p0i -e 's/^($after_no_slashes)$/$1n$line_no_slashes/m' '$file'":
onlyif => "/usr/bin/perl -ne 'BEGIN { $ret = 0; } $ret = 1 if /^$line_no_slashes/; END { exit $ret; }' '$file'",}
}
define insert_line_before_if_no_such_line($file,$beforeline) {
$line_no_slashes = slash_escape($line)
$before_no_slashes = slash_escape($beforeline)
exec { "/usr/bin/perl -p0i -e 's/^($before_no_slashes)$/$line_no_slashesn$1/m' '$file'":
onlyif => "/usr/bin/perl -ne 'BEGIN { $ret = 0; } $ret = 1 if /^$line_no_slashes/; END { exit $ret; }' '$file'",}
}
我的iptables类: class iptables {
if $lsbmajdistrelease >= '6' {
$primarychain = 'INPUT'
} else {
$primarychain = 'RH-Firewall-1-INPUT'
}
package {
iptables:
ensure => installed # "latest" would be too much
}
service {
iptables:
enable => true,# default on
ensure => running,# start it up if it's stopped
hasstatus => true,# since there's no daemon
}
file {
"/etc/sysconfig/iptables":
ensure => present;
}
##
# Build up a config if it's missing components we expect; should
# automatically repair a config if it's broken for really simple reasons
##
# Very first thing: a comment at the top warning about our evil; add even if
# we're not touching anything else...
prepend_if_no_such_line {
"/etc/sysconfig/iptables comment":
file => "/etc/sysconfig/iptables",line => "# This file partially managed by puppet; attempts to edit will result in magic reappearances"
}
# start
# *filter
insert_line_after_if_no_such_line {
"/etc/sysconfig/iptables *filter":
file => "/etc/sysconfig/iptables",line => "*filter",after => "#.*",notify => Service[iptables],}
# first default chain
# :INPUT ACCEPT [0:0]
insert_line_after_if_no_such_line {
"/etc/sysconfig/iptables:INPUT":
file => "/etc/sysconfig/iptables",line => ":INPUT ACCEPT [0:0]",after => "*filter",}
# second default chain
# :FORWARD ACCEPT [0:0]
insert_line_after_if_no_such_line {
"/etc/sysconfig/iptables:FORWARD":
file => "/etc/sysconfig/iptables",line => ":FORWARD ACCEPT [0:0]",after => ":INPUT ACCEPT [d+:d+]",}
# third default chain
# :OUTPUT ACCEPT [0:0]
insert_line_after_if_no_such_line {
"/etc/sysconfig/iptables:OUTPUT":
file => "/etc/sysconfig/iptables",line => ":OUTPUT ACCEPT [0:0]",after => ":FORWARD ACCEPT [d+:d+]",}
if $lsbmajdistrelease <= 5 {
# Finally,the RH special chain
# :RH-Firewall-1-INPUT - [0:0]
insert_line_after_if_no_such_line {
"/etc/sysconfig/iptables:RH-Firewall-1-INPUT":
file => "/etc/sysconfig/iptables",line => ":RH-Firewall-1-INPUT - [0:0]",after => ":OUTPUT ACCEPT [d+:d+]",}
# redirect INPUT to RH chain
# -A INPUT -j RH-Firewall-1-INPUT
insert_line_after_if_no_such_line {
"/etc/sysconfig/iptables:INPUT:RH-Firewall-1-INPUT":
file => "/etc/sysconfig/iptables",line => "-A INPUT -j RH-Firewall-1-INPUT",after => ":RH-Firewall-1-INPUT - [d+:d+]",}
# redirect FORWARD to RH chain
# -A FORWARD -j RH-Firewall-1-INPUT
insert_line_after_if_no_such_line {
"/etc/sysconfig/iptables:FORWARD:RH-Firewall-1-INPUT":
file => "/etc/sysconfig/iptables",line => "-A FORWARD -j RH-Firewall-1-INPUT",after => "-A INPUT -j RH-Firewall-1-INPUT",}
}
# Let anything on localhost work...
# -A $primarychain -i lo -j ACCEPT
insert_line_after_if_no_such_line {
"/etc/sysconfig/iptables:$primarychain lo":
file => "/etc/sysconfig/iptables",line => "-A $primarychain -i lo -j ACCEPT",after => "-A FORWARD -j $primarychain",}
# And let through all the ICMP stuff:
# -A $primarychain -p icmp --icmp-type any -j ACCEPT
if $lsbmajdistrelease >= '6' {
insert_line_after_if_no_such_line {
"/etc/sysconfig/iptables:$primarychain icmp":
file => "/etc/sysconfig/iptables",line => "-A $primarychain -p icmp -j ACCEPT",after => "-A $primarychain -i lo -j ACCEPT",}
} else {
insert_line_after_if_no_such_line {
"/etc/sysconfig/iptables:$primarychain icmp":
file => "/etc/sysconfig/iptables",line => "-A $primarychain -p icmp --icmp-type any -j ACCEPT",}
}
# Finally,let anything that's part of an exisiting connection through:
# -A $primarychain -m state --state ESTABLISHED,RELATED -j ACCEPT
insert_line_after_if_no_such_line {
"/etc/sysconfig/iptables:ESTABLISHED":
file => "/etc/sysconfig/iptables",line => "-A $primarychain -m state --state ESTABLISHED,RELATED -j ACCEPT",after => "-A $primarychain -p icmp --icmp-type any -j ACCEPT",}
# Very last thing:
# COMMIT
append_if_no_such_line {
"/etc/sysconfig/iptables:COMMIT":
file => "/etc/sysconfig/iptables",line => "COMMIT",}
# Next to last thing: reject!
# -A $primarychain -j REJECT --reject-with icmp-host-prohibited
insert_line_before_if_no_such_line {
"/etc/sysconfig/iptables:final reject":
file => "/etc/sysconfig/iptables",line => "-A $primarychain -j REJECT --reject-with icmp-host-prohibited",beforeline => "COMMIT",notify => Service[iptables],}
}
# example:
# iptable_rule { "iptable:ssh":
# rule => "-m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT"
# }
# change your mind about a rule,do this:
# iptable_rule { "iptable:ssh":
# rule => "-m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT",# ensure => "absent",# }
define iptable_rule($rule,$ensure = 'present') {
if $lsbmajdistrelease >= '6' {
$primarychain = 'INPUT'
} else {
$primarychain = 'RH-Firewall-1-INPUT'
}
$iptablesline = "-A $primarychain $rule"
case $ensure {
default: { err ( "unknown ensure value $ensure" ) }
present: {
insert_line_before_if_no_such_line {
"/etc/sysconfig/iptables:add $rule":
file => "/etc/sysconfig/iptables",line => $iptablesline,beforeline => "-A $primarychain -j REJECT --reject-with icmp-host-prohibited",}
}
absent: {
delete_lines {
"/etc/sysconfig/iptables:remove $rule":
file => "/etc/sysconfig/iptables",pattern => $iptablesline,notify => Service[iptables],}
}
}
}
# Example:
# iptable_tcp_port { "iptable:ssh":
# port => "22",# }
# Example:
# iptable_tcp_port { "iptable:oracle:130.157.5.0/24":
# port => "1521",# source => "130.157.5.0/24",# }
# (add ensure => "absent" to remove)
define iptable_tcp_port($port,$ensure = 'present',$source = 'ANY') {
case $source {
"ANY": {
iptable_rule {
"iptable_tcp_port:$port":
rule => "-m state --state NEW -m tcp -p tcp --dport $port -j ACCEPT",ensure => $ensure,}
}
default: {
iptable_rule {
"iptable_tcp_port:$port:$source":
rule => "-m state --state NEW -m tcp -p tcp --source $source --dport $port -j ACCEPT",}
}
}
}
# Example:
# iptable_udp_port { "iptable:ntp":
# port => "123",# }
# (again,ensure => "absent" if needed)
define iptable_udp_port($port,$source = 'ANY') {
case $source {
"ANY": {
iptable_rule {
"iptable_udp_port:$port":
rule => "-p udp -m udp --dport $port -j ACCEPT",}
}
default: {
iptable_rule {
"iptable_udp_port:$port":
rule => "-p udp -m udp --source $source --dport $port -j ACCEPT",}
}
}
}
(编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
