ipr-cnrs.nftables

Nftables

  1. Przegląd
  2. Zmienne roli
  3. Przykłady
  4. Konfiguracja
  5. Rozwój
  6. Licencja
  7. Informacje o autorze

Przegląd

Rola do zarządzania regułami i pakietami Nftables.

Inspiracją dla tej roli był Mike Gleason - rola zapory. Dziękuję! Mam nadzieję, że nie skomplikowałem jego filozofii... (jestem pewny, że teraz ją skomplikowałem :D) ^^

Zmienne roli

  • nft_enabled: Włącz lub wyłącz wsparcie dla Nftables [domyślnie: true].
  • nft_pkg_state: Stan nowego pakietu nftables [domyślnie: present].
  • nft_old_pkg_list: Lista niepotrzebnych pakietów do usunięcia (np. Iptables) [domyślnie: iptables].
  • nft_old_pkg_state: Stan starych pakietów [domyślnie: absent].
  • nft_old_pkg_manage: Czy stare pakiety powinny być zarządzane przez tę rolę [domyślnie: true].
  • nft_conf_dir_path: Katalog do przechowywania różnych plików konfiguracyjnych Nftables [domyślnie: /etc/nftables.d].
  • nft_main_conf_path: Główny plik konfiguracyjny ładowany przez jednostkę systemd [domyślnie: /etc/nftables.conf].
  • nft_main_conf_content: Szablon używany do generowania głównego pliku konfiguracyjnego [domyślnie: etc/nftables.conf.j2].
  • nft_input_conf_path: Plik konfiguracyjny wejścia dołączony do głównego pliku konfiguracyjnego [domyślnie: {{ nft_conf_dir_path }}/filter-input.nft].
  • nft_input_conf_content: Szablon używany do generowania pliku konfiguracyjnego wejścia [domyślnie: etc/nftables.d/filter-input.nft.j2].
  • nft_output_conf_path: Plik konfiguracyjny wyjścia dołączony do głównego pliku konfiguracyjnego [domyślnie: {{ nft_conf_dir_path }}/filter-output.nft].
  • nft_output_conf_content: Szablon używany do generowania pliku konfiguracyjnego wyjścia [domyślnie: etc/nftables.d/filter-output.nft.j2].
  • nft_forward_conf_path: Plik konfiguracyjny przekazywania dołączony do głównego pliku konfiguracyjnego [domyślnie: {{ nft_conf_dir_path }}/filter-forward.nft].
  • nft_forward_conf_content: Szablon używany do generowania pliku konfiguracyjnego przekazywania [domyślnie: etc/nftables.d/filter-forward.nft.j2].
  • nft_define_conf_path: Plik definicji zmiennych dołączony do głównego pliku konfiguracyjnego [domyślnie: {{ nft_conf_dir_path }}/defines.nft].
  • nft_define_conf_content: Szablon używany do generowania pliku definicji zmiennych [domyślnie: etc/nftables.d/defines.nft.j2].
  • nft_sets_conf_path: Plik definicji zbiorów i map dołączony do głównego pliku konfiguracyjnego [domyślnie: {{ nft_conf_dir_path }}/sets.nft].
  • nft_sets_conf_content: Szablon używany do generowania pliku definicji zbiorów i map [domyślnie: etc/nftables.d/sets.nft.j2].
  • nft_global_default_rules: Ustaw domyślne reguły dla łańcucha global. Inne łańcuchy będą przekierowywać do global przed zastosowaniem swoich specyficznych reguł.
  • nft_global_rules: Możesz dodać reguły global lub nadpisać te zdefiniowane przez nft_global_default_rules dla wszystkich hostów.
  • nft_global_group_rules: Możesz dodać reguły global lub nadpisać te zdefiniowane przez nft_global_default_rules i nft_global_rules dla grupy.
  • nft_global_host_rules: Hosty mogą również dodawać lub nadpisywać wszystkie wcześniejsze reguły.
  • nft__custom_content: Niestandardowa treść (tabele, dołączanie itd.) do dodania w konfiguracji Nftables [domyślnie: ''].
  • nft_input_default_rules: Ustaw domyślne reguły dla łańcucha input.
  • nft_input_rules: Możesz dodać reguły input lub nadpisać te zdefiniowane przez nft_input_default_rules dla wszystkich hostów.
  • nft_input_group_rules: Możesz dodać reguły input lub nadpisać te zdefiniowane przez nft_input_default_rules i nft_input_rules dla grupy.
  • nft_input_host_rules: Hosty mogą również dodawać lub nadpisywać wszystkie wcześniejsze reguły input.
  • nft_output_default_rules: Ustaw domyślne reguły dla łańcucha output.
  • nft_output_rules: Możesz dodać reguły output lub nadpisać te zdefiniowane przez nft_output_default_rules dla wszystkich hostów.
  • nft_output_group_rules: Możesz dodać reguły output lub nadpisać te zdefiniowane przez nft_output_default_rules i nft_output_rules dla grupy.
  • nft_output_host_rules: Hosty mogą również dodawać lub nadpisywać wszystkie wcześniejsze reguły output.
  • nft_forward_default_rules: Ustaw domyślne reguły dla łańcucha forward.
  • nft_forward_rules: Możesz dodać reguły forward lub nadpisać te zdefiniowane przez nft_forward_default_rules dla wszystkich hostów.
  • nft_forward_group_rules: Możesz dodać reguły forward lub nadpisać te zdefiniowane przez nft_forward_default_rules i nft_forward_rules dla grupy.
  • nft_forward_host_rules: Hosty mogą również dodawać lub nadpisywać wszystkie wcześniejsze reguły forward.
  • nft__forward_table_manage: Czy tabela przekazywania powinna być zarządzana [domyślnie: False].
  • nft__nat_table_manage: Czy tabela NAT powinna być zarządzana [domyślnie: False].
  • nft__nat_default_prerouting_rules: Ustaw domyślne reguły dla łańcucha prerouting tabeli nat.
  • nft__nat_prerouting_rules: Ustaw reguły dla łańcucha prerouting tabeli nat dla wszystkich hostów w inwentarzu Ansible.
  • nft__nat_group_prerouting_rules: Ustaw reguły dla łańcucha prerouting tabeli nat dla hostów w specyficznej grupie inwentarza Ansible.
  • nft__nat_host_prerouting_rules: Ustaw reguły dla łańcucha prerouting tabeli nat dla konkretnych hostów w inwentarzu Ansible.
  • nft__nat_prerouting_conf_path: Plik konfiguracyjny prerouting dołączony do głównej konfiguracji [domyślnie: {{ nft_conf_dir_path }}/nat-prerouting.nft].
  • nft__nat_prerouting_conf_content: Szablon używany do generowania pliku konfiguracyjnego prerouting [domyślnie: etc/nftables.d/nat-prerouting.nft.j2].
  • nft__nat_default_postrouting_rules: Ustaw domyślne reguły dla łańcucha postrouting tabeli nat.
  • nft__nat_postrouting_rules: Ustaw reguły dla łańcucha postrouting tabeli nat dla wszystkich hostów w inwentarzu Ansible.
  • nft__nat_group_postrouting_rules: Ustaw reguły dla łańcucha postrouting tabeli nat dla hostów w specyficznej grupie inwentarza Ansible.
  • nft__nat_host_postrouting_rules: Ustaw reguły dla łańcucha postrouting tabeli nat dla konkretnych hostów w inwentarzu Ansible.
  • nft__nat_postrouting_conf_path: Plik konfiguracyjny postrouting dołączony do głównej konfiguracji [domyślnie: {{ nft_conf_dir_path }}/nat-postrouting.nft].
  • nft__nat_postrouting_conf_content: Szablon używany do generowania pliku konfiguracyjnego postrouting [domyślnie: etc/nftables.d/nat-postrouting.nft.j2].
  • nft_define_default: Ustaw domyślne zmienne dostępne we wszystkich regułach.
  • nft_define: Możesz dodać zmienne lub nadpisać te zdefiniowane przez nft_define_default dla wszystkich hostów.
  • nft_define_group: Możesz dodać zmienne lub nadpisać te zdefiniowane przez nft_define_default i nft_define dla grupy.
  • nft_define_host: Możesz dodać lub nadpisać wszystkie wcześniejsze zmienne.
  • nft_service_manage: Czy usługa nftables powinna być zarządzana przez tę rolę [domyślnie: true].
  • nft_service_name: Nazwa usługi nftables [domyślnie: nftables].
  • nft_service_enabled: Ustaw, aby usługa nftables była dostępna przy starcie [domyślnie: true].
  • nft__service_protect: Czy jednostka systemd powinna chronić system i dom [domyślnie: true].
  • nft_merged_groups: Czy zmienne z grup Ansible hostów powinny być scalane [domyślnie: false].
  • nft_merged_groups_dir: Słownik, w którym znajdują się reguły grupowe nftables, nazwane jak grupy Ansible [domyślnie: vars/].
  • nft_debug: Włącz lub wyłącz bardziej szczegółowe wyjście. [domyślnie: 'false'].

