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
Участие
Ревью кода, патчи, комментарии, отчёты о багах и запросы на функции приветствуются. Пожалуйста, прочитайте Руководство по участию для получения дополнительных деталей.