Ansible Роль: nftables

Эта роль Ansible позволяет устанавливать nftables и управлять его конфигурацией.
Для получения дополнительной информации о nftables, пожалуйста, ознакомьтесь с официальной страницей проекта.
Переменные роли
Переменные и свойства выделенные жирным шрифтом, обязательны. Остальные являются необязательными.
| Имя переменной | Описание | Значение по умолчанию | 
| nftables_flush_ruleset | Нужно ли сбрасывать текущий набор правил или нет. | yes | 
| nftables_config_file | Путь к файлу конфигурации. | /etc/nftables.conf | 
| nftables_tables | Список таблиц. | [] | 
Свойства таблицы
| Имя свойства | Описание | Значение по умолчанию | 
| name | Имя таблицы. |  | 
| family | Адресное семейство таблицы. Если указано, должно быть либо ip,ip6,inet,arp,bridgeилиnetdev. | ip | 
| sets | Список множеств. |  | 
| maps | Список отображений. |  | 
| verdict_maps | Список отображений решений. |  | 
| chains | Список цепочек. |  | 
Документация
Свойства множества
| Имя свойства | Описание | 
| name | Имя множества. | 
| type | Тип элементов, содержащихся в множестве. Должен быть либо ipv4_addr,ipv6_addr,ether_addr,inet_service,inet_proto,icmp_type,icmpv6_typeилиmark. | 
| size | Количество элементов, которые может содержать множество. | 
| policy | Политика выбора множества. Если указана, должна быть либо performance, либоmemory. | 
| timeout | Сколько времени элементы остаются в множестве. | 
| flags | Список флагов. Если указано, должен содержать хотя бы один из следующих: constant,interval,timeout. | 
| gc_interval | Интервал сборки мусора. | 
| elements | Список элементов, содержащихся в множестве. Элементы должны соответствовать типу множества. | 
Документация
Свойства отображения
| Имя свойства | Описание | 
| name | Имя отображения. | 
| keys_type | Тип ключей. Должен быть либо ipv4_addr,ipv6_addr,ether_addr,inet_service,inet_proto,icmp_type,icmpv6_typeилиmark. | 
| values_type | Тип значений. Должен быть либо ipv4_addr,ipv6_addr,ether_addr,inet_service,inet_proto,mark,counterилиquota. | 
| elements | Список элементов, содержащихся в отображении. Элементы должны соответствовать типам ключей и значений отображения. | 
Документация
Свойства элемента отображения
| Имя свойства | Описание | 
| key | Значение ключа. | 
| value | Значение, связанное с ключом. | 
Свойства отображения решений
verdict_map - это специальный случай map, где values_type всегда равен verdict. Поэтому свойство values_type отсутствует. Элементы, содержащиеся в verdict_map, имеют свойство verdict вместо свойства value.
| Имя свойства | Описание | 
| name | Имя отображения. | 
| keys_type | Тип ключей. Должен быть либо ipv4_addr,ipv6_addr,ether_addr,inet_service,inet_proto,icmp_type,icmpv6_typeилиmark. | 
| elements | Список элементов, содержащихся в отображении решений. | 
Свойства элемента отображения решений
| Имя свойства | Описание | 
| key | Значение ключа. | 
| verdict | Решение, связанное с ключом. | 
Свойства цепочки
| Имя свойства | Описание | 
| name | Имя цепочки. | 
| base | Основное правило для цепочки. | 
| rules | Список правил, содержащихся в цепочке. | 
Документация
Основные свойства
| Имя свойства | Описание | 
| type | Тип цепочки. Должен быть либо filter,natилиroute. | 
| hook | Хук, к которому прикреплена цепочка. Доступные значения зависят от type. | 
| priority | Целое число, определяющее порядок цепочек, прикрепленных к тому же hook. | 
| policy | Политика по умолчанию для цепочки. Если указана, должна быть либо accept, либоdrop. | 
Документация
Свойства правила
Документация
| Имя свойства | Описание | 
| position | Целое число, определяющее порядок правил в цепочке. | 
| statement | Заявление правила. | 
| comment | Комментарий, описывающий правило. | 
Пример
Вот небольшой пример того, как должен выглядеть ваш файл.
ВАЖНО: НЕ используйте это в качестве вашего брандмауэра!
---
nftables_flush_ruleset: yes
nftables_config_path: /etc/nftables.rules
nftables_tables:
  - name: firewall
    family: inet
    sets:
      - name: "set1"
        type: 
        size: 10
        policy: "performance"
        timeout: "1d"
        flags:
          - "timeout"
          - "interval"
        gc_interval: "12h" 
        elements:
          - 192.0.2.1
          - 192.0.2.2
    maps:
      - name: "map1"
        keys_type: "inet_service"
        values_type: "ipv4_addr"
        elements:
          - key: ssh
            value: "192.0.2.10"
      - name: "map2"
        keys_type: "inet_service"
        values_type: "ipv4_addr"
        elements:
          - key: ftp
            value: "192.0.2.25"
    verdict_maps:
      - name: "vmap1"
        keys_type: "inet_service"
        elements:
          - key: "192.0.2.10"
            value: "accept"
    chains:
      - name: "Мой фильтр ввода"
        base:
          type: "filter"
          hook: "input"
          priority: 0
          policy: "drop"
        rules:
          - position: 2
            statement: "ct state invalid log prefix 'Invalid_IN: ' drop"
            comment: "Логировать и сбрасывать недопустимые пакеты."
          - position: 1
            statement: "iif lo accept"
          - position: 3
            statement: "ct state {established,related} accept"
      - name: "Мой фильтр вывода"
        base:
          type: "filter"
          hook: "output"
          priority: -10
          policy: "accept"
        rules:
          - position: 1
            statement: "ip daddr 192.0.2.100 counter"
...
Тестирование
Тестирование включает следующие шаги:
- Проверка синтаксиса роли
- Первый запуск
- Второй запуск и проверка идемпотентности.
На следующих операционных системах:
- Debian 9
- CentOS 7
- Ubuntu 18.04
Участие
Ревью кода, патчи, комментарии, отчёты о багах и запросы на функции приветствуются. Пожалуйста, прочитайте Руководство по участию для получения дополнительных деталей.