Zmienne specyficzne dla systemu operacyjnego

Proszę zobaczyć domyślną wartość w pliku dla systemu operacyjnego w katalogu [vars][vars directory].

  • nft_pkg_list: Lista pakietów, które dostarczają nftables.
  • nft__bin_location: Ścieżka do wykonywalnego nftables. [domyślnie: /usr/sbin/nft]

Szablony reguł

Słownik nft_templates zawiera bibliotekę użytecznych reguł, mających na celu standaryzację i gotowość do użycia w twojej zaporze. Na przykład {{ nft_templates.allow_mdns }} rozwinie się do następujących reguł, obejmujących mDNS dla IPv4 i IPv6:

  - meta l4proto udp ip6 daddr ff02::fb    udp dport mdns counter accept comment "mDNS IPv6 service discovery"
  - meta l4proto udp ip  daddr 224.0.0.251 udp dport mdns counter accept comment "mDNS IPv4 service discovery"

Przykładowe zastosowanie w niestandardowych zbiorach reguł:

nft_host_input_rules:
  ...
  010 allow mdns: "{{ nft_templates.allow_mdns }}"

Wśród innych, słownik nft_templates zawiera reguły implementujące pełne zalecenia dla zapór przekazujących i przyjmujących ruch, zgodnie z definicjami w RFC 4890, RFC 7126 i RFC 9288. Szczegóły i przykłady można znaleźć w defaults/main.yml.

