bimdata.ferm
Ansible Rola Ferm
Ta rola instaluje i konfiguruje Ferm.
Wymagania
- Ta rola jest testowana tylko z Ansible >= 2.9.
Zmienne Roli
Więcej informacji na temat każdej opcji znajdziesz w dokumentacji Ferm.
Zmienne używane do instalacji:
Zmienne | Wartość domyślna | Opis |
---|---|---|
ferm_pkg_name | ferm | Nazwa pakietu Ferm w APT. |
ferm_svc_name | ferm | Nazwa usługi Ferm do uruchamiania/zatrzymywania demona. |
Zmienne używane do ogólnej konfiguracji:
Zmienne | Wartość domyślna | Opis |
---|---|---|
ferm_main_conf_file | /etc/ferm/ferm.conf | Ścieżka do głównego pliku konfiguracyjnego Ferm. |
ferm_rules_path | /etc/ferm/ferm.d | Ścieżka do katalogu z regułami Ferm. |
Domyślne reguły zostaną zapisane w głównym pliku konfiguracyjnym, który załaduje wszystkie reguły zdefiniowane w katalogu konfiguracyjnym. Pozwoli to na definiowanie innych reguł, które nie są zarządzane przez tę rolę (jeśli ferm_delete_unknown_rules
jest ustawione na false
).
Zmienne używane do konfiguracji reguł:
Zmienne | Wartość domyślna | Opis |
---|---|---|
ferm_delete_unknown_rulefiles | true | Usuwa reguły w ferm_rules_path, które nie są zarządzane przez tę rolę. |
ferm_default_domains | ['ip', 'ip6'] | Gdy reguła nie określa domeny, ta jest używana. |
ferm_default_table | filter | Gdy reguła nie określa tabeli, ta jest używana. |
Zmienne używane do definiowania reguł:
Zmienne | Wartość domyślna | Opis |
---|---|---|
ferm_input_policy | DROP | Domyślna polityka wejściowa Ferm. |
ferm_output_policy | ACCEPT | Domyślna polityka wyjściowa Ferm. |
ferm_forward_policy | DROP | Domyślna polityka przekazywania Ferm. |
_ferm_rules | "{{ lookup('template', 'get_vars.j2', template_vars=dict(vartype='rule')) }}" | Lista słowników definiujących wszystkie reguły Ferm. |
_ferm_vars | "{{ lookup('template', 'get_vars.j2', template_vars=dict(vartype='var')) }}" | Lista słowników definiujących wszystkie zmienne Ferm. |
_ferm_functions | "{{ lookup('template', 'get_vars.j2', template_vars=dict(vartype='function')) }}" | Lista słowników definiujących wszystkie funkcje Ferm. |
_ferm_hooks | "{{ lookup('template', 'get_vars.j2', template_vars=dict(vartype='hook')) }}" | Lista słowników definiujących wszystkie haki Ferm. |
W większości przypadków nie powinieneś modyfikować zmiennych, które zaczynają się na '_'. Szablonowanie jest używane do budowania tych list z innymi zmiennymi.
_ferm_rules
zbiera wszystkie zmienne, których nazwa pasuje do tego wyrażenia regularnego:^ferm_.+_rule(s)?$
_ferm_vars
zbiera wszystkie zmienne, których nazwa pasuje do tego wyrażenia regularnego:^ferm_.+_var(s)?$
_ferm_functions
zbiera wszystkie zmienne, których nazwa pasuje do tego wyrażenia regularnego:^ferm_.+_function(s)?$
_ferm_hooks
zbiera wszystkie zmienne, których nazwa pasuje do tego wyrażenia regularnego:^ferm_.+_hook(s)?$
Każda zmienna pasująca do tych wyrażeń regularnych musi być:
- słownikiem definiującym jedną regułę/zmienną/funkcję/hak lub
- listą słowników definiujących jedną lub więcej reguł/zmiennych/funkcji/haków.
Pozwala to na definiowanie zmiennych w różnych group_vars
i ich kumulowanie dla hostów w wielu grupach bez potrzeby przepisywania pełnej listy.
Zmienne używane do definiowania domyślnego zestawu reguł:
- ta zmienna konfiguruje domyślny zestaw reguł dla tabeli INPUT:
ferm_default_inputs: - "policy {{ ferm_input_policy }};" - interface lo ACCEPT; - "mod conntrack ctstate (RELATED ESTABLISHED) ACCEPT;"
- ta zmienna konfiguruje domyślny zestaw reguł dla tabeli OUTPUT:
ferm_default_outputs: - "policy {{ ferm_output_policy }};" - interface lo ACCEPT; - "mod conntrack ctstate (RELATED ESTABLISHED) ACCEPT;"
- ta zmienna konfiguruje domyślny zestaw reguł dla tabeli FORWARD:
ferm_default_forwards: []
Debian 11 używa iptables-nft
domyślnie, a nie jest on obsługiwany przez ferm.
Od Debiana 11, ferm ignoruje alternatywne ustawienia i wymusza użycie iptables-legacy
(https://github.com/MaxKellermann/ferm/issues/47)
Zmienne | Wartość domyślna | Opis |
---|---|---|
ferm_iptables_path | /usr/sbin/iptables-legacy | Ścieżka do iptables-legacy. |
ferm_ip6tables_path | /usr/sbin/ip6tables-legacy | Ścieżka do ip6tables-legacy. |
ferm_arptables_path | /usr/sbin/arptables-legacy | Ścieżka do arptables-legacy. |
ferm_ebtables_path | /usr/sbin/ebtables-legacy | Ścieżka do ebtables-legacy. |
Te zmienne są używane tylko na hostach Debianie z wersją > 10.
Skonfigurują system operacyjny za pomocą systemu alternative
, aby ustawić wartość ferm_iptables_path
,
ferm_ip6tables_path
, ferm_arptables_path
i ferm_ebtables_path
jako domyślną komendę iptables.
Definicje zmiennych
Zmienną ferm można zdefiniować w następujący sposób:
ferm_webports_var:
name: web_ports
content:
- 80
- 443
ferm_hosts_vars
- name: web_front_addr
content:
- 172.29.10.100
- 2a01:baaf::100
Definicje haków
Hak ferm można zdefiniować w następujący sposób:
ferm_fail2ban_hooks:
- comment: Haki Fail2ban
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";
Definicje reguł
Regułę można zdefiniować w dwa sposoby:
ferm_web_rules:
- name: "web_server"
content:
- domains: ['ip'] # Można pominąć, użyta zostanie ferm_default_domains
chains: ['INPUT'] # Można pominąć, użyta zostanie ferm_default_table
rules:
- proto tcp dport ($web_ports) mod comment comment "web server" ACCEPT
lub można zdefiniować surowe reguły:
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;
}
}
Definicje funkcji
Funkcję ferm można zdefiniować w następujący sposób:
ferm_dnat_function:
comment: "Łatwy DNAT (DNAT + reguły filtrujące)"
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;
}
Następnie musisz użyć surowej reguły, aby jej użyć, na przykład:
ferm_dnat_rules:
- name: "80-dnat-rules"
raw_content: |
# HTTP(S) web_front
&EASY_DNAT($main_public_ip, tcp, (80 443), $web_front_addr);
Przykład Docker
Docker i inne oprogramowanie mogą chcieć zarządzać własnymi regułami iptables. To jest możliwe, z pewnymi ograniczeniami. Oto przykład dla Dockera:
# Żadna reguła nie może być zdefiniowana w FORWARD przed regułą używaną do zachowania wszystkich
# reguł skonfigurowanych przez docker
ferm_default_forwards: []
# Zachowaj reguły dockera
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
to specjalne słowo używane przez ferm
. Umożliwi ono zapisanie poprzednich reguł za pomocą iptables-save
i następnie wydobycie wszystkich reguł dla zachowanych łańcuchów i wstawienie ich do nowych reguł.
Zależności
Brak
Przykład Playbook
w group_vars/all.yml
:
ferm_webports_var:
name: web_ports
content:
- 80
- 443
w 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
w 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: "Łatwy DNAT (DNAT + reguły filtrujące)"
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-rules"
raw_content: |
# HTTP(S) web_front
&EASY_DNAT($main_public_ip, tcp, $web_ports, $web_front_addr);
w playbook.yml
:
- hosts: all
gather_facts: True
become: yes
roles:
- bimdata.ferm
Licencja
BSD
Informacje o Autorze
ansible-galaxy install bimdata.ferm