Nftables — различия между версиями

Материал из Rosalab Wiki
Перейти к: навигация, поиск
(Немного о nftables (файрвол))
Строка 77: Строка 77:
 
== Работа с nftables ==
 
== Работа с nftables ==
  
kkk
+
Рассмотрим базовый пример закрытие/открытие порта.
 +
 
 +
Для начала, создадим таблицу:
 +
nft add table inet my_table
 +
 
 +
{{File:nft}} {{Cmd|add table}} {{Pkg|[family]}} {{Pkg|[name]}}
 +
* [family] - один из протоколов ip/ip6/inet/arp/bridge/netdev
 +
* [name] - имя нашей новой таблицы
 +
 
 +
Помотрим, что она появилась у нас:
 +
nft -a list ruleset
 +
Теперь добавим цепочку:
 +
nft add chain inet my_table input { type filter hook input priority 0 \; policy accept \; }
 +
{{File:nft}} {{Cmd|add chain}} {{Pkg|[family]}} {{Pkg|[name table]}} {{Pkg|[name chain]}} {{Процесс|{hook}}}
 +
* [family] - один из протоколов ip/ip6/inet/arp/bridge/netdev
 +
* [name table] - имя нашей таблицы
 +
* [name chain] - имя нашей новой цепоки
 +
 
 +
Помотрим, что она появилась у нас:
 +
nft -a list ruleset
 +
 
 +
[[Файл:Nftable1.png]]
 +
 
 +
Добавим правило, которым ограничим доступ к 80 порту:
 +
nft add rule inet my_table input tcp dport 80 drop
 +
{{File:nft}} {{Cmd|add rule}} {{Pkg|[family]}} {{Pkg|[name table]}} {{Процесс|[protocol]}} {{Процесс|[dport]}} {{Программа|[port]}} {{Prog|[event]}}
 +
* [family] - один из протоколов nftable ip/ip6/inet/arp/bridge/netdev
 +
* [name table] - имя нашей таблицы
 +
* [name chain] - имя нашей новой цепоки
 +
* [protocol] - протокол tcp/udp/icmp и т.д.
 +
* [dport] - входящий порт (destination port}
 +
* [port] - номер входящего порта
 +
* [event] - что делать drop/accept/jump и т.д.
 +
 
 +
Логично предположить, что для открытия порта нам нужно выполнить:
 +
nft add rule inet my_table input tcp dport 80 accept
 +
Но получить доступ к 80 порту после этого нам не удастся, и если мы заглянем в список правил, будет видно, что сначала все пакеты на порт 80 блочатся, а потом "пропускаются". Но в нашем случае , пропускать уже нечего, т.к. изначально на этом порту всё блочится:
 +
 
 +
[[Файл:Nftable2.png]]
 +
 
 +
Нам нужно удалить правило с drop, для этого мы обращаем внимание на отметку handle 2 в выводе, и с её помощью удаляем запрещающее правило:
 +
nft delete rule inet my_table input handle 2
 +
Проверяем что у нас получилось:
 +
 
 +
[[Файл:Nftable3.png]]
 +
 
 +
Теперь доступ к 80 порту у нас есть в полном объеме.

Версия 16:15, 7 марта 2023

Немного о nftables (файрвол)

В Rosa Server/Desktop по умолчанию iptables заменен на nftables.

nftables — проект netfilter, целью которого ставится замена существующего набора межсетевых экранов iptables/ip6tables/arptables. Была разработана новая система фильтрации пакетов, добавлена пользовательская утилита ntf, а также создан слой совместимости с iptables/ip6tables. nftables использует набор хуков, систему отслеживания соединений, систему очередей и подсистему логирования netfilter.

Как и iptables, nftables построен на правилах, определяющих действия. Эти правила содержаться в таблицах (table), к которым прикреплены цепочки (chain). Цепочка может содержать набор правил и исполняется в хуках (hook) netfilter. Таблица специфична для каждого из протоколов (arp/ipv4/ipv6). Одно из основных отличий iptables заключается в том, что больше нет предопределенных таблиц и цепочек.

Таблицы:

  • table - это контейнер для ваших цепочек (chain).

Семейства таблиц:

  • ip : используется для цепочек, связанных с IPv4.
  • ip6 : используется для цепочек, связанных с IPv6.
  • arp : используется для цепочек, связанных с ARP.
  • bridge : используется для соединения связанных цепей.
  • inet : смешанные цепочки ipv4 / ipv6 (ядро 3.14 и выше).
  • netdev : используется для цепочек, которые фильтруют в начале стека (ядро 4.2 и выше).

Цепочки (chain):

  • chain - используются для группировки правил.
  • base chain - имеет зарегистрированный крючок, тип и приоритет.
  • other chain - не привязаны к хуку и по умолчанию не видят никакого трафика.