Słowniki reguł

Każdy typ słowników reguł będzie scalany, a reguły będą stosowane w porządku alfabetycznym kluczy (dlatego używamy prefiksów od 000 do 999). Więc:

  • nft_*_default_rules: Definiują domyślne reguły dla wszystkich węzłów. Możesz je zdefiniować w group_vars/all.
  • nft_*_rules: Możesz dodać reguły i nadpisać te zdefiniowane przez nft_*_default_rules. Możesz je zdefiniować w group_vars/all.
  • nft_*_group_rules: Możesz dodać reguły i nadpisać te zdefiniowane przez nft_*_default_rules i nft_*_rules. Możesz je zdefiniować w group_vars/webservers.
    • Jeśli nft_merged_groups jest ustawione na true, wiele reguł grupowych z grup Ansible będzie również scalanych.
  • nft_*_host_rules: Możesz dodać reguły i nadpisać te zdefiniowane przez nft_*_default_rules, nft_*_group_rules i nft_*_rules. Możesz je zdefiniować w host_vars/www.local.domain.

defaults/main.yml:

# reguły
nft_global_default_rules:
  005 state management:
    - ct state established,related accept
    - ct state invalid drop
nft_global_rules: {}
nft_merged_groups: false
nft_merged_groups_dir: vars/
nft_global_group_rules: {}
nft_global_host_rules: {}

nft_input_default_rules:
  000 polityka:
    - type filter hook input priority 0; policy drop;
  005 global:
    - jump global
  010 drop unwanted:
    - ip daddr @blackhole counter drop
  015 localhost:
    - iif lo accept
  210 input tcp accepted:
    - tcp dport @in_tcp_accept ct state new accept
nft_input_rules: {}
nft_input_group_rules: {}
nft_input_host_rules: {}

