Инструменты пользователя

Инструменты сайта


flip:linux:nftables

Это старая версия документа!


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 адрес;
  • ip daddr <ip-адрес> — 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
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 \; }
flip/linux/nftables.1735123191.txt.gz · Последнее изменение: 2024/12/25 10:39 — flip

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki