bimdata.ferm
Ansible-Rolle Ferm
Diese Rolle installiert und konfiguriert Ferm.
Anforderungen
- Diese Rolle wurde nur mit Ansible >= 2.9 getestet.
Rollen-Variablen
Weitere Informationen zu jeder Option finden Sie in der Ferm-Dokumentation.
Variablen, die für die Installation verwendet werden:
Variablen | Standardwert | Beschreibung |
---|---|---|
ferm_pkg_name | ferm | Der Name des Ferm APT-Pakets. |
ferm_svc_name | ferm | Der Name des Ferm-Dienstes zum Starten/Stoppen des Daemons. |
Variablen für die allgemeine Konfiguration:
Variablen | Standardwert | Beschreibung |
---|---|---|
ferm_main_conf_file | /etc/ferm/ferm.conf | Pfad zur Hauptkonfiguration von Ferm. |
ferm_rules_path | /etc/ferm/ferm.d | Pfad zum Regelverzeichnis von Ferm. |
Die Standardregeln werden in der Hauptkonfigurationsdatei gespeichert, die dann alle Regeln lädt, die im Konfigurationsverzeichnis definiert sind. Dies ermöglicht es Ihnen, andere Regeln zu definieren, die nicht von dieser Rolle verwaltet werden (wenn ferm_delete_unknown_rules
auf false
gesetzt ist).
Variablen für die Regelkonfiguration:
Variablen | Standardwert | Beschreibung |
---|---|---|
ferm_delete_unknown_rulefiles | true | Löscht die Regeln im ferm_rules_path, die von dieser Rolle nicht verwaltet werden. |
ferm_default_domains | ['ip', 'ip6'] | Wenn eine Regel keine Domäne angibt, wird diese verwendet. |
ferm_default_table | filter | Wenn eine Regel keine Tabelle angibt, wird diese verwendet. |
Variablen für die Regeldefinition:
Variablen | Standardwert | Beschreibung |
---|---|---|
ferm_input_policy | DROP | Standard-Input-Politik von Ferm. |
ferm_output_policy | ACCEPT | Standard-Output-Politik von Ferm. |
ferm_forward_policy | DROP | Standard-Forward-Politik von Ferm. |
_ferm_rules | "{{ lookup('template', 'get_vars.j2', template_vars=dict(vartype='rule')) }}" | Liste von Dictionaries, die alle Ferm-Regeln definieren. |
_ferm_vars | "{{ lookup('template', 'get_vars.j2', template_vars=dict(vartype='var')) }}" | Liste von Dictionaries, die alle Ferm-Variablen definieren. |
_ferm_functions | "{{ lookup('template', 'get_vars.j2', template_vars=dict(vartype='function')) }}" | Liste von Dictionaries, die alle Ferm-Funktionen definieren. |
_ferm_hooks | "{{ lookup('template', 'get_vars.j2', template_vars=dict(vartype='hook')) }}" | Liste von Dictionaries, die alle Ferm-Hooks definieren. |
In den meisten Fällen sollten Sie die mit '_' beginnenden Variablen nicht ändern. Templates werden verwendet, um diese Listen mit anderen Variablen zu erstellen.
_ferm_rules
aggregiert alle Variablen, deren Namen mit diesem Regex übereinstimmen:^ferm_.+_rule(s)?$
_ferm_vars
aggregiert alle Variablen, deren Namen mit diesem Regex übereinstimmen:^ferm_.+_var(s)?$
_ferm_functions
aggregiert alle Variablen, deren Namen mit diesem Regex übereinstimmen:^ferm_.+_function(s)?$
_ferm_hooks
aggregiert alle Variablen, deren Namen mit diesem Regex übereinstimmen:^ferm_.+_hook(s)?$
Jede Variable, die diesen Regex entspricht, muss sein:
- ein Dictionary, das eine Regel/Variable/Funktion/Hook definiert oder
- eine Liste von Dictionaries, die eine oder mehrere Regeln/Variablen/Funktionen/Hooks definieren.
Damit können Sie Variablen in mehreren group_vars definieren und diese für Hosts in mehreren Gruppen ohne die Notwendigkeit, die gesamte Liste neu zu schreiben, kumulieren.
Variablen zur Definition des Standard-Regelsatzes:
- Dies konfiguriert den Standard-Regelsatz für die INPUT-Tabelle:
ferm_default_inputs: - "policy {{ ferm_input_policy }};" - interface lo ACCEPT; - "mod conntrack ctstate (RELATED ESTABLISHED) ACCEPT;"
- Dies konfiguriert den Standard-Regelsatz für die OUTPUT-Tabelle:
ferm_default_outputs: - "policy {{ ferm_output_policy }};" - outerface lo ACCEPT; - "mod conntrack ctstate (RELATED ESTABLISHED) ACCEPT;"
- Dies konfiguriert den Standard-Regelsatz für die FORWARD-Tabelle:
ferm_default_forwards: []
Debian 11 verwendet standardmäßig iptables-nft
und wird von Ferm nicht unterstützt.
Seit Debian 11 ignoriert Ferm alternative Einstellungen und zwingt die Verwendung von
iptables-legacy (https://github.com/MaxKellermann/ferm/issues/47)
Variablen | Standardwert | Beschreibung |
---|---|---|
ferm_iptables_path | /usr/sbin/iptables-legacy | Pfad zu iptables-legacy. |
ferm_ip6tables_path | /usr/sbin/ip6tables-legacy | Pfad zu ip6tables-legacy. |
ferm_arptables_path | /usr/sbin/arptables-legacy | Pfad zu arptables-legacy. |
ferm_ebtables_path | /usr/sbin/ebtables-legacy | Pfad zu ebtables-legacy. |
Diese Variablen werden nur auf Debian-Hosts mit Version > 10 verwendet.
Sie konfigurieren das Betriebssystem mit dem alternative
System, um den Wert von ferm_iptables_path
,
ferm_ip6tables_path
, ferm_arptables_path
und ferm_ebtables_path
als Standard-iptables-Befehl festzulegen.
Variablen-Definitionen
Eine Ferm-Variable kann so definiert werden:
ferm_webports_var:
name: web_ports
content:
- 80
- 443
ferm_hosts_vars:
- name: web_front_addr
content:
- 172.29.10.100
- 2a01:baaf::100
Hook-Definitionen
Ein Ferm-Hook kann so definiert werden:
ferm_fail2ban_hooks:
- comment: Fail2ban-Hooks
content: post "type fail2ban-server > /dev/null && (fail2ban-client ping > /dev/null && fail2ban-client reload > /dev/null || true) || true";
- content: flush "type fail2ban-server > /dev/null && (fail2ban-client ping > /dev/null && fail2ban-client reload > /dev/null || true) || true";
Regel-Definitionen
Eine Regel kann auf zwei Arten definiert werden:
ferm_web_rules:
- name: "web_server"
content:
- domains: ['ip'] # Kann weggelassen werden, ferm_default_domains wird verwendet.
chains: ['INPUT'] # Kann weggelassen werden, ferm_default_table wird verwendet.
rules:
- proto tcp dport ($web_ports) mod comment comment "web server" ACCEPT
oder Sie können rohe Regeln definieren:
ferm_web_rules:
- name: "web_server"
raw_content: |
domain (ip) table filter {
chain (INPUT) {
proto tcp dport ($web_ports) mod comment comment "web server" ACCEPT;
}
}
Funktions-Definitionen
Eine Ferm-Funktion kann so definiert werden:
ferm_dnat_function:
comment: "Einfache DNAT (DNAT+Filterregeln)"
content: |
@def &EASY_DNAT($wan_ip, $proto, $port, $dest) = {
domain ip table nat chain PREROUTING daddr $wan_ip proto $proto dport $port DNAT to @ipfilter($dest);
domain (ip ip6) table filter chain FORWARD outerface $dmz_iface daddr $dest proto $proto dport $port ACCEPT;
}
Dann müssen Sie eine rohe Regel verwenden, um sie zu verwenden, etwa so:
ferm_dnat_rules:
- name: "80-dnat-regeln"
raw_content: |
# HTTP(S) web_front
&EASY_DNAT($main_public_ip, tcp, (80 443), $web_front_addr);
Docker-Beispiel
Docker und andere Software möchten möglicherweise ihre eigenen iptables-Regeln verwalten. Dies ist möglich, mit einigen Einschränkungen. Hier ein Beispiel für Docker:
# Keine Regel kann in FORWARD definiert werden, bevor die Regel verwendet wird, um alle
# Regeln von Docker zu erhalten.
ferm_default_forwards: []
# Docker-Regeln bewahren
ferm_docker_preserve_rules:
- name: 99-docker-users.ferm
content:
- domains: ['ip']
chains: ['DOCKER-USER']
rules:
- "RETURN;"
- name: 00-docker-preserve.ferm
content:
- domains: ['ip']
chains:
- DOCKER
- DOCKER-INGRESS
- DOCKER-ISOLATION-STAGE-1
- DOCKER-ISOLATION-STAGE-2
- FORWARD
rules:
- "@preserve;"
- domains: ['ip']
table: nat
chains:
- DOCKER
- DOCKER-INGRESS
- PREROUTING
- OUTPUT
- POSTROUTING
rules:
- "@preserve;"
@preserve
ist ein spezielles Wort, das von ferm
verwendet wird. Es speichert die vorherigen Regeln mit iptables-save
und extrahiert dann alle Regeln für die bewahrten Chains und fügt sie in die neuen Regeln ein.
Abhängigkeiten
Keine
Beispiel-Playbook
in group_vars/all.yml
:
ferm_webports_var:
name: web_ports
content:
- 80
- 443
in group_vars/web.yml
:
ferm_web_rules:
- name: "web_server"
content:
- chains: ['INPUT']
rules:
- proto tcp dport ($web_ports) mod comment comment "web server" ACCEPT
in group_vars/router.yml
:
ferm_interface_vars:
- name: wan_iface
content: ['eth0']
- name: dmz_iface
content: ['eth1']
- name: lan_iface
content:
- eth2
- eth3
ferm_ips_vars:
- name: main_public_ip
content: ['1.2.3.4']
- name: web_front_addr
content:
- 10.0.0.100
- 2a01:baaf::100
ferm_dnat_function:
comment: "Einfache DNAT (DNAT+Filterregeln)"
content: |
@def &EASY_DNAT($wan_ip, $proto, $port, $dest) = {
domain ip table nat chain PREROUTING daddr $wan_ip proto $proto dport $port DNAT to @ipfilter($dest);
domain (ip ip6) table filter chain FORWARD outerface $dmz_iface daddr $dest proto $proto dport $port ACCEPT;
}
ferm_dnat_rules:
- name: "80-dnat-regeln"
raw_content: |
# HTTP(S) web_front
&EASY_DNAT($main_public_ip, tcp, $web_ports, $web_front_addr);
in playbook.yml
:
- hosts: all
gather_facts: True
become: yes
roles:
- bimdata.ferm
Lizenz
BSD
Autoreninformationen
ansible-galaxy install bimdata.ferm