infra_nftables
Ansible Роль - NFTables
Роль для установки фаервола NFTables на Linux-серверах.
Логи 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
Документация
- NFTables: Вики
- Ознакомьтесь с Примером!
- Практические примеры использования (Docker, Proxmox, Сетевая защита)
- Интеграция Fail2Ban с NFTables
- Руководство по устранению неполадок
Устранение неполадок
Использование
Хотите простой графический интерфейс для 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/'
Отказ от опций по умолчанию:
- Установка NFTables из backports Debian 11 при работе на Debian 10 (новая версия)
- Добавление скрипта автодополнения для bash для команды 'nft'
Информация
Примечание: Большинство функций роли можно включить или отключить.
Для всех доступных опций - см. конфигурацию по умолчанию в основном файле настроек!
Предупреждение: Не каждая настройка/переменная, которую вы предоставляете, будет проверена на корректность. Плохая конфигурация может сломать роль!
Информация: Вы можете добавить функции разрешения 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 как зависимость пакета.
Ansible Role to provision NFTables firewall on linux servers
ansible-galaxy install ansibleguy/infra_nftables