nft_output_default_rules:
  000 polityka:
    - type filter hook output priority 0; policy drop;
  005 global:
    - jump global
  015 localhost:
    - oif lo accept
  050 icmp:
    - ip protocol icmp accept
    - ip6 nexthdr icmpv6 counter accept
  200 output udp accepted:
    - udp dport @out_udp_accept ct state new accept
  210 output tcp accepted:
    - tcp dport @out_tcp_accept ct state new accept
nft_output_rules: {}
nft_output_group_rules: {}
nft_output_host_rules: {}

# definiowanie zmiennych nft
nft_define_default:
  broadcast and multicast:
    desc: 'broadcast and multicast'
    name: badcast_addr
    value: '{ 255.255.255.255, 224.0.0.1, 224.0.0.251 }'
  input tcp accepted:
    name: in_tcp_accept
    value: '{ ssh }'
  output tcp accepted:
    name: out_tcp_accept
    value: '{ http, https, hkp }'
  output udp accepted:
    name: out_udp_accept
    value: '{ bootps, domain, ntp }'
nft_define: {}
nft_define_group: {}
nft_define_host: {}

# zbiory i mapy
nft_set_default:
  blackhole:
    - type ipv4_addr;
    - elements = $badcast_addr
  in_tcp_accept:
    - type inet_service; flags interval;
    - elements = $in_tcp_accept
  out_tcp_accept:
    - type inet_service; flags interval;
    - elements = $out_tcp_accept
  out_udp_accept:
    - type inet_service; flags interval;
    - elements = $out_udp_accept
nft_set: {}
nft_set_group: {}
nft_set_host: {}

Te domyślne wartości wygenerują następującą konfigurację :

#!/usr/sbin/nft -f
# Zarządzane przez Ansible

# czyszczenie
flush ruleset

include "/etc/nftables.d/defines.nft"

table inet filter {
    chain global {
        # 000 zarządzanie stanem
        ct state established,related accept
        ct state invalid drop
    }
    include "/etc/nftables.d/sets.nft"
    include "/etc/nftables.d/filter-input.nft"
    include "/etc/nftables.d/filter-output.nft"
}

A wszystkie reguły i definicje można uzyskać, wyświetlając zestaw reguł na hoście: $ nft list ruleset:

table inet filter {
    set blackhole {
        type ipv4_addr
        elements = { 255.255.255.255, 224.0.0.1, 224.0.0.251}
    }

    set out_tcp_accept {
        type inet_service
        flags interval
        elements = { http, https, hkp}
    }

    set out_udp_accept {
        type inet_service
        flags interval
        elements = { domain, bootps, ntp}
    }

    chain global {
        ct state established,related accept
        ct state invalid drop
    }

    chain input {
        type filter hook input priority 0; policy drop;
        jump global
        ip daddr @blackhole counter packets 0 bytes 0 drop
        iif "lo" accept
        tcp dport @in_tcp_accept ct state new accept
    }

    chain output {
        type filter hook output priority 0; policy drop;
        jump global
        oif "lo" accept
        ip protocol icmp accept
        udp dport @out_udp_accept ct state new accept
        tcp dport @out_tcp_accept ct state new accept
    }
}

Przykłady

Z playbookami

Zarządzaj Nftables za pomocą domyślnych zmiennych (kliknij, aby rozwinąć)
- hosts: serverXYZ
  roles:
    - role: ipr-cnrs.nftables
Dodaj nową prostą regułę filtrującą dla przychodzącego ruchu (np. 1 port dla UDP/torrent) (kliknij, aby rozwinąć)
- hosts: serverXYZ
  vars:
      nft_input_rules:
        400 input torrent accepted:
          - udp dport 6881 ct state new accept
  roles:
    - role: ipr-cnrs.nftables
  • Zmienne nft_input_group_rules lub nft_input_host_rules mogą być również używane.
  • Waga (400) pozwala uporządkować wszystkie scalone reguły (z słowników nft_input_*rules).
  • Tekst po wadze (input torrent accepted) to krótki opis, który będzie dodany jako komentarz w pliku nft_input_conf_path na zdalnym hoście.
Dodaj nową regułę wielopunktową dla przychodzącego ruchu (np. TCP/http, https, http-alt itd.) (kliknij, aby rozwinąć)
- hosts: serverXYZ
  vars:
      nft_input_rules:
        400 input http accepted:
          - tcp dport { 80, 443, 8080-8082 } ct state new accept
  roles:
    - role: ipr-cnrs.nftables
  • Zmienne nft_input_group_rules lub nft_input_host_rules mogą być również używane.
  • Waga (400) pozwala uporządkować wszystkie scalone reguły (z słowników nft_input_*rules).
  • Tekst po wadze (input http accepted) to krótki opis, który będzie dodany jako komentarz w pliku nft_input_conf_path na zdalnym hoście.
  • W tym przypadku nawiasy są przydatne i definiują anonimowy zbiór. Dla pojedynczego elementu (port, adres IP itd.) użycie nawiasów jest zbędne i definicja pojedyncza jest wystarczająca.
Dodaj nową regułę z użyciem zmiennej (kliknij, aby rozwinąć)

Zamienne Nftables mogą być przydatne, jeśli zdefiniujesz pewne ogólne reguły dla wszystkich hostów z tymi zmiennymi (wołanymi za pomocą $) i nadpiszesz wartość zmiennej dla niektórych grup lub hostów.

- hosts: serverXYZ
  vars:
    - nft_define_group:
        input http accepted:
          desc: HTTP i HTTPS
          name: in_http_accept
          value: '{ 80, 443 }'
      nft_input_group_rules:
        400 input http accepted:
          - tcp dport $in_http_accept ct state new accept
  roles:
    - role: ipr-cnrs.nftables
  1. Dodaj nową zmienną za pomocą define dla portów HTTP.
  2. Dodaj nową regułę dla przychodzącego ruchu i użyj wcześniej zdefiniowanej zmiennej.
  3. Wynik nft list ruleset na zdalnym hoście będzie wyglądać:
    table inet filter {
            …
    
            chain input {
                    …
                    tcp dport { http, https } ct state new accept
                    …
            }
            …
    }
    
    • Brak wzmianki o zmiennej $in_http_accept.
  • Zmienne nft_define lub nft_define_host mogą być również używane.
  • Zmienne nft_input_rules lub nft_input_host_rules mogą być również używane.
  • Waga (400) pozwala uporządkować wszystkie scalone reguły (z słowników nft_input_*rules).
  • Tekst po wadze (input http accepted) to krótki opis, który będzie dodany jako komentarz w pliku nft_input_conf_path na zdalnym hoście.
Dodaj nową regułę z użyciem nazwanego zbioru (kliknij, aby rozwinąć)

Podobnie jak zmienne Nftables, nazwa zbioru może być przydatna, jeśli zdefiniujesz pewne ogólne reguły i zbiory (np. dla wszystkich hostów) i nadpiszesz tylko zbiór w niektórych przypadkach (np. dla grupy lub niektórych hostów).

Oprócz zmiennych, możliwe jest dodawanie treści do nazwanych zbiorów w locie z hosta, bez całkowitego przepisania reguły.

- hosts: serverXYZ
  vars:
      nft_set_group:
        in_udp_accept:
          - type inet_service; flags interval;
          - elements = { 6881-6887, 6889 }
      nft_input_group_rules:
        200 input udp accepted:
          - udp dport @in_udp_accept ct state new accept
  roles:
    - role: ipr-cnrs.nftables
  1. Dodaj nowy nazwany zbiór używając słownika nft_set_group (np. dla portów torrent).
  2. Dodaj nową regułę dla przychodzącego ruchu i użyj wcześniej zdefiniowanego zbioru.
  3. Na zdalnym hoście, jeśli spróbujesz dodać port do tego zbioru: nft add element inet filter in_udp_accept \{ 6999 \}
  4. Wynik nft list ruleset na zdalnym hoście teraz będzie wyglądać:
    table inet filter {
            …
            set in_udp_accept {
                    type inet_service
                    flags interval
                    elements = { 6881-6887, 6889, 6999 }
            }
            chain input {
                    …
                    udp dport @in_udp_accept ct state new accept
                    …
            }
            …
    }
    
  • Zmienne nft_set lub nft_set_host mogą być również używane.
  • Zmienne nft_input_rules lub nft_input_host_rules mogą być również używane.
  • Waga (200) pozwala uporządkować wszystkie scalone reguły (z słowników nft_input_*rules).
  • Tekst po wadze (input udp accepted) to krótki opis, który będzie dodany jako komentarz w pliku nft_input_conf_path na zdalnym hoście.
