====== NFTABLES ====== nftables заменяет фреймворк iptables \\ В некоторых дистрибутивах уже установлен, но отключен ==== Установка пакета nftables ==== apt install nftables ==== Запуск nftables при загрузке ==== systemctl enable nftables.service ==== Файл настроек ==== По умолчанию, правила находятся в >**/etc/nftables.conf** Содержание: #!/usr/sbin/nft -f flush ruleset table inet filter { chain input { type filter hook input priority filter; } chain forward { type filter hook forward priority filter; } chain output { type filter hook output priority filter; } } ==== Просмотр текущих правил nftables ==== nft list ruleset ==== Удалить правило ==== Каждое правило при добавлении получает свой номер (**handle**). \\ Чтобы посмотреть эти номера нужно использовать ключ -a nft -a list ruleset И затем можно удалить правило по его номеру, указав путь до цепочки (inet filter input) nft delete rule inet filter input handle 2 ==== Сохранить конфигурацию ==== echo '#!/usr/sbin/nft -f' > /etc/nftables.conf echo 'flush ruleset' >> /etc/nftables.conf nft list ruleset >> /etc/nftables.conf После сохранения перезапустить nftables systemctl restart nftables ==== Сбросить все правила в nftables, и остановить фильтрацию ==== nft flush ruleset ==== Предотвратить запуск nftables при загрузке ==== systemctl mask nftables.service ==== Удалить пакет nftables и все его следы в системе ==== apt purge nftables ===== Синтаксис ===== >**nft <команда> <объект> <путь к объекту> <параметры>** Команда — add, insert, delete, replace, rename, list, flush… \\ Объект — table, chain, rule, set, ruleset… \\ Путь к объекту зависит от типа. Например, у таблицы это <семейство> <название>. \\ У правила — гораздо длиннее: <семейство таблицы> <название таблицы> <название цепочки>. А иногда ещё добавляются handle или index. \\ Параметры зависят от типа объекта. Для правила это условие отбора пакетов и действие, применяемое к отобранным пакетам. Создать базовую таблицу IPv4 nft add table inet filter Создать цепочку для исходящего трафика IPv4 nft add chain inet filter input { type filter hook input priority 0\; } Правило, для подсчета входящих пакетов (IPv4) nft add rule inet filter input counter accept Показать результат предыдущих команд: nft list table inet filter Сбросить правила для цепочки filter input nft flush chain inet filter input Удалить цепочки filter input nft delete chain inet filter input Удалить таблицу filter nft delete table inet filter Семейство не обязательных параметров. По умолчанию используется 'ip' nft add table ip6 filter nft add chain ip6 filter input nft add rule ip6 filter input counter accept Директория с примерами конфигураций в Debian >**/usr/share/doc/nftables/examples/** Подсчет входящего трафика на порт tcp/22 nft add rule inet filter input tcp dport 22 counter Подсчет и прием трафика на 80/tcp и 443/tcp для новых и существующих соединений nft add rule inet filter input tcp dport {80, 443} ct state new,established counter accept ===== Структура ===== ==== Список таблиц ==== * **filter** — здесь пакеты фильтруются, то есть их можно пропустить или отбросить. * Содержит цепочки: **input**, **forward**, **output**. * **nat** — здесь работает NAT (проброс портов, входящий и исходящий NAT). * Содержит цепочки: **prerouting**, **output**, **postrouting**. * **mangle** — позволяет вносить изменения в заголовки ip-пакетов. * Содержит все цепочки. * **raw** — позволяет выборочно пропускать или отбрасывать пакеты перед тем, как они попадут в механизм отслеживания соединения (**ct** - connection tracking), что значительно снижает нагрузку на процессор. * Содержит цепочки: **prerouting** и **output**. Таблицы могут быть одного из 6-ти семейств (families): * **ip** — для обработки пакетов IPv4 * **ip6** — IPv6 * **inet** — обрабатывает сразу и IPv4 и IPv6 (чтобы не дублировать одинаковые правила) * **arp** — пакеты протокола ARP * **bridge** — пакеты, проходящие через мост * **netdev** — для обработки «сырых» данных, поступающих из сетевого интерфейса (или передающихся в него) ==== Прохождение цепочки ==== Пакет, попавший в цепочку, начинает проходить правила указанные в ней сверху вниз. Фаервол сравнивает пакет с первым правилом, затем со вторым и так далее. Если фаервол определит правило для этого пакета, то с пакетом будет выполнено действие: * **drop** — пакет будет уничтожен; * **accept** — пакет сразу же покинет эту цепочку и пойдет дальше, то есть нижние правила уже не будут рассмотрены. А если фаервол не найдет в данной цепочке подходящего правила для пакета, то фаервол выполнит действие с пакетом, которое указано в политике (**policy accept** или **policy drop**). ==== Для создания правил ==== * **ip saddr ** — исходящий ip адрес; * **ip daddr ** — ip адрес назначения (в цепочки input является адресом сервера к которому идет подключение); * **tcp sport <порт>** — исходящий tcp порт; * **tcp dport <порт>** — порт tcp назначения (в цепочки input является портом сервера к которому идет подключение); * **udp sport <порт>** — исходящий udp порт; * **udp dport <порт>** — порт udp назначения; * **iifname <имя интерфейса>** — имя входящего интерфейса; * **oifname <имя интерфейса>** — имя исходящего интерфейса. * **counter** - счетчик пакетов **Connection tracking** — это модуль, который определяет состояния соединений. Соединения могут быть: * **new** — пакет устанавливает новое соединение; * **estableshed** — пакет является частью существующего соединения (например ответ на ping или ответ на http запрос); * **related** — пакет является частью связанного соединения. Например, FTP использует порт 21 для установления соединения, но данные передаются через другой порт. И вот передача данных будет осуществляться по related соединению; * **invalid** — пакет не является частью каких-либо соединений в таблице connection tracking. **Смена политик** * **nft add chain <семейство> <цепочка> <таблица> { policy accept \; }** — разрешающая политика; * **nft add chain <семейство> <цепочка> <таблица> { policy drop \; }** — запрещающая политика. ===== Примеры ===== ==== Разрешить все подключения к loopback ==== Интерфейс **lo** nft add rule inet filter input iifname lo counter accept ==== Разрешить ssh с определенного IP ==== Интерфейс **eth0** nft add rule inet filter input iifname eth0 ip saddr 192.168.0.2 tcp dport 22 counter accept ==== Разрешить PING из подсети ==== nft add rule inet filter input ip saddr 192.168.0.0/24 icmp type echo-request counter accept ==== Разрешить ответные соединения estableshed + related ==== nft add rule inet filter input ct state established,related counter accept ==== Разрешить порты http, https (80, 443) ==== nft add rule inet filter input tcp dport {80, 443} counter accept ==== Смена политики цепочки input ==== nft chain inet filter input { policy drop \; } ===== Ссылки ===== * [[https://wiki.archlinux.org/title/Nftables_(Русский)]]