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

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


flip:linux:nftables

Различия

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

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

Предыдущая версия справа и слеваПредыдущая версия
Следующая версия
Предыдущая версия
flip:linux:nftables [2024/12/25 09:35] flipflip:linux:nftables [2024/12/25 10:49] (текущий) flip
Строка 4: Строка 4:
 В некоторых дистрибутивах уже установлен, но отключен В некоторых дистрибутивах уже установлен, но отключен
  
-Установка пакета nftables+ 
 +==== Установка пакета nftables ====
  
 <code> <code>
Строка 10: Строка 11:
 </code> </code>
  
-Запуск nftables при загрузке+ 
 +==== Запуск nftables при загрузке ====
  
 <code> <code>
 systemctl enable nftables.service systemctl enable nftables.service
 </code> </code>
 +
 +
 +==== Файл настроек ====
  
 По умолчанию, правила находятся в По умолчанию, правила находятся в
Строка 20: Строка 25:
 >**/etc/nftables.conf** >**/etc/nftables.conf**
  
-Сбросить все правила в nftables, и остановить фильтрацию+Содержание: 
 + 
 +<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> <code>
Строка 26: Строка 90:
 </code> </code>
  
-Предотвратить запуск nftables при загрузке+ 
 +==== Предотвратить запуск nftables при загрузке ====
  
 <code> <code>
Строка 32: Строка 97:
 </code> </code>
  
-Удалить пакет nftables и все его следы в системе+ 
 +==== Удалить пакет nftables и все его следы в системе ====
  
 <code> <code>
Строка 40: Строка 106:
  
 ===== Синтаксис ===== ===== Синтаксис =====
 +
 +>**nft <команда> <объект> <путь к объекту> <параметры>**
 +
 +Команда — add, insert, delete, replace, rename, list, flush… \\
 +Объект — table, chain, rule, set, ruleset… \\
 +Путь к объекту зависит от типа. Например, у таблицы это <семейство> <название>. \\
 +У правила — гораздо длиннее: <семейство таблицы> <название таблицы> <название цепочки>. А иногда ещё добавляются handle или index. \\
 +Параметры зависят от типа объекта. Для правила это условие отбора пакетов и действие, применяемое к отобранным пакетам.
  
 Создать базовую таблицу IPv4 Создать базовую таблицу IPv4
Строка 106: Строка 180:
 nft add rule inet filter input tcp dport {80, 443} ct state new,established counter accept nft add rule inet filter input tcp dport {80, 443} ct state new,established counter accept
 </code> </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.1735119302.txt.gz · Последнее изменение: 2024/12/25 09:35 — flip

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki