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

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


flip:linux:nftables

Различия

Показаны различия между двумя версиями страницы.

Ссылка на это сравнение

Следующая версия
Предыдущая версия
flip:linux:nftables [2024/12/25 09:21] – создано flipflip:linux:nftables [2024/12/25 10:49] (текущий) flip
Строка 1: Строка 1:
 ====== NFTABLES ====== ====== NFTABLES ======
 +
 +nftables заменяет фреймворк iptables \\
 +В некоторых дистрибутивах уже установлен, но отключен
 +
 +
 +==== Установка пакета nftables ====
 +
 +<code>
 +apt install nftables
 +</code>
 +
 +
 +==== Запуск nftables при загрузке ====
 +
 +<code>
 +systemctl enable nftables.service
 +</code>
 +
 +
 +==== Файл настроек ====
 +
 +По умолчанию, правила находятся в
 +
 +>**/etc/nftables.conf**
 +
 +Содержание:
 +
 +<code>
 +#!/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;
 +        }
 +}
 +</code>
 +
 +
 +==== Просмотр текущих правил nftables ====
 +
 +<code>
 +nft list ruleset
 +</code>
 +
 +
 +==== Удалить правило ====
 +
 +Каждое правило при добавлении получает свой номер (**handle**). \\
 +Чтобы посмотреть эти номера нужно использовать ключ -a
 +
 +<code>
 +nft -a list ruleset
 +</code>
 +
 +И затем можно удалить правило по его номеру, указав путь до цепочки (inet filter input)
 +
 +<code>
 +nft delete rule inet filter input handle 2
 +</code>
 +
 +
 +==== Сохранить конфигурацию ====
 +
 +<code>
 +echo '#!/usr/sbin/nft -f' > /etc/nftables.conf
 +echo 'flush ruleset' >> /etc/nftables.conf
 +nft list ruleset >> /etc/nftables.conf
 +</code>
 +
 +После сохранения перезапустить nftables
 +
 +<code>
 +systemctl restart nftables
 +</code>
 +
 +
 +==== Сбросить все правила в nftables, и остановить фильтрацию ====
 +
 +<code>
 +nft flush ruleset
 +</code>
 +
 +
 +==== Предотвратить запуск nftables при загрузке ====
 +
 +<code>
 +systemctl mask nftables.service
 +</code>
 +
 +
 +==== Удалить пакет nftables и все его следы в системе ====
 +
 +<code>
 +apt purge nftables
 +</code>
 +
 +
 +===== Синтаксис =====
 +
 +>**nft <команда> <объект> <путь к объекту> <параметры>**
 +
 +Команда — add, insert, delete, replace, rename, list, flush… \\
 +Объект — table, chain, rule, set, ruleset… \\
 +Путь к объекту зависит от типа. Например, у таблицы это <семейство> <название>. \\
 +У правила — гораздо длиннее: <семейство таблицы> <название таблицы> <название цепочки>. А иногда ещё добавляются handle или index. \\
 +Параметры зависят от типа объекта. Для правила это условие отбора пакетов и действие, применяемое к отобранным пакетам.
 +
 +Создать базовую таблицу IPv4
 +
 +<code>
 +nft add table inet filter
 +</code>
 +
 +Создать цепочку для исходящего трафика IPv4
 +
 +<code>
 +nft add chain inet filter input { type filter hook input priority 0\; }
 +</code>
 +
 +Правило, для подсчета входящих пакетов (IPv4)
 +
 +<code>
 +nft add rule inet filter input counter accept
 +</code>
 +
 +Показать результат предыдущих команд:
 +
 +<code>
 +nft list table inet filter
 +</code>
 +
 +Сбросить правила для цепочки filter input
 +
 +<code>
 +nft flush chain inet filter input
 +</code>
 +
 +Удалить цепочки filter input
 +
 +<code>
 +nft delete chain inet filter input
 +</code>
 +
 +Удалить таблицу filter
 +
 +<code>
 +nft delete table inet filter
 +</code>
 +
 +Семейство не обязательных параметров. По умолчанию используется 'ip'
 +
 +<code>
 +nft add table ip6 filter
 +nft add chain ip6 filter input
 +nft add rule ip6 filter input counter accept
 +</code>
 +
 +Директория с примерами конфигураций в Debian
 +
 +>**/usr/share/doc/nftables/examples/**
 +
 +Подсчет входящего трафика на порт tcp/22
 +
 +<code>
 +nft add rule inet filter input tcp dport 22 counter
 +</code>
 +
 +Подсчет и прием трафика на 80/tcp и 443/tcp для новых и существующих соединений
 +
 +<code>
 +nft add rule inet filter input tcp dport {80, 443} ct state new,established counter accept
 +</code>
 +
 +
 +===== Структура =====
 +
 +
 +==== Список таблиц ====
 +
 +  * **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**
 +
 +<code>
 +nft add rule inet filter input iifname lo counter accept
 +</code>
 +
 +==== Разрешить ssh с определенного IP ====
 +
 +Интерфейс **eth0**
 +
 +<code>
 +nft add rule inet filter input iifname eth0 ip saddr 192.168.0.2 tcp dport 22 counter accept
 +</code>
 +
 +
 +==== Разрешить PING из подсети ====
 +
 +<code>
 +nft add rule inet filter input ip saddr 192.168.0.0/24 icmp type echo-request counter accept
 +</code>
 +
 +
 +==== Разрешить ответные соединения estableshed + related ====
 +
 +<code>
 +nft add rule inet filter input ct state established,related counter accept
 +</code>
 +
 +
 +==== Разрешить порты http, https (80, 443) ====
 +
 +<code>
 +nft add rule inet filter input tcp dport {80, 443} counter accept
 +</code>
 +
 +
 +==== Смена политики цепочки input ====
 +
 +<code>
 +nft chain inet filter input { policy drop \; }
 +</code>
 +
 +
 +===== Ссылки =====
 +
 +  * [[https://wiki.archlinux.org/title/Nftables_(Русский)]]
  
  
flip/linux/nftables.1735118497.txt.gz · Последнее изменение: 2024/12/25 09:21 — flip

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki