ansibleguy.infra_nftables

Logo NFTables

Rola Ansible - NFTables

Rola do zarządzania zaporą NFTables na serwerach z systemem Linux.

Postaw mi kawę

Status testów Molecule Status testów YamlLint Status testów PyLint Status testów Ansible-Lint Ansible Galaxy

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

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
    • Domyślne opcje:

      • Usuwanie niezarządzanych plików konfiguracyjnych przechowywanych w '/etc/nftables.d/'
    • Domyślne opcje wyłączenia:


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
      
  • 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.

    Zobacz: Przykład wykorzystania na hoście Docker

O projekcie

Ansible Role to provision NFTables firewall on linux servers

Zainstaluj
ansible-galaxy install ansibleguy.infra_nftables
Licencja
other
Pobrania
4.4k
Właściciel
[email protected] | GPG: https://badges.ansibleguy.net/public.gpg