Przedefiniuj domyślną regułę za pomocą 2 nowych reguł (kliknij, aby rozwinąć)
- hosts: serverXYZ
  vars:
      nft_input_host_rules:
        050 icmp:
          - ip protocol icmp  ip saddr != 192.168.0.0/24  counter  drop
          - ip protocol icmp  icmp type echo-request  ip length <= 84  counter  limit rate 10/minute  accept
  roles:
    - role: ipr-cnrs.nftables
  1. Zdobądź opis reguły z pliku defaults/main.yml (np. 050 icmp).
  2. Odrzuć wszelkie żądania ICMP, które nie pochodzą z sieci 192.168.0.0.
  3. Upewnij się, że żądanie ma długość mniejszą lub równą 84 bajtom i ustaw limit do 10 żądań na minutę.
  • Zmienne nft_input_rules lub nft_input_group_rules mogą być również używane.
  • Waga (050) pozwala uporządkować wszystkie scalone reguły (z słowników nft_input_*rules).
  • Tekst po wadze (icmp) to krótki opis, który będzie dodany jako komentarz w pliku nft_input_conf_path na zdalnym hoście.
Przedefiniuj niektóre z domyślnie zdefiniowanych zbiorów (kliknij, aby rozwinąć)
- hosts: serverXYZ
  vars:
    - nft_define:
      input tcp accepted:
        desc: Niestandardowy port SSH i torrent
        name: in_tcp_accept
        value: '{ 2201, 6881 }'
  roles:
    - role: ipr-cnrs.nftables
  1. Zdobądź nazwę przedmiotu (np. input tcp accepted) i nazwę zmiennej (np. in_tcp_accept) z pliku defaults/main.yml.
  2. Ustaw nową wartość (np. '{ 2201, 6881 }').
  3. Możesz dodać atrybut desc, który będzie ustawiony jako komentarz w pliku nft_input_conf_path na zdalnym hoście.
  • Zmienne nft_define_group lub nft_define_host mogą być również używane.
Przedefiniuj wszystkie domyślne reguły (np. dla ruchu wychodzącego) (kliknij, aby rozwinąć)

Jeśli domyślne reguły są zbyt łagodne, jeśli już nadpisałeś większość z nich, … W niektórych przypadkach, myślę, że może być ciekawie redefiniować domyślną zmienną:

