# Reference ## Table of Contents ### Classes #### Public Classes * [`ferm`](#ferm): This class manages ferm installation and rule generation on modern linux systems #### Private Classes * `ferm::config`: This class handles the configuration file. Avoid modifying private classes. * `ferm::install`: This class handles the configuration file. Avoid modifying private classes. * `ferm::service`: This class handles the configuration file. Avoid modifying private classes. ### Defined types * [`ferm::chain`](#fermchain): This defined resource manages ferm/iptables chains * [`ferm::ipset`](#fermipset): 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. * [`ferm::rule`](#fermrule): This defined resource manages a single rule in a specific chain ### Data types * [`Ferm::Actions`](#fermactions): a list of allowed actions for a rule * [`Ferm::Policies`](#fermpolicies): a list of allowed policies for a chain * [`Ferm::Port`](#fermport): ferm port-spec * [`Ferm::Protocols`](#fermprotocols): a list of allowed protocolls to match * [`Ferm::Tables`](#fermtables): a list of available tables ## Classes ### `ferm` This class manages ferm installation and rule generation on modern linux systems #### Examples ##### deploy ferm without any configured rules, but also don't start the service or modify existing config files ```puppet include ferm ``` ##### deploy ferm and start it, on nodes with only ipv6 enabled ```puppet class{'ferm': manage_service => true, ip_versions => ['ip6'], } ``` ##### deploy ferm and don't touch chains from other software, like fail2ban and docker ```puppet class{'ferm': manage_service => true, preserve_chains_in_tables => { 'filter' => [ 'f2b-sshd', 'DOCKER', 'DOCKER-ISOLATION-STAGE-1', 'DOCKER-ISOLATION-STAGE-2', 'DOCKER-USER', 'FORWARD', ], 'nat' => [ 'DOCKER', ], }, } ``` #### Parameters The following parameters are available in the `ferm` class: * [`manage_service`](#manage_service) * [`manage_configfile`](#manage_configfile) * [`configfile`](#configfile) * [`configdirectory`](#configdirectory) * [`forward_disable_conntrack`](#forward_disable_conntrack) * [`output_disable_conntrack`](#output_disable_conntrack) * [`input_disable_conntrack`](#input_disable_conntrack) * [`forward_policy`](#forward_policy) * [`output_policy`](#output_policy) * [`input_policy`](#input_policy) * [`input_drop_invalid_packets_with_conntrack`](#input_drop_invalid_packets_with_conntrack) * [`rules`](#rules) * [`chains`](#chains) * [`forward_log_dropped_packets`](#forward_log_dropped_packets) * [`output_log_dropped_packets`](#output_log_dropped_packets) * [`input_log_dropped_packets`](#input_log_dropped_packets) * [`ip_versions`](#ip_versions) * [`preserve_chains_in_tables`](#preserve_chains_in_tables) * [`install_method`](#install_method) * [`package_ensure`](#package_ensure) * [`vcsrepo`](#vcsrepo) * [`vcstag`](#vcstag) ##### `manage_service` Data type: `Boolean` Disable/Enable the management of the ferm daemon Default value: ``false`` ##### `manage_configfile` Data type: `Boolean` Disable/Enable the management of the ferm default config Default value: ``false`` ##### `configfile` Data type: `Stdlib::Absolutepath` Path to the config file ##### `configdirectory` Data type: `Stdlib::Absolutepath` Path to the directory where the module stores ferm configuration files ##### `forward_disable_conntrack` Data type: `Boolean` Enable/Disable the generation of conntrack rules for the FORWARD chain Default value: ``true`` ##### `output_disable_conntrack` Data type: `Boolean` Enable/Disable the generation of conntrack rules for the OUTPUT chain Default value: ``true`` ##### `input_disable_conntrack` Data type: `Boolean` Enable/Disable the generation of conntrack rules for the INPUT chain Default value: ``false`` ##### `forward_policy` Data type: `Ferm::Policies` Default policy for the FORWARD chain Default value: `'DROP'` ##### `output_policy` Data type: `Ferm::Policies` Default policy for the OUTPUT chain Default value: `'ACCEPT'` ##### `input_policy` Data type: `Ferm::Policies` Default policy for the INPUT chain Default value: `'DROP'` ##### `input_drop_invalid_packets_with_conntrack` Data type: `Boolean` Enable/Disable the `mod conntrack ctstate INVALID DROP` statement. Only works if `$disable_conntrack` is `false`. You can set this to false if your policy is DROP. This only effects the INPUT chain. Default value: ``false`` ##### `rules` Data type: `Hash` A hash that holds all data for ferm::rule Default value: `{}` ##### `chains` Data type: `Hash` A hash that holds all data for ferm::chain Default value: `{}` ##### `forward_log_dropped_packets` Data type: `Boolean` Enable/Disable logging in the FORWARD chain of packets to the kernel log, if no explicit chain matched Default value: ``false`` ##### `output_log_dropped_packets` Data type: `Boolean` Enable/Disable logging in the OUTPUT chain of packets to the kernel log, if no explicit chain matched Default value: ``false`` ##### `input_log_dropped_packets` Data type: `Boolean` Enable/Disable logging in the INPUT chain of packets to the kernel log, if no explicit chain matched Default value: ``false`` ##### `ip_versions` Data type: `Array[Enum['ip','ip6']]` Set list of versions of ip we want ot use. Default value: `['ip','ip6']` ##### `preserve_chains_in_tables` Data type: `Hash[String[1],Array[String[1]]]` Hash with table:chains[] to use ferm @preserve for (since ferm v2.4) Example: {'nat' => ['PREROUTING', 'POSTROUTING']} Default value: `{}` ##### `install_method` Data type: `Enum['package','vcsrepo']` method used to install ferm Default value: `'package'` ##### `package_ensure` Data type: `String[1]` sets the ensure parameter for the package resource Default value: `'installed'` ##### `vcsrepo` Data type: `Stdlib::HTTPSUrl` git repository where ferm sources are hosted Default value: `'https://github.com/MaxKellermann/ferm.git'` ##### `vcstag` Data type: `String[1]` git tag used when install_method is vcsrepo Default value: `'v2.5.1'` ## Defined types ### `ferm::chain` This defined resource manages ferm/iptables chains #### Examples ##### create a custom chain, e.g. for all incoming SSH connections ```puppet ferm::chain{'check-ssh': chain => 'SSH', disable_conntrack => true, log_dropped_packets => true, } ``` #### Parameters The following parameters are available in the `ferm::chain` defined type: * [`disable_conntrack`](#disable_conntrack) * [`drop_invalid_packets_with_conntrack`](#drop_invalid_packets_with_conntrack) * [`log_dropped_packets`](#log_dropped_packets) * [`policy`](#policy) * [`chain`](#chain) * [`table`](#table) * [`ip_versions`](#ip_versions) * [`content`](#content) ##### `disable_conntrack` Data type: `Boolean` Disable/Enable usage of conntrack. By default, we enable conntrack only for the filter INPUT chain Default value: ``true`` ##### `drop_invalid_packets_with_conntrack` Data type: `Boolean` Enable/Disable the `mod conntrack ctstate INVALID DROP` statement. Only works if `$disable_conntrack` is `false` in this chain. You can set this to false if your policy is DROP. Default value: ``false`` ##### `log_dropped_packets` Data type: `Boolean` Enable/Disable logging of packets to the kernel log, if no explicit chain matched Default value: ``false`` ##### `policy` Data type: `Optional[Ferm::Policies]` Set the default policy for CHAIN (works only for builtin chains) Allowed values: (ACCEPT|DROP) (see Ferm::Policies type) Default value: ``undef`` ##### `chain` Data type: `String[1]` Name of the chain that should be managed Allowed values: String[1] Default value: `$name` ##### `table` Data type: `Ferm::Tables` Select the target table (filter/raw/mangle/nat) Allowed values: (filter|raw|mangle|nat) (see Ferm::Tables type) Default value: `'filter'` ##### `ip_versions` Data type: `Array[Enum['ip', 'ip6']]` Set list of versions of ip we want ot use. Default value: `$ferm::ip_versions` ##### `content` Data type: `Optional[String[1]]` custom string that will be written into th chain file Default value: ``undef`` ### `ferm::ipset` 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 also** * http://ferm.foo-projects.org/download/2.1/ferm.html#set #### Examples ##### Create an iptables rule that allows traffic that matches the ipset `internet` ```puppet ferm::ipset { 'CONSUL': sets => { 'internet' => 'ACCEPT' }, } ``` ##### create two matches for IPv6, both at the end of the `INPUT` chain. Explicitly mention the `filter` table. ```puppet ferm::ipset { 'INPUT': prepend_to_chain => false, table => 'filter', ip_version => 'ip6', sets => { 'testset01' => 'ACCEPT', 'anothertestset' => 'DROP' }, } ``` #### Parameters The following parameters are available in the `ferm::ipset` defined type: * [`sets`](#sets) * [`chain`](#chain) * [`table`](#table) * [`ip_version`](#ip_version) * [`prepend_to_chain`](#prepend_to_chain) ##### `sets` Data type: `Hash[String[1], Ferm::Actions]` A hash with multiple sets. For each hash you can provide an action like `DROP` or `ACCEPT`. ##### `chain` Data type: `String[1]` 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. Default value: `$name` ##### `table` Data type: `Ferm::Tables` name of the table where we want to apply this. Defaults to `filter` because that's the most common usecase. Default value: `'filter'` ##### `ip_version` Data type: `Enum['ip','ip6']` sadly, ip sets are version specific. You cannot mix IPv4 and IPv6 addresses. Because of this you need to provide the version. Default value: `'ip'` ##### `prepend_to_chain` Data type: `Boolean` By default, ipset rules are added to the top of the chain. Set this to false to append them to the end instead. Default value: ``true`` ### `ferm::rule` This defined resource manages a single rule in a specific chain #### Examples ##### Jump to the 'SSH' chain for all incoming SSH traffic (see chain.pp examples on how to create the chain) ```puppet ferm::rule{'incoming-ssh': chain => 'INPUT', action => 'SSH', proto => 'tcp', dport => 22, } ``` ##### Create a rule in the 'SSH' chain to allow connections from localhost ```puppet ferm::rule{'allow-ssh-localhost': chain => 'SSH', action => 'ACCEPT', proto => 'tcp', dport => 22, saddr => '127.0.0.1', } ``` ##### Confuse people that do a traceroute/mtr/ping to your system ```puppet ferm::rule{'drop-icmp-time-exceeded': chain => 'OUTPUT', action => 'DROP', proto => 'icmp', proto_options => 'icmp-type time-exceeded', } ``` ##### allow multiple protocols ```puppet ferm::rule{'allow_consul': chain => 'INPUT', action => 'ACCEPT', proto => ['udp', 'tcp'], dport => 8301, } ``` #### Parameters The following parameters are available in the `ferm::rule` defined type: * [`chain`](#chain) * [`proto`](#proto) * [`comment`](#comment) * [`action`](#action) * [`dport`](#dport) * [`sport`](#sport) * [`saddr`](#saddr) * [`daddr`](#daddr) * [`proto_options`](#proto_options) * [`interface`](#interface) * [`ensure`](#ensure) * [`table`](#table) ##### `chain` Data type: `String[1]` Configure the chain where we want to add the rule ##### `proto` Data type: `Ferm::Protocols` Which protocol do we want to match, typically UDP or TCP ##### `comment` Data type: `String` A comment that will be added to the ferm config and to ip{,6}tables Default value: `$name` ##### `action` Data type: `Ferm::Actions` Configure what we want to do with the packet (drop/accept/reject, can also be a target chain name). The parameter is mandatory. Allowed values: (RETURN|ACCEPT|DROP|REJECT|NOTRACK|LOG|MARK|DNAT|SNAT|MASQUERADE|REDIRECT|String[1]) ##### `dport` Data type: `Optional[Ferm::Port]` The destination port, can be a single port number as integer or an Array of integers (which will then use the multiport matcher) Default value: ``undef`` ##### `sport` Data type: `Optional[Ferm::Port]` The source port, can be a single port number as integer or an Array of integers (which will then use the multiport matcher) Default value: ``undef`` ##### `saddr` Data type: `Optional[Variant[Array, String[1]]]` The source address we want to match Default value: ``undef`` ##### `daddr` Data type: `Optional[Variant[Array, String[1]]]` The destination address we want to match Default value: ``undef`` ##### `proto_options` Data type: `Optional[String[1]]` Optional parameters that will be passed to the protocol (for example to match specific ICMP types) Default value: ``undef`` ##### `interface` Data type: `Optional[String[1]]` an Optional interface where this rule should be applied Default value: ``undef`` ##### `ensure` Data type: `Enum['absent','present']` Set the rule to present or absent Default value: `'present'` ##### `table` Data type: `Ferm::Tables` Select the target table (filter/raw/mangle/nat) Default value: filter Allowed values: (filter|raw|mangle|nat) (see Ferm::Tables type) Default value: `'filter'` ## Data types ### `Ferm::Actions` As you can also *jump* to other chains, each chain-name is also a valid action/target Alias of ```puppet Variant[Enum['RETURN', 'ACCEPT', 'DROP', 'REJECT', 'NOTRACK', 'LOG', 'MARK', 'DNAT', 'SNAT', 'MASQUERADE', 'REDIRECT'], String[1]] ``` ### `Ferm::Policies` a list of allowed policies for a chain Alias of ```puppet Enum['ACCEPT', 'DROP'] ``` ### `Ferm::Port` allowed variants: ----------------- + single Integer port + Array of Integers (creates a multiport matcher) + ferm range port-spec (pair of colon-separated integer, assumes 0 if first is omitted) Alias of ```puppet Variant[Stdlib::Port, Array[Stdlib::Port], Pattern['^\d*:\d+$']] ``` ### `Ferm::Protocols` a list of allowed protocolls to match Alias of ```puppet Variant[Integer[0, 255], Array[Integer[0, 255]], Enum['icmp', 'tcp', 'udp', 'udplite', 'icmpv6', 'esp', 'ah', 'sctp', 'mh', 'all'], Array[Enum['icmp', 'tcp', 'udp', 'udplite', 'icmpv6', 'esp', 'ah', 'sctp', 'mh', 'all']]] ``` ### `Ferm::Tables` a list of available tables Alias of ```puppet Enum['raw', 'mangle', 'nat', 'filter'] ```