infra_nftables

Логотип NFTables

Ansible Роль - NFTables

Роль для установки фаервола NFTables на Linux-серверах.

Купите мне кофе

Статус тестирования Molecule Статус тестирования YamlLint Статус тестирования PyLint Статус тестирования Ansible-Lint Ansible Galaxy

Логи Molecule: Короткие, Полные

Проверено на:

  • Debian 11
  • Debian 12

Установка

# последняя версия
ansible-galaxy role install git+https://github.com/ansibleguy/infra_nftables

# из galaxy
ansible-galaxy install ansibleguy.infra_nftables

# или в пользовательский путь для ролей
ansible-galaxy install ansibleguy.infra_nftables --roles-path ./roles

Документация

Устранение неполадок


Использование

Хотите простой графический интерфейс для Ansible? Ознакомьтесь с моим Ansible WebUI

Конфигурация

Определите конфигурацию по мере необходимости:

nftables:
  # включить:  # функции должны поддерживаться ядром
  #   наборы: true
  #   nat: true
  #   deb11_backport: false  # использовать репозиторий backports Debian 11 для установки более новой версии на Debian 10
  #   автодополнение баш: false

  _defaults:  # значения по умолчанию, унаследованные всеми таблицами и цепочками
    table:
      type: 'inet'
    
    chain:
      policy: 'drop'
      type: 'filter'
      priority: 0
      log:
        drop: true

    rules:
      _all: []  # правила, добавленные ко всем цепочкам всех таблиц
      incoming: []  # правила, добавленные в цепочку 'incoming' всех таблиц

  tables:
    example:
      # type: 'inet'  # ipv4 + ipv6
      _defaults:
        rules:
          _all: []  # правила, добавленные ко всем цепочкам этой таблицы

      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: 'Неправильный'

      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 "Разрешить открытые сессии"'
            - s: 3
              raw: 'iifname "lo" accept comment "Разрешить локальный трафик"'
            - {proto: 'icmp', type: 'echo-request', limit: 'rate 10/second', comment: 'Разрешить icmp-пинг'}
            - {proto: 'icmpv6', type: 'echo-request', limit: 'rate 10/second', comment: 'Разрешить icmp-пинг'}
            - {proto: 'icmp', code: 30, limit: 'rate 10/second', comment: 'Разрешить icmp-трассировку'}
            - {proto: 'icmpv6', limit: 'rate 10/second', comment: 'Разрешить необходимые типы icmpv6 для работы 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: 'Разрешить исходящий icmp'}

        route:
          hook: 'forward'

        translate:
          hook: 'postrouting'
          type: 'nat'
          policy: 'accept'
          rules:
            - {'src': '$private_ranges', oif: 'eno2', masquerade: true}  # динамический исходящий nat
            - {'src': '$private_ranges', oif: 'eno3', snat: '192.168.0.1'}  # статический исходящий nat

Если вы хотите объединить правила группы и хоста, можно сделать так:

# определить базовый набор правил, используемый всеми хостами как: 'fw_rules_all'
# определить правила, специфичные для сервиса, как: 'fw_rules_group'
# определить специфичные для хоста правила как: '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

Выполнение

Запустите плейбук:

ansible-playbook -K -D -i inventory/hosts.yml playbook.yml

Также доступны полезные теги:

  • config_table => только настройка актуальных наборов правил
  • config
  • purge

Чтобы отладить ошибки - вы можете установить переменную 'debug' во время выполнения:

ansible-playbook -K -D -i inventory/hosts.yml playbook.yml -e debug=yes

Функциональность

  • Установка пакетов

    • Зависимости Ansible (минимальные)
    • NFTables
  • Конфигурация

    • Возможность определить

      • переменные на глобальном уровне
      • переменные, наборы, счётчики и лимиты на уровне таблицы
      • переменные на уровне цепочки
    • Конфигурация будет проверена перед записыванием

    • Конфигурация по умолчанию:

      • Включенные функции (должны поддерживаться ядром)
        • Наборы
        • NAT
      • По умолчанию правила не добавляются
      • таблицы
        • тип таблицы = inet
      • цепочки
        • тип цепочки = filter
        • политика цепочки = drop
        • приоритет = 0
        • добавить счётчик = да
        • запись неявных сбросов = да
      • наборы
        • тип набора = ipv4_addr
        • добавить счётчик = да
      • правила
        • политика = accept (установите на 'none', если хотите явно её удалить)
        • логирование сбросов = да
    • Опции по умолчанию:

      • Очистка неуправляемых конфигурационных файлов, хранящихся в '/etc/nftables.d/'
    • Отказ от опций по умолчанию:


Информация

  • Примечание: Большинство функций роли можно включить или отключить.

    Для всех доступных опций - см. конфигурацию по умолчанию в основном файле настроек!

  • Предупреждение: Не каждая настройка/переменная, которую вы предоставляете, будет проверена на корректность. Плохая конфигурация может сломать роль!

  • Информация: Вы можете добавить функции разрешения DNS и блокировки IP в NFTables, используя роль ansibleguy.addons_nftables!

  • Предупреждение: Некоторые основные функции (NAT/Наборы) могут не поддерживаться основными дистрибутивами.

    Смотрите: Руководство по устранению неполадок - 'Неподдерживаемая операция'

  • Информация: Читайте документацию по хукам, чтобы знать, когда и как настраивать хуки и приоритеты!

  • Информация: Правила можно предоставлять в формате словаря, как показано в примерах.

    Доступные поля и их псевдонимы:

    Функция Ключи Примечание
    Порядок правила s, id, seq, sequence Идентификатор порядка (целое число) для сортировки правил внутри цепочки. Если не указано, он будет автоматически сгенерирован, начиная с 1000. Если будет предоставлен дублирующий идентификатор порядка, роль завершит проверку конфигурации с ошибкой!
    Входной интерфейс if, iif, iifname -
    Исходящий интерфейс of, oif, oifname -
    Протокол proto, pr, protocol -
    Подтип протокола t, type -
    Подкод протокола co, code -
    Адрес/Сеть назначения d, dest, target, destination, 'ip daddr', d6, dest6, target6, 'ip6 daddr' -
    Порт назначения dp, port, dport, dest_port -
    Адрес/Сеть источника s, src, source, 'ip saddr', s6, src6, source6, 'ip6 saddr' -
    Исходный порт sp, sport, sport, src_port -
    Логгирование / Сообщение лога l, log, 'log prefix' Если установлено значение 'True' и указано 'comment', оно будет использовано как сообщение. Иначе сообщение не будет использовано
    Счётчик трафика count, counter Если установлено 'True', будет использоваться специфичный для правила счётчик. Иначе будет использоваться предопределённый счётчик
    Лимит трафика lim, limit Лимит, который будет установлен для правила, см.: Анонимные лимиты и Предопределённые лимиты
    Действие правила a, action Если не указано действие, оно по умолчанию будет 'accept'
    Маскировка источника NAT m, masque, masquerade Должна ли быть использована маскировка NAT
    NAT источника snat, src_nat, source_nat, outbound_nat, 'snat to' -
    NAT назначения dnat, dest_nat, destination_nat, 'dnat to' -
    Переадресация redir, redirect, 'redirect to' Используя переадресацию, пакеты будут перенаправлены на локальную машину
    Комментарий к правилу c, cmt, comment -
    Пользователь user, uid Совпадает только с трафиком, исходящим от конкретного пользователя
    Группа group, gid Совпадает только с трафиком, исходящим от конкретной группы
    Маркер брандмауэра mark -
    Приоритет prio, priority -
    Длина пакета len, length -
    Временная метка time, timestamp Совпадение временной метки получения пакета
    День недели day Совпадение с днем недели (0 = воскресенье, до 6 = суббота или "понедельник", "вторник", а также "пятница", "суббота")
    Время hour Совпадение с 24-часовым форматом "HH:MM:SS", с опциональными секундами

    Только одно из действия, NAT источника, Маскировка или NAT назначения может быть установлено для одного правила!

  • Информация: Специальные/сложные правила не могут быть настроены с использованием словаря правил.

    Вы можете использовать ключ 'raw' для предоставления любого пользовательского правила, которое будет добавлено в набор правил напрямую.

  • Информация: Вы можете определять переменные, наборы, счётчики и лимиты на уровне таблицы.

    • Переменные представляют собой пары ключ-значение.
      var-name: var-value
      var2-name: ['value1', 'value2']
      
    • Наборы имеют следующую структуру:
      set-name:
        flags: [список-флагов]  # необязательно
        settings:
          setting: value  # необязательно
      
    • Счётчики имеют следующую структуру:
      counter-name:
        comment: text  # необязательно
      
    • Лимиты имеют следующую структуру:
      limit-name:
        rate: 'over 1024 bytes/second burst 512 bytes'
        comment: text  # необязательно
      
  • Предупреждение: Если вы хотите добавить правило 'только для счётчика', вы должны явно установить 'действие' как 'none' - иначе будет добавлено значение по умолчанию 'accept'!

  • Информация: Если любое неподдерживаемое поле будет передано в перевод правила, это вызовет ошибку, так как это может привести к неожиданным результатам!

  • Информация: Docker может потребовать IPTables как зависимость пакета.

    См.: Пример использования Docker Host

О проекте

Ansible Role to provision NFTables firewall on linux servers

Установить
ansible-galaxy install ansibleguy/infra_nftables
Лицензия
other
Загрузки
3685
Владелец
[email protected] | GPG: https://badges.ansibleguy.net/public.gpg