- hosts: serverXYZ
  vars:
      nft_output_default_rules:
        000 polityka:
          - type filter hook output priority 0; policy drop;
        005 zarządzanie stanem:
          - ct state established,related accept
          - ct state invalid drop
        015 localhost:
          - oif lo accept
        050 moja reguła dla XX hostów i usług:
          - tcp dport 2000  ip saddr { xxx.xxx.xxx.xxx, yyy.yyy.yyy.yyy }  ct state new  accept
        250 reset-ssh:  # pozwala hostowi zresetować połączenia SSH, aby uniknąć 10 min opóźnienia od kontrolera Ansible
          - tcp sport ssh tcp flags { rst, psh | ack } counter accept
  roles:
    - role: ipr-cnrs.nftables
  • Przynajmniej nie zapomnij o:
    1. ustawieniu domyślnej polityki.
    2. zarządzaniu już established stanem.
    3. akceptacji flag rst, psh | ack dla ssh, aby uniknąć 10 minut opóźnienia podczas pierwszego uruchomienia tej roli Nftables (zobacz #1).
  • Następnie dodaj własne reguły z odpowiednią wagą, aby uporządkować wszystkie scalone reguły (z słowników nft_output_*rules).
Usuń domyślną regułę (kliknij, aby rozwinąć)
- hosts: serverXYZ
  vars:
      nft_output_host_rules:
        210 output tcp accepted:
          -
  roles:
    - role: ipr-cnrs.nftables
  1. Zdobądź opis reguły z pliku defaults/main.yml (210 output tcp accepted).
  2. Domyślna polityka dla ruchu wychodzącego (drop) będzie teraz stosowana do portów zdefiniowanych w zmiennej out_tcp_accept. Upewnij się, że wiesz, co robisz.
  3. Reguła nie będzie już obecna w wyniku nft list ruleset, pozostanie tylko komentarz (210 output tcp accepted) w pliku nft_output_conf_path na zdalnym hoście.
  • Zmienne nft_output_rules lub nft_output_group_rules mogą być również używane.
  • Waga (210) pozwala uporządkować wszystkie scalone reguły (z słowników nft_output_*rules).

Z group_vars i host_vars

Użyj domyślnych reguł i zezwól, dla first_group, na przychodzący ICMP i zlicz zarówno ICMP, jak i pakiety domyślnej polityki (drop) (kliknij, aby rozwinąć)

group_vars/first_group :

nft_input_group_rules:
  020 icmp:
    - ip protocol icmp icmp type echo-request ip length <= 84 counter limit rate 1/minute accept
  999 count policy packet:
    - counter
Użyj scalonych reguł grupowych z wielu grup Ansible (kliknij, aby rozwinąć)
  1. Włącz możliwość scalania zmiennych grup:
    - hosts: serverXYZ
      vars:
        nft_merged_groups: true
        nft_merged_groups_dir: vars/
      roles:
        - role: ipr-cnrs.nftables
    
  2. Włóż dodatkowe reguły do "vars" folderu o nazwie odpowiadającej twoim grupom Ansible dla serverXYZ:
    • vars/first_group:
      nft_input_group_rules:
        020 icmp:
          - ip protocol icmp icmp type echo-request ip length <= 84 counter limit rate 1/minute accept
        999 count policy packet:
          - counter
      
    • vars/second_group:
      nft_input_group_rules:
        021 LAN:
          - iif eth0 accept
      
  3. Te zestawy reguł z dwóch grup będą scalane, jeśli host jest członkiem tych grup.

Konfiguracja

Ta rola będzie:

  • Instalować nftables na systemie.
  • Umożliwiać domyślnie usługi nftables podczas uruchomienia.
  • Generować domyślny plik konfiguracyjny, który uwzględnia wszystkie poniższe pliki i jest ładowany przez jednostkę systemd.
  • Generować pliki reguł wejściowych i wyjściowych, które są wywoływane przez główny plik konfiguracyjny.
  • Generować zmienne w jednym pliku, a zbiory i mapy w innym.
  • Upewnić się, że nftables jest uruchamiane i włączone przy starcie.
  • (re)Uruchamiać usługę nftables przy pierwszym uruchomieniu lub po zmianie jednostek systemd.
  • Ładować usługę nftables przy kolejnych uruchomieniach, aby uniknąć sytuacji, w której host nie miałby reguł zapory z powodu błędnej składni.

Integracja z Fail2ban

Przed Debian Bullseye jednostka systemd dla Fail2ban nie była dobrze zintegrowana z Nftables. Ta rola stworzy plik nad override dla jednostki fail2ban, chyba że nft_fail2ban_service_override jest ustawione na false. Domyślnie jest to dodawane nawet jeśli jeszcze nie jest dostępne na hoście. To zapewnia:

  • Jednostka fail2ban jest uruchamiana po jednostce nftables.
  • Jednostka fail2ban jest restartowana, gdy jednostka nftables jest restartowana.

Rozwój

Ten kod źródłowy pochodzi z naszej instancji Gitea, a repozytorium Github istnieje tylko po to, aby móc wysłać tę rolę do Ansible Galaxy…

Jednakże, nie krępuj się, aby wysyłać zgłoszenia problemów/PR tutaj :)

Dzięki temu hookowi Github automatycznie otrzymuje aktualizacje z naszej instancji Gitea :)

Licencja

WTFPL

Informacje o autorze

Jérémy Gardais

  • IPR (Institut de Physique de Rennes)
O projekcie

Manage Nftables rules and packages

Zainstaluj
ansible-galaxy install ipr-cnrs.nftables
Licencja
Unknown
Pobrania
99.3k
Właściciel
Institut de Physique de Rennes https://ipr.univ-rennes1.fr/ Tutelles CNRS et Université Rennes 1