Nftables — различия между версиями
PastorDi (обсуждение | вклад) (→Немного о nftables (файрвол)) |
|||
(не показано 5 промежуточных версий 1 участника) | |||
Строка 1: | Строка 1: | ||
== Немного о nftables (файрвол) == | == Немного о nftables (файрвол) == | ||
− | |||
− | |||
nftables — проект netfilter, целью которого ставится замена существующего набора межсетевых экранов iptables/ip6tables/arptables. Была разработана новая система фильтрации пакетов, добавлена пользовательская утилита ntf, а также создан слой совместимости с iptables/ip6tables. nftables использует набор хуков, систему отслеживания соединений, систему очередей и подсистему логирования netfilter. | nftables — проект netfilter, целью которого ставится замена существующего набора межсетевых экранов iptables/ip6tables/arptables. Была разработана новая система фильтрации пакетов, добавлена пользовательская утилита ntf, а также создан слой совместимости с iptables/ip6tables. nftables использует набор хуков, систему отслеживания соединений, систему очередей и подсистему логирования netfilter. | ||
+ | |||
+ | Утилита iptables теперь по умолчанию предоставляется пакетом iptables-nft и преобразует синтаксис iptables в интерфейс nft, т.е. позволяет управлять той же подсистемой ядра Linux, что и утилиты из пакета nftables. | ||
Как и iptables, nftables построен на правилах, определяющих действия. Эти правила содержаться в таблицах (table), к которым прикреплены цепочки (chain). Цепочка может содержать набор правил и исполняется в хуках (hook) netfilter. Таблица специфична для каждого из протоколов (arp/ipv4/ipv6). Одно из основных отличий iptables заключается в том, что больше нет предопределенных таблиц и цепочек. | Как и iptables, nftables построен на правилах, определяющих действия. Эти правила содержаться в таблицах (table), к которым прикреплены цепочки (chain). Цепочка может содержать набор правил и исполняется в хуках (hook) netfilter. Таблица специфична для каждого из протоколов (arp/ipv4/ipv6). Одно из основных отличий iptables заключается в том, что больше нет предопределенных таблиц и цепочек. | ||
− | '''Таблицы''': | + | '''Таблицы (table)''': |
* table - это контейнер для ваших цепочек (chain). | * table - это контейнер для ваших цепочек (chain). | ||
− | '''Семейства таблиц''': | + | '''Семейства таблиц (family)''': |
* ip : используется для цепочек, связанных с IPv4. | * ip : используется для цепочек, связанных с IPv4. | ||
Строка 70: | Строка 70: | ||
Запуск сервиса nftables: | Запуск сервиса nftables: | ||
− | systemctl start | + | systemctl start nftables.service |
Чтобы включить его запуск при старте системы: | Чтобы включить его запуск при старте системы: | ||
Строка 77: | Строка 77: | ||
== Работа с nftables == | == Работа с nftables == | ||
− | + | Рассмотрим базовый пример закрытие/открытие порта. | |
+ | |||
+ | Для начала, создадим таблицу: | ||
+ | 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 порту у нас есть в полном объеме. | ||
+ | |||
+ | Если мы хотим полной очистки таблицы, то выполняем: | ||
+ | nft delete table inet my_table | ||
+ | Если хотим полностью очистить файрвол (все цепочки, таблицы), то выполняем: | ||
+ | nft flush ruleset | ||
+ | |||
+ | == Фронтэнд Nftables == | ||
+ | |||
+ | Хочу отметить вот какой момент - пользователи, привыкшие работать с [https://firewalld.org/ firewalld] могут продолжать работать с ним, и писать правила с его помощью. | ||
+ | |||
+ | Теперь firewalld может использовать в качестве бекенда nftables вместо iptables. | ||
+ | |||
+ | Больше информации по [https://www.nftables.org/ nftable] вы найдете в [https://wiki.nftables.org/ документации]. | ||
+ | |||
+ | [[Категория:ROSA Server]] |
Текущая версия на 10:36, 18 октября 2023
Содержание
Немного о nftables (файрвол)
nftables — проект netfilter, целью которого ставится замена существующего набора межсетевых экранов iptables/ip6tables/arptables. Была разработана новая система фильтрации пакетов, добавлена пользовательская утилита ntf, а также создан слой совместимости с iptables/ip6tables. nftables использует набор хуков, систему отслеживания соединений, систему очередей и подсистему логирования netfilter.
Утилита iptables теперь по умолчанию предоставляется пакетом iptables-nft и преобразует синтаксис iptables в интерфейс nft, т.е. позволяет управлять той же подсистемой ядра Linux, что и утилиты из пакета nftables.
Как и iptables, nftables построен на правилах, определяющих действия. Эти правила содержаться в таблицах (table), к которым прикреплены цепочки (chain). Цепочка может содержать набор правил и исполняется в хуках (hook) netfilter. Таблица специфична для каждого из протоколов (arp/ipv4/ipv6). Одно из основных отличий iptables заключается в том, что больше нет предопределенных таблиц и цепочек.
Таблицы (table):
- table - это контейнер для ваших цепочек (chain).
Семейства таблиц (family):
- ip : используется для цепочек, связанных с IPv4.
- ip6 : используется для цепочек, связанных с IPv6.
- arp : используется для цепочек, связанных с ARP.
- bridge : используется для соединения связанных цепей.
- inet : смешанные цепочки ipv4 / ipv6 (ядро 3.14 и выше).
- netdev : используется для цепочек, которые фильтруют в начале стека (ядро 4.2 и выше).
Цепочки (chain):
- chain - используются для группировки правил.
- base chain - имеет зарегистрированный крючок, тип и приоритет.
- other chain - не привязаны к хуку и по умолчанию не видят никакого трафика.
Существует три вида цепочек:
- filter - стандартный тип. фильтрует пакеты
- nat - протоколы ip/ip6/inet. хуки prerouting, input, output, postrouting. преобразование NAT
- 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 nftables.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
Добавим правило, которым ограничим доступ к 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 блочатся, а потом "пропускаются". Но в нашем случае , пропускать уже нечего, т.к. изначально на этом порту всё блочится:
Нам нужно удалить правило с drop, для этого мы обращаем внимание на отметку handle 2 в выводе, и с её помощью удаляем запрещающее правило:
nft delete rule inet my_table input handle 2
Проверяем что у нас получилось:
Теперь доступ к 80 порту у нас есть в полном объеме.
Если мы хотим полной очистки таблицы, то выполняем:
nft delete table inet my_table
Если хотим полностью очистить файрвол (все цепочки, таблицы), то выполняем:
nft flush ruleset
Фронтэнд Nftables
Хочу отметить вот какой момент - пользователи, привыкшие работать с firewalld могут продолжать работать с ним, и писать правила с его помощью.
Теперь firewalld может использовать в качестве бекенда nftables вместо iptables.
Больше информации по nftable вы найдете в документации.