From d4b8909eab6194da389b121e46137da7618eb45c Mon Sep 17 00:00:00 2001 From: Tim Meusel Date: Mon, 30 Sep 2019 14:51:12 +0200 Subject: implement ipset support --- manifests/ipset.pp | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 manifests/ipset.pp (limited to 'manifests/ipset.pp') diff --git a/manifests/ipset.pp b/manifests/ipset.pp new file mode 100644 index 0000000..fab7894 --- /dev/null +++ b/manifests/ipset.pp @@ -0,0 +1,62 @@ +# +# @summary a defined resource that can match for ipsets at the top of a chain. This is a per-chain resource. You cannot mix IPv4 and IPv6 sets. +# +# @see http://ferm.foo-projects.org/download/2.1/ferm.html#set +# +# @example +# ferm::ipset { 'CONSUL': +# sets => { +# 'internet' => 'ACCEPT' +# }, +# } +# +# @example create to matches for IPv6, both at the end of the `INPUT` chain. Explicitly mention the `filter` table. +# ferm::ipset { 'INPUT': +# prepend_to_chain => false, +# table => 'filter', +# ip_version => 'ip6', +# sets => { +# 'testset01' => 'ACCEPT', +# 'anothertestset' => 'DROP' +# }, +# } +# +# @param chain +# name of the chain we want to apply those rules to. The name of the defined resource will be used as default value for this. +# +# @param table +# name of the table where we want to apply this. Defaults to `filter` because that's the most common usecase. +# +# @param ip_version +# sadly, ip sets are version specific. You cannot mix IPv4 and IPv6 addresses. Because of this you need to provide the version. +# +# @param sets +# A hash with multiple sets. For each hash you can provide an action like `DROP` or `ACCEPT`. +# +define ferm::ipset ( + Hash[String[1], Ferm::Actions] $sets, + String[1] $chain = $name, + Ferm::Tables $table = 'filter', + Enum['ip','ip6'] $ip_version = 'ip', + Boolean $prepend_to_chain = true, +) { + + $suffix = $prepend_to_chain ? { + true => 'aaa', + false => 'ccc', + } + + # make sure the generated snippet is actually included + concat::fragment{"${table}-${chain}-ipset": + target => $ferm::configfile, + content => epp( + "${module_name}/ferm-chain-ipset.epp", { + 'ip' => $ip_version, + 'table' => $table, + 'chain' => $chain, + 'sets' => $sets, + } + ), + order => "${table}-${chain}-${suffix}", + } +} -- cgit v1.2.3