Существует три вида цепочек:

  1. filter - стандартный тип. фильтрует пакеты
  2. nat - протоколы ip/ip6/inet. хуки prerouting, input, output, postrouting. преобразование NAT
  3. route - протоколы ip/ip6. хуки output. маршрутизация

Хук (hook):

hook - это представление того, где происходит обработка, на каком этапе.

  • prerouting : это происходит до принятия решения о маршрутизации, все пакеты, входящие в машину, попадают в это правило.
  • input : все пакеты для локальной системы попадают в это правило.
  • forward : пакеты не для локальной системы, те, которые необходимо пересылать, попадают в это правило.
  • output : пакеты, исходящие из локальной системы, попадают в это правило.
  • postrouting : эта ловушка возникает после того, как решение о маршрутизации было принято, все пакеты, покидающие машину, попадают в это правило.
  • priority - относится к числу, используемому для упорядочивания цепочек или для установки их между некоторыми операциями.
  • policy - это утверждение для тех пакетов, которые явно не приняты или отклонены в содержащихся правилах.
    • accept : принять пакет.
    • drop : отбросить пакет.
    • queue : поставить пакет в очередь в пользовательское пространство и остановить оценку набора правил..
    • continue: продолжение
    • return : возврат из текущей цепочки и переход к следующему правилу последней цепочки. В базовой цепочке это эквивалентно accept.

Правила (rules):

rule - определяют, какое действие необходимо выполнить для каких пакетов. Правила прикреплены к цепочкам . Каждое правило может иметь выражение для сопоставления пакетов и одно или несколько действий, выполняемых при сопоставлении.

statements - представляют собой действие, которое должно быть выполнено при совпадении правила.

  • accept : принять пакет и остановить оценку набора правил.
  • drop : отбросить пакет и остановить оценку набора правил.
  • reject : отклонить пакет с сообщением icmp.
  • queue: поставить пакет в очередь в пользовательское пространство и остановить оценку набора правил.
  • continue: продолжить
  • return : возврат из текущей цепочки и переход к следующему правилу последней цепочки. В базовой цепочке это эквивалентно accept.
  • jump : продолжить с первого правила . Он будет продолжен в следующем правиле после выдачи оператора возврата.
  • goto : аналогично прыжку, но после новой цепочки оценка продолжится с последней цепочки вместо той, которая содержит оператор goto.
  • handle - внутренний номер индентифицирующий определенное правило.
  • position - это внутренний номер используемый для вставки правил до пределенного handle.

Установка Nftables

В Rosa Server/Desktop по умолчанию уже установлен nftables.

Если по каким-то причинам его нет, можно установить следующей командой:

dnf install nftables

Запуск сервиса nftables:

systemctl start ntfables.service

Чтобы включить его запуск при старте системы:

systemctl enable nftables.service

Работа с nftables

Рассмотрим базовый пример закрытие/открытие порта.

Для начала, создадим таблицу:

nft add table inet my_table

Файл:Nft add table [family] [name]

  • [family] - один из протоколов ip/ip6/inet/arp/bridge/netdev
  • [name] - имя нашей новой таблицы

Помотрим, что она появилась у нас:

nft -a list ruleset

Теперь добавим цепочку:

nft add chain inet my_table input { type filter hook input priority 0 \; policy accept \; }

Файл:Nft add chain [family] [name table] [name chain] {hook}

  • [family] - один из протоколов ip/ip6/inet/arp/bridge/netdev
  • [name table] - имя нашей таблицы
  • [name chain] - имя нашей новой цепоки

Помотрим, что она появилась у нас:

nft -a list ruleset

Nftable1.png

Добавим правило, которым ограничим доступ к 80 порту:

nft add rule inet my_table input tcp dport 80 drop

Файл:Nft add rule [family] [name table] [protocol] [dport] [port] [event]

  • [family] - один из протоколов nftable ip/ip6/inet/arp/bridge/netdev
  • [name table] - имя нашей таблицы
  • [name chain] - имя нашей новой цепоки
  • [protocol] - протокол tcp/udp/icmp и т.д.
  • [dport] - входящий порт (destination port}
  • [port] - номер входящего порта
  • [event] - что делать drop/accept/jump и т.д.

Логично предположить, что для открытия порта нам нужно выполнить:

nft add rule inet my_table input tcp dport 80 accept

Но получить доступ к 80 порту после этого нам не удастся, и если мы заглянем в список правил, будет видно, что сначала все пакеты на порт 80 блочатся, а потом "пропускаются". Но в нашем случае , пропускать уже нечего, т.к. изначально на этом порту всё блочится:

Nftable2.png

Нам нужно удалить правило с drop, для этого мы обращаем внимание на отметку handle 2 в выводе, и с её помощью удаляем запрещающее правило:

nft delete rule inet my_table input handle 2

Проверяем что у нас получилось:

Nftable3.png

Теперь доступ к 80 порту у нас есть в полном объеме.