nftables

Тест молекулы

Требования

  1. Установите Ansible:
sudo apt install python3
python3 -m ensurepip --upgrade
pip3 install ansible

Обязательные переменные

Просмотрите переменные, как показано в значениях по умолчанию.

Вы можете добавить определение брандмауэра в переменные для вашего хоста (../host_vars/[имя_хоста].yaml), группы хостов (../group_vars/[имя_группы].yaml) с использованием следующей структуры (см. molecule.default.vars/test.yaml для примера):

# эта переменная указывает на правила, которые отправляются на удалённый хост
# это словарь таблиц, с цепочками и правилами, см. molecule/default/vars/test.yaml
nftables_ruleset:
  # ключи этого словаря становятся таблицами
  # они должны быть:
  # семейством и названием брандмауэра, например:
  "inet firewall":

    # описание таблицы
    comment: "брандмауэр устройства"

    chains:

      # имя соответствующей цепочки
      input:
        # имя переменной из nftables_rules
        # которую вы хотите поместить в эту цепочку
        - input_hook
        - valid_connections
        - ...

  # другая таблица с такой же структурой
  # допустимые семьи: inet, inet6, netdev и inet,
  # см. документацию nftables для полного справочника
  "inet foo":

# потенциальные правила определяются в `nftables_rules`
# каждое правило имеет два атрибута:
# -> def: определение правил или набора правил в корректном синтаксисе nftables
# -> depends_on: необязательный список зависимостей переменных из nftables_variables
# см. molecule/default/vars/test.yaml для примера

nftables_rules:
  input_hook: >
    type filter hook input priority 0; policy drop;
  valid_connections:
    def: |
        ct state established, related accept
        ct state invalid drop

  new_connections:
    def: |
        ct state new accept


# это определения переменных, которые включаются с depends_on
# убедитесь, что ключи совпадают
# см. molecule/default/vars/test.yaml для примера
nftables_variables:

  tcp_ports:
    comment: конфигурация TCP портов
    def: |
      {% if nftables_open_tcp_ports_global %}define OPEN_TCP_PORTS = { {{ nftables_open_tcp_ports_global | join(",") }} }{% endif +%}
      {% if nftables_open_tcp_ports_local %}define LOCAL_OPEN_TCP_PORTS = { {{ nftables_open_tcp_ports_local | join(",") }} }{% endif +%}
      {% if nftables_open_tcp_ports_vpn %}define VPN_TCP_PORTS = { {{ nftables_open_tcp_ports_vpn | join(",") }} }{% endif +%}

  ...

Плейбук Ansible проверит, переданы ли правильные переменные роли с помощью argument_spec.

Пример плейбука

Минимальный (при условии, что вы передали переменные в другом месте):

hosts:
  - foo
roles:
  - pimvh.nftables

Суть - что произойдет, если я это запущу

  • проверить, определены ли правила/некоторые другие переменные
  • установить nftables и интерфейс на Python
  • создать необходимые таблицы nftables
  • создать динамические таблицы в виде пустых таблиц
  • создать пустой блоклист
  • скопировать шаблон nftables в директорию nftables
  • отредактировать службу nftables, чтобы она ссылалась на наш новый основной файл
  • создать скрипт для перезагрузки брандмауэра, который сохраняет таблицы вне нашего контроля в файлы и перезагружает брандмауэр после
  • когда nftables_abuseip_api_key определен, добавить скрипт для получения блоклиста с использованием их API и сделать его службой systemd
  • включить службу nftables по запросу
  • удалить iptables по запросу

Будущие улучшения

  • Упростить структуру правил, которые нужно передать
  • Улучшить argument_specs для nftables_variables и nftables_ruleset
О проекте

role to configure nftables using a YAML file

Установить
ansible-galaxy install pimvh/nftables
Лицензия
gpl-3.0
Загрузки
98
Владелец