ansibleguy.infra_nftables

Rola Ansible - NFTables
Rola do zarządzania zaporą NFTables na serwerach z systemem Linux.
Dzienniki Molecule: Krótki, Pełny
Testowane na:
- Debian 11
- Debian 12
Instalacja
# najnowsza wersja
ansible-galaxy role install git+https://github.com/ansibleguy/infra_nftables
# z Ansible Galaxy
ansible-galaxy install ansibleguy.infra_nftables
# lub do niestandardowego folderu ról
ansible-galaxy install ansibleguy.infra_nftables --roles-path ./roles
Dokumentacja
- NFTables: Wiki
- Zapoznaj się z Przykładem!
- Praktyczne scenariusze użycia (Docker, Proxmox, zapora sieciowa)
- Integracja Fail2Ban z NFTables
- Przewodnik rozwiązywania problemów
Rozwiązywanie problemów
Użycie
Chcesz prosty interfejs graficzny Ansible? Sprawdź moje Ansible WebUI
Konfiguracja
Zdefiniuj konfigurację według potrzeb:
nftables:
# enable: # funkcje muszą być wspierane przez jądro
# sets: true
# nat: true
# deb11_backport: false # użyj repozytorium backportów Debiana 11, aby zainstalować nowszą wersję na Debianie 10
# bash_completion: false
_defaults: # domyślne ustawienia dziedziczone przez wszystkie tabele i łańcuchy
table:
type: 'inet'
chain:
policy: 'drop'
type: 'filter'
priority: 0
log:
drop: true
rules:
_all: [] # reguły dodawane do wszystkich łańcuchów wszystkich tabel
incoming: [] # reguły dodawane do łańcucha 'incoming' wszystkich tabel
tables:
example:
# type: 'inet' # ipv4 + ipv6
_defaults:
rules:
_all: [] # reguły dodawane do wszystkich łańcuchów tej tabeli
vars:
dns_servers: ['1.1.1.1', '1.1.0.0', '8.8.8.8', '8.8.4.4']
private_ranges: ['192.168.0.0/16', '172.16.0.0/12', '10.0.0.0/8']
sets:
blacklist:
flags: ['dynamic', 'timeout']
settings:
timeout: '3m'
counters:
invalid_packages:
comment: 'Nieprawidłowe'
chains:
incoming:
hook: 'input'
rules:
- sequence: 1
raw: 'ct state invalid counter name invalid_packages log prefix "DROP invalid states" drop'
- seq: 2
raw: 'ct state {established, related} counter accept comment "Zezwól na otwarte sesje"'
- s: 3
raw: 'iifname "lo" accept comment "Zezwól na ruch loopback"'
- {proto: 'icmp', type: 'echo-request', limit: 'rate 10/second', comment: 'Zezwól na icmp-ping'}
- {proto: 'icmpv6', type: 'echo-request', limit: 'rate 10/second', comment: 'Zezwól na icmp-ping'}
- {proto: 'icmp', code: 30, limit: 'rate 10/second', comment: 'Zezwól na icmp-traceroute'}
- {proto: 'icmpv6', limit: 'rate 10/second', comment: 'Zezwól na niezbędne typy icmpv6 do działania ipv6',
type: ['nd-neighbor-solicit', 'nd-router-advert', 'nd-neighbor-advert']}
- {proto: 'udp', port: 46251, counter: 'invalid_packages'}
outgoing:
hook: 'output'
# policy: 'accept'
rules:
- {dest: '$dns_servers', proto: 'udp', port: 53}
- {dest: '$dns_servers', proto: 'tcp', port: [53, 853]}
- {proto: ['tcp', 'udp'], port: [80, 443]}
- {proto: ['icmp', 'icmpv6'], comment: 'Zezwól na wychodzący icmp'}
route:
hook: 'forward'
translate:
hook: 'postrouting'
type: 'nat'
policy: 'accept'
rules:
- {'src': '$private_ranges', oif: 'eno2', masquerade: true} # dynamic outbound nat
- {'src': '$private_ranges', oif: 'eno3', snat: '192.168.0.1'} # static outbound nat
Jeśli chcesz połączyć reguły grupowe i hostowe, możesz to zrobić w ten sposób:
# zdefiniuj podstawowy zestaw reguł używany przez wszystkie hosty jako: 'fw_rules_all'
# zdefiniuj reguły specyficzne dla usługi jako: 'fw_rules_group'
# zdefiniuj reguły specyficzne dla hosta jako: 'fw_rules_host'
- name: NFTables
become: true
hosts: all
vars:
nftables:
tables:
example:
chains: "{{ fw_rules_all |
combine(fw_rules_group|default({}), recursive=true, list_merge='append') |
combine(fw_rules_host|default({}), recursive=true, list_merge='append') }}"
pre_tasks:
- debug:
var: nftables
roles:
- ansibleguy.infra_nftables
Wykonanie
Uruchom playbook:
ansible-playbook -K -D -i inventory/hosts.yml playbook.yml
Dostępne są również przydatne tagi:
- config_table => tylko wdrożenie aktualnych zestawów reguł
- config
- purge
Aby debugować błędy - możesz ustawić zmienną 'debug' w czasie działania:
ansible-playbook -K -D -i inventory/hosts.yml playbook.yml -e debug=yes
Funkcjonalność
Instalacja pakietów
- Zależności Ansible (minimalne)
- NFTables
Konfiguracja
Możliwość zdefiniowania
- zmiennych na poziomie globalnym
- zmiennych, zestawów, liczników i limitów na poziomie tabeli
- zmiennych na poziomie łańcucha
Konfiguracja zostanie zweryfikowana przed zapisem
Domyślna konfiguracja:
- Włączone funkcje (muszą być wspierane przez jądro)
- Zestawy
- NAT
- Domyślnie nie są dodawane żadne reguły
- tabele
- typ tabeli = inet
- łańcuchy
- typ łańcucha = filter
- polityka łańcucha = drop
- priorytet = 0
- dodaj licznik = tak
- logowanie domyślnego dropu = tak
- zestawy
- typ zestawu = ipv4_addr
- dodaj licznik = tak
- reguły
- polityka = accept (ustaw na 'none', jeśli chcesz ją wyraźnie usunąć)
- logowanie dropów = tak
- Włączone funkcje (muszą być wspierane przez jądro)
Domyślne opcje:
- Usuwanie niezarządzanych plików konfiguracyjnych przechowywanych w '/etc/nftables.d/'
Domyślne opcje wyłączenia:
- Instalacja NFTables z backportów Debiana 11, gdy działa na Debianie 10 (nowsza wersja)
- Dodanie skryptu autouzupełniania bash dla polecenia 'nft'
Informacje
Uwaga: Większość funkcji roli można włączyć lub wyłączyć.
Aby zobaczyć wszystkie dostępne opcje - sprawdź domyślną konfigurację w głównym pliku domyślnym!
Ostrzeżenie: Nie każda opcja/zmienna, którą podasz, zostanie sprawdzona pod kątem poprawności. Zła konfiguracja może spowodować awarię roli!
Informacja: Możesz dodać funkcje Rozwiązania DNS i IP-Blocklisty do NFTables używając roli ansibleguy.addons_nftables!
Ostrzeżenie: Niektóre kluczowe funkcje (NAT/Zestawy) mogą nie być wspierane przez jądra głównych dystrybucji.
Zobacz: Przewodnik rozwiązywania problemów - 'Nieobsługiwana operacja'
Informacja: Przeczytaj dokumentację dotyczącą haków, aby wiedzieć, kiedy i jak skonfigurować haki i priorytety!
Informacja: Reguły można podawać w formacie słownika, jak pokazano w przykładach.
Oto dostępne pola i aliasy:
Funkcja Klucze Uwaga Kolejność reguły s, id, seq, sequence Numer kolejności (liczba całkowita) do sortowania reguł wewnątrz łańcucha. Jeśli nie podano, zostanie automatycznie wygenerowany, zaczynając od 1000. Jeśli podano zduplikowany identyfikator sekwencji, rola nie przejdzie weryfikacji konfiguracji! Interfejs wejściowy if, iif, iifname - Interfejs wyjściowy of, oif, oifname - Protokół proto, pr, protocol - Podtyp protokołu t, type - Podkod protokołu co, code - Adres/Sieć docelowa d, dest, target, destination, 'ip daddr', d6, dest6, target6, 'ip6 daddr' - Port docelowy dp, port, dport, dest_port - Adres/Sieć źródłowa s, src, source, 'ip saddr', s6, src6, source6, 'ip6 saddr' - Port źródłowy sp, sport, sport, src_port - Logowanie / wiadomość dziennika l, log, 'log prefix' Jeśli ustawisz na 'True' i podasz 'komentarz', użyje go jako wiadomości. W przeciwnym razie nie będzie używana żadna wiadomość. Licznik ruchu count, counter Jeśli ustawisz na 'True', zostanie użyty konkretny licznik dla reguły. W przeciwnym razie zostanie użyty przeddefiniowany licznik. Limit ruchu lim, limit Limit do ustawienia dla reguły, zobacz: Anonimowe limity i Przeddefiniowane limity Działanie reguły a, action Jeśli nie podano żadnego działania, domyślnie ustawione na 'accept' Masquerading NAT źródłowy m, masque, masquerade Jeśli należy użyć masquerading NAT NAT źródłowy snat, src_nat, source_nat, outbound_nat, 'snat to' - NAT docelowy dnat, dest_nat, destination_nat, 'dnat to' - Przekierowanie redir, redirect, 'redirect to' Używając przekierowania, pakiety będą przesyłane do lokalnej maszyny Komentarz do reguły c, cmt, comment - Użytkownik user, uid Dopasowanie tylko do ruchu pochodzącego od określonego użytkownika Grupa group, gid Dopasowanie tylko do ruchu pochodzącego z określonej grupy Firewall-Mark mark - Priorytet prio, priority - Długość pakietu len, length - Znacznik czasowy time, timestamp Dopasowanie znacznika czasu odbioru pakietu Dzień tygodnia day Dopasowanie dnia tygodnia (0 = niedziela do 6 = sobota lub "poniedziałek", "wtorek", także "pt", "sob") Czas hour Dopasowanie 24-godzinnego "HH:MM:SS", z opcjonalnymi sekundami
Tylko jedna z Akcji, NAT źródłowy, Masquerading lub NAT docelowy może być ustawiona dla jednej reguły!
Informacja: Złożone reguły nie mogą być konfigurowane przy użyciu słownika reguł.
Możesz użyć klucza 'raw', aby podać dowolną niestandardową regułę, która zostanie bezpośrednio dodana do zestawu reguł.
Informacja: Możesz definiować zmienne, zestawy, liczniki i limity na poziomie tabeli.
- Zmienne to pary klucz-wartość.
var-name: var-value var2-name: ['value1', 'value2']
- Zestawy mają tę strukturę:
set-name: flags: [lista-flags] # opcjonalne settings: setting: value # opcjonalne
- Liczniki mają tę strukturę:
counter-name: comment: tekst # opcjonalne
- Limity mają tę strukturę:
limit-name: rate: 'over 1024 bytes/second burst 512 bytes' comment: tekst # opcjonalne
- Zmienne to pary klucz-wartość.
Ostrzeżenie: Jeśli chcesz dodać regułę 'tylko do zliczania', musisz wyraźnie ustawić 'action' na 'none' - w przeciwnym razie domyślna wartość 'accept' zostanie dodana!
Informacja: Jeśli jakiekolwiek nieobsługiwane pole zostanie dostarczone do translacji reguł, zgłosi to błąd, ponieważ może to prowadzić do nieprzewidywanych rezultatów!
Informacja: Docker może potrzebować IPTables jako zależności pakietu.
Ansible Role to provision NFTables firewall on linux servers
ansible-galaxy install ansibleguy.infra_nftables