Список таблиц в NFT

Netfilter

В Linux брандмауэр встроен в ядро и называется он Netfilter. А для управления им могут использоваться различные утилиты. В Debian и Ubuntu более старших версий использовалась утилита iptables. А в Debian 11 и Ubuntu 22.04 начали использовать – nftables. Именно с этой утилитой я вас и познакомлю. Но вначале узнаем как вообще работает Netfilter.

Фаервол Netfilter делит весь трафик на цепочки (chain) и обрабатывает каждую цепочку по отдельности.

Список таблиц в NFT

Прохождение пакетов по цепочкам Netfilter

Входящий трафик сразу же обрабатывается в цепочке prerouting (здесь может сработать входящий NAT).

После чего, если трафик:

Если трафик попал в цепочку forward, то перед самым выходом он попадёт в цепочку postrouting (здесь может сработать исходящий NAT).

А весь исходящий трафик обрабатывается цепочкой output (здесь тоже может отработать исходящий NAT).

Список таблиц в NFT

Направление трафика и прохождение пакетами цепочек

Над пакетами совершаются различные действия, которые группируются в таблицы. И каждая цепочка может входить в ту или иную таблицу, или может находится в нескольких или во всех таблицах сразу. Если цепочка входит в определённую таблицу, это означает что в этой цепочке над пакетами можно выполнять действия из этой таблицы.

О чем эта статья

Этот курс предполагает что вы используете сервер Linux именно как сервер, а не как роутер. Поэтому проходящий сквозь сервер трафик я рассматривать не буду. И это условие значительно снижает количество таблиц и цепочек, которые мы рассмотрим.

Так как сервер принимает от клиентов какие-то запросы, обрабатывает их и отвечает на них. То здесь рассматриваются всего две цепочки:

Рассматривать мы будем запрещающие или разрешающие правила, они присутствуют в таблице filter.

Также в этой статье мы рассмотрим механизм connection tracking.

Troubleshooting

Before loading new or edited rules check them with

No such file or directory

If this error is printed for every chain of a table definition make sure, that the table’s family is available through the kernel. This happens for example if the table uses family inet and the kernel configuration did not enable mixed IPv4 and IPv6 rules (CONFIG_NF_TABLES_INET).

A set definition of IP ranges causes this error if ranges overlap. For example 224.0.0.0/3 and 240.0.0.0/5 overlap completely. Either add auto-merge to the set’s options, drop the range that is fully included or change syntax to 224.0.0.0-255.255.255.255.

Default configuration of the save and restore function use numeric mode to store the rule set. The persisted rule set could have changed from the original upload from a manually written file. Such a transformation might break things. Therefore make sure:

If all three conditions are met remove the -n parameter from SAVE_OPTIONS in /etc/conf.d/nftables. Then load your rule set again from the manually written file and restart the service again. This cycles through save and restore and should create a fully working rule set.

This affected at least version 0.9.9, see bug #819456.

Family netdev and ingress hook

Broken packets should be rejected early which requires an ingress hook for family netdev. This sets up a chain that acts for a dedicated network device before packets enter further processing – improved performance. The configuration looks like this:

Family netdev and ingress chain

Mind the device name enp4s0. If this changes for example when changing hardware or an upgrade changed device naming this family is broken. In turn none of the rules will be loaded. The error looks like this (filename and line numbers differ depending on the host configuration):

Error at chains instead of non-existing device

Check the device name is actually correct and exists, e.g. ip addr list.

Правила

Конечно, писать низкоуровневые правила пользователи не будут, доступен понятный язык описания. Новый синтаксис правил непохож на iptables, главное отличие — использование иерархических блочных структур вместо линейной схемы. Группировка позволяет легко составлять, читать и понимать настройки без особых пояснений. Синтаксис при этом чем-то напоминает ipfw из FreeBSD.

Язык классификации правил основан на реальной грамматике, при обработке которой используется парсер bison. К сожалению, документация в этом вопросе мало помогает, она просто еще не готова. О возможностях можно судить только по исходному коду nftables и обрывкам информации в специализированных мейл-листах.

Список таблиц в NFT

Для настройки правил используется утилита nft

Правила могут содержать:

Теперь разрешаем доступ с подсети 192.168.1.0/24 и IP 192.168.0.10 по SSH, блокируем для всех доступ по 80-му порту и разрешаем все пакеты уже установленного соединения (connection tracking).

Счетчики — необязательный элемент в правилах, и, если он нужен, его необходимо активировать. Теперь в одном правиле можно указать сразу несколько действий. Например, подсчитаем количество пакетов, отправленных на 192.168.0.1, и заблокируем соединение:

nft add rule ip filter output ip daddr 192.168.0.1 counter drop

Вместо IP в правилах возможно использование доменного имени:

nft add rule ip6 filter output ip daddr example.org accept

Фильтр интерфейса позволяет указывать правило для конкретного сетевого интерфейса (сетевуха должна присутствовать в системе, иначе правило не будет активным):

nft insert rule filter input meta iif eth0 accept

Еще один нюанс. Утилита nft может работать в трех режимах, чем-то напоминая управление в Cisco. Например, все настройки можно указать в файле и затем просто скормить конфиг nft, это очень удобно для переноса рулесетов на несколько ПК. В каталоге files/nftables с исходными текстами уже имеется ряд шаблонов, перед началом использования nftables необходимо выбрать нужные и активировать:

# nft -f files/nftables/ipv4-filter
# nft -f files/nftables/ipv6-filter

Также есть режим командной строки, когда нужная настройка указывается сразу, и интерактивный режим CLI. Перейти в CLI просто:

# nft -i

Теперь можем последовательно давать команды или считывать настройки. Единичные правила группируются в таблице, образуя иерархическую блочную структуру, напоминающую pf и npf.

Правило можно вставить в нужную позицию (handle), здесь работают две директивы — add и insert. Первая добавляет правило после указанной позиции, а вторая — перед. Например, чтобы вставить правило перед handle 8, пишем:

nft insert rule filter output position 8 ip daddr 127.0.0.1 drop

Удаляются правила в цепочке при помощи параметра delete:

Если не указывать номер правила, то будет очищена вся цепочка. При помощи flush сбрасывается вся таблица:

nft flush table filter

Настройка NAT не сложнее, вначале необходимо загрузить модули:

modprobe nft_nat
modprobe nft_chain_nat_ipv4
modprobe nft_chain_nat_ipv6

И добавляем в нее правила:

nft add rule nat post ip saddr 192.168.1.0/24 meta oif eth0 snat 192.168.1.1
nft add rule nat pre udp dport 53 ip saddr 192.168.1.0/24 dnat 8.8.8.8:53

Первое активирует NAT для всего трафика с 192.168.1.0/24 на интерфейсе eth0, второе перенаправляет весь DNS-трафик на 8.8.8.8.

Список таблиц в NFT

В поставке nftables идут шаблоны правил

Current status

NOTE: Debian 10 Buster and later use the nftables framework by default.

Про NFT:  Повысьте уровень своего игрового процесса Minecraft с помощью NFT-сервера

Starting with Debian 10 Buster, nf_tables is the default backend when using iptables, by means of the iptables-nft layer (i.e, using iptables syntax with the nf_tables kernel subsystem). This also affects ip6tables, arptables and ebtables.

Main features of nftables

Now, nftables uses a more compact and intuitive syntax inspired by the tcpdump tool. Nftables provides a compatibility layer with iptables, using the same syntax above the nftables framework (which is used in Debian 10 if nft is not installed). In nftables tables and strings are fully configurable, there are no predefined tables that should always be there, even if we don’t use them (as is the case with iptables). Names can also be arbitrary.

Another important feature of nftables is that the «match» -m and the «target» -j disappear, the nftables have expressions. Nftables allows you to do multiple actions in a single rule (multiple targets), which was not easily possible with iptables. By default we don’t have counters built into rules and chains, they are now optional and can be enabled if we want. Finally, nftables allows easier management of IPv4 and IPv6 rule sets, henceforth we will not have to «adapt» rules from iptables to ip6tables as before.

We recommend that you visit the nftables official website where you will find all the details about this firewall for Linux operating systems.

Usage

nftables makes no distinction between temporary rules made in the command line and permanent ones loaded from or saved to a file.

All rules have to be created or loaded using nft command line utility.

Refer to #Configuration section on how to use.

Current ruleset can be printed with:

# nft list ruleset

Remove all ruleset leaving the system with no firewall:

# nft flush ruleset

Read ruleset from /etc/nftables.conf by restarting nftables.service.

comes with a simple and secure firewall configuration stored in the /etc/nftables.conf file.

The nftables.service will load rules from that file when started or enabled.

Import / Export

sudo nft —file ruleset.nft

Also, if you want to read from stdin, you can do so like so:

The rules defined within the configuration file at /etc/nftables.conf are what are used when a server restarts.
Thus, we can use the export command and a few manual additions to overwrite this configuration file
to make our dynamically added rules permanent like so:

List Rules In JSON Format

sudo nft —json list ruleset

You can use shorthand -j instead of —json if you wish.
I don’t think that you can use this for export/import. This is just listing the rules in JSON format.</warning.

This will output the rules in a compressed JSON format. If you want to be able to easily be able to read/edit the rules, you can use the jq tool like so:

You may need to install jq by running: sudo apt install jq -y

Schema

Information about the JSON schema can be found online.

Port iptables to nftables

sudo apt install iptables-nftables-compat

Use the porting tool we installed earlier to port the iptables rules over to nftables rules:

The shorthand to —file is just -f.

Management

You can also backup your rules:

And load it atomically:

What is nftables?

Is the new framework by the Netfilter Project, allowing you to perform packet filtering (firewalling), NAT, mangling and packet classification.

Setting up and running nftables on Debian 10

To start nftables in Debian 10, just install the frontend, everything else is already installed (and used, even if we put iptables).

sudo apt install nftables

The default file is /etc/nftables.conf, which already contains a simple firewall table for ipv4 / ipv6 called an “inet filter”.

Список таблиц в NFT

Then, if we incorporated new rules manually, we need to restart nftables to apply the changes:

systemctl restart nftables.service

Replacing rules

You can replace any rule via the replace command by indicating the rule handle, which you have to find by first listing the ruleset with option -a:

To replace the rule with handle 2, specify its handle number and the new rule that you want to replace it:

nft replace rule filter input handle counter

Listing the ruleset after the above replacement:

# nft list ruleset
table ip filter
chain input
filter hook input priority policy accept
counter packets bytes

you can see that the old rule that counted TCP packets has been replaced by the new rule that counts all packets.

Установка nftables в Ubuntu

На данный момент единственный выход изучить новинку — это установить nftables самостоятельно. Нам потребуются библиотеки и стандартный набор для сборки ПО:

$ sudo apt-get install autoconf2.13 dh-autoreconf libmnl-dev libmnl0

Библиотеку можно поставить из сырцов, но пока версии, доступной в репозитории, вполне достаточно. Копируем код libnftables и nftables.

$ git clone git://git.netfilter.org/libnftables
$ git clone git://git.netfilter.org/nftables

Список таблиц в NFT

В nftables добавлен модуль совместимости с iptables

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

$ ./autogen.sh
$ ./configure
$ make
$ sudo make install

В некоторых системах (в Ubuntu, например) при конфигурировании nftables следует активировать ряд функций:

$ ac_cv_func_malloc_0_nonnull=yes ac_cv_func_realloc_0_nonnull=yes ./configure

Далее вводим make oldconfig, переходим в Core Netfilter Configuration, где находим специфичные для nftables настройки (их, кстати, на порядок меньше, чем для iptables), собираем ядро.

Список таблиц в NFT

Конфигурирование поддержки nftables в ядре Linux

Hints

Some hints folks might find interesting in some situations.

Reverting to legacy xtables

You can switch back and forth between iptables-nft and iptables-legacy by means of update-alternatives (same applies to arptables and ebtables).

The default starting with Debian 10 Buster:

# update-alternatives —set iptables /usr/sbin/iptables-nft
# update-alternatives —set ip6tables /usr/sbin/ip6tables-nft
# update-alternatives —set arptables /usr/sbin/arptables-nft
# update-alternatives —set ebtables /usr/sbin/ebtables-nft

Switching to the legacy version:

# update-alternatives —set iptables /usr/sbin/iptables-legacy
# update-alternatives —set ip6tables /usr/sbin/ip6tables-legacy
# update-alternatives —set arptables /usr/sbin/arptables-legacy
# update-alternatives —set ebtables /usr/sbin/ebtables-legacy

Tips and tricks

The output of nft list ruleset command is a valid input file for it as well. Current rule set can be saved to file and later loaded back in.

Note: nft list does not output variable definitions, if you had any in your original file they will be lost. Any variables used in rules will be replaced by their value.

Simple stateful firewall

The factual accuracy of this article or section is disputed.

Reason: This is not a very simple firewall. I would consider what Arch Linux ships in /etc/nftables.conf simple. Recommend replacing this section with that script and give some directions on how to expand it for specific needs. (Discuss in Talk:Nftables)

Flush the current ruleset:

Add a table:

# nft add table inet my_table

Add the input, forward, and output base chains. The policy for input and forward will be to drop. The policy for output will be to accept.

Add two regular chains that will be associated with tcp and udp:

# nft add chain inet my_table my_tcp_chain
# nft add chain inet my_table my_udp_chain

Related and established traffic will be accepted:

# nft add rule inet my_table my_input ct state related,established accept

All loopback interface traffic will be accepted:

# nft add rule inet my_table my_input iif lo accept

Drop any invalid traffic:

# nft add rule inet my_table my_input ct state invalid drop

Accept ICMP and IGMP:

# nft add rule inet my_table my_input meta l4proto ipv6-icmp accept
# nft add rule inet my_table my_input meta l4proto icmp accept
# nft add rule inet my_table my_input ip protocol igmp accept

Про NFT:  Nft часы

New udp traffic will jump to the UDP chain:

# nft add rule inet my_table my_input meta l4proto udp ct state new jump my_udp_chain

New tcp traffic will jump to the TCP chain:

Reject all traffic that was not processed by other rules:

# nft add rule inet my_table my_input meta l4proto udp reject
# nft add rule inet my_table my_input meta l4proto tcp reject with tcp reset
# nft add rule inet my_table my_input counter reject with icmpx port-unreachable

At this point you should decide what ports you want to open to incoming connections, which are handled by the TCP and UDP chains. For example to open connections for a web server add:

# nft add rule inet my_table my_tcp_chain tcp dport 80 accept

# nft add rule inet my_table my_tcp_chain tcp dport 443 accept

To accept SSH traffic on port 22:

# nft add rule inet my_table my_tcp_chain tcp dport 22 accept

To accept incoming DNS requests:

# nft add rule inet my_table my_tcp_chain tcp dport 53 accept
# nft add rule inet my_table my_udp_chain udp dport 53 accept

Be sure to make your changes permanent when satisifed.

Prevent brute-force attacks

Sshguard is program that can detect brute-force attacks and modify firewalls based on IP addresses it temporarily blacklists. See Sshguard#nftables on how to set up nftables to be used with it.

You can log packets using the log action. The most simple rule to log all incoming traffic is:

# nft add rule inet filter input log

See nftables wiki for details.

Examples

See the Nftables examples article.

Basic routing firewall

For forwarding between WAN and LAN to work, it needs to be enabled with:

root sysctl -w net.ipv4.ip_forward = 1

Installation

Alternatively, install , which includes as a dependency, will automatically uninstall (an indirect dependency of the meta package) and prevent conflicts between and when used together.

Чем не устраивает iptables?

Проект netfilter/iptables был основан в 1998 году и с версии ядра 2.4 используется по умолчанию. Команда разработчиков сохранила основную идею, заложенную еще в ipfwadm, — список правил, состоящих из критериев и действия, которое выполняется, если пакет соответствует критериям. Netfilter разрешал подключать дополнительные модули (ранее архитектура ядра такой возможности не предоставляла). Это позволило очень просто развивать подсистему фильтрации, и со временем появилось большое количество новых функций и модулей. Полноценная поддержка IPv6 появилась только в 2011 году, что, правда, потребовало редизайна netfilter. В результате модуль NAT разделили на два независимых компонента, один из которых включает в себя ядро подсистемы NAT, а второй реализует поддержку протокола третьего уровня. Помимо фильтрации, модули обеспечивают классификацию трафика (вплоть до седьмого уровня OSI), балансировку нагрузки, манипуляцию с пакетами, маршрутизацию и прочее.

Список таблиц в NFT

Iptables содержит большое количество модулей

Еще один важный мотив — необходимость сбросить текущий ABI (Application Binary Interface), представляющий собор набор соглашений между программами, библиотеками и ОС, обеспечивающими их взаимодействие на низком уровне. В iptables ABI жестко прописаны специфические для протоколов поля, поэтому расширить его сложно. Как результат, приходится сразу запускать iptables, arptables и ebtables, по существу выполняющие одну работу, но каждый на своем уровне. По общим оценкам дублируется 10 000 строк кода. Учитывая, что все защитные механизмы и цепочки (даже пустые) грузятся изначально и активны, iptables потребляет больше ресурсов, чем реально необходимо.

Пользователям и администраторам управлять большим количеством правил довольно тяжело, трудно с ходу разобраться, что делают все цепочки, правила начинают повторяться, их становится сложно обслуживать и обновлять. Чтобы настроить два разных действия (вроде MARK и ACCEPT), правила приходится дублировать. Каждое расширение имеет свой синтаксис, одни поддерживают диапазоны, отрицание, префиксы, другие — нет.

Список таблиц в NFT

Дополнительные расширения к iptables со своим синтаксисом создают еще большую путаницу

Настройка и запуск nftables в Debian 10

Чтобы запустить nftables в Debian 10, просто установите интерфейс, все остальное уже установлено (и используется, даже если мы поместим iptables).

Нет необходимости перезагружать компьютер или сервер, ничто из ядра не затронуто, только интерфейс администрирования брандмауэра, который теперь изменяется с iptables на синтаксис nftables. Очень важная деталь заключается в том, что nftables различает временные правила, созданные в командной строке, и другие постоянные правила, загруженные или сохраненные в файл.

По умолчанию используется файл /etc/nftables.conf, который уже содержит простую таблицу межсетевого экрана для ipv4 / ipv6, называемую «внутренним фильтром».

Утилита nftables пользовательского пространства, nft, выполняет большинство оценок набора правил перед их передачей ядру операционной системы. Следовательно, если мы хотим выполнить команду с помощью nftables, нам нужно будет поставить «nft», чтобы иметь возможность выполнить ее, синтаксис очень прост для понимания, намного проще, чем iptables, который мы уже видели раньше.

В случае с nftables правила хранятся в цепочках, которые, в свою очередь, хранятся в таблицах. Чтобы изменения остались, нам нужно сохранить правила прямо в файл Команда, которую мы можем использовать для постоянного сохранения этих правил и их запуска при перезапуске системы, выглядит следующим образом:

Затем, если мы добавили новые правила вручную, нам нужно перезапустить nftables, чтобы изменения вступили в силу:

Все команды должны выполняться от имени администратора, либо с помощью «sudo», либо напрямую с пользователем «root».

All nftable commands are done with the nft ultility from net-firewall/nftables.

root #nft add table ip filter

Likewise a table for arp can be created with

root #nft add table arp filter

NoteThe name «filter» used here is completly arbitrary. It could have any name

root #nft list tables ip

The contents of the table filter can be listed with:

root #nft list table ip filter

using -a with the nft command, it shows the handle of each rule. Handles are used for various operations on specific rules:

root #nft -a list table ip filter

root #nft delete table ip filter

NoteIf You’re running this command from Bash you need to escape the semicolon

A non-base chain can be added by not specifying the chain configurations between the curly braces.

root #nft delete chain ip filter input

NoteChains can only be deleted if there are no rules in them.

root #nft add rule ip filter input tcp dport 80 drop

To delete a rule, you first need to get the handle number of the rule. This can be done by using the -a flag on nft:

root #nft rule ip filter input tcp dport 80 drop

It is then possible to delete the rule with:

Nftables is very modular, so the bare minimum would depend on your intended purposes. A recommended minimum for basic IPv4 firewalling with NAT would be:

Nftables kernel requirements

NotePlease note: nftables masquerade will not work if iptables masquerade is in the kernel, so be sure to unload or disable it.

root #emerge —ask net-firewall/nftables

Демонстрация настройки файрволла

Предположим наш сервер является samba сервером, web сервером и ntp сервером. В примере разрешим доступ к этим службам:

А также разрешим подключаться к серверу по SSH: tcp 22, но только с определённого компьютера.

Разрешим пинговать наш сервер и выходить ему в интернет.

Разрешаем входящие подключения к tcp и udb портам

Разрешим подключаться к серверу по ssh, но только со своего компьютера:

$ sudo nft add rule inet filter input iifname eth0 ip saddr 172.28.80.14 tcp dport 22 counter accept

То есть мы:

В своих правилах вы можете использовать следующее:

Теперь покажу как разрешить подключения к samba, web и ntp. Обратите внимание: порты можно сгруппировать уменьшив количество правил. И в примере я разрешаю подключаться к сервисам только из локальной сети:

Про NFT:  Необратимое зло. Рассуждение о NFT-токенах в игровой индустрии / Компьютерные и мобильные игры / iXBT Live

Разрешаем подключаться к loopback интерфейсу

Для того чтобы сервисы внутри системы могли нормально работать, обязательно нужно разрешить все подключения к loopback интерфейсу:

$ sudo nft add rule inet filter input iifname lo counter accept

Разрешаем ping сервера

Разрешим пинговать наш сервер, другими словами разрешим входящие icmp запросы:

Чтобы разрешить icmp нужно указать протокол и тип запроса:

Меняем политику цепочки input

После того как мы добавили все разрешающие правила в цепочке input, поменяем её политику на drop:

То есть смена политик выполняется таким образом:

Механизм connection tracking

Политика в цепочки output у нас разрешающая. Давайте попробуем попинговать какой-нибудь точно доступный узел с нашего сервера:

$ ping 77.88.8.8

И почему-то этот узел не пингуется, сейчас объясню почему.

Допустим мы захотим обновить наш сервер. Сервер по цепочке output сможет выйти в интернет и подключится к репозиторию (про них будет написано позже в этом курсе). Но в нашу сторону обновления не полетят, потому что в цепочке input мы этого не разрешали.

В общем, в любом случае, когда наш сервер отправляет запрос куда-нибудь, то ответ будет блокироваться в цепочке input. И невозможно разрешить все, да и не нужно!

Тут вы должны понять, что задача у нас не разрешить подключения с тех адресов куда мы будем отправлять запросы. А просто разрешить все ответные пакеты. И механизм connection tracking как раз может определить ответное ли это соединение или нет.

Connection tracking – это модуль, который определяет состояния соединений. Соединения могут быть:

Получается что все ответные соединения это estableshed + related.

И чтобы разрешить такой трафик, выполните команду:

$ sudo nft add rule inet filter input ct state established,related counter accept

Каждое правило при добавлении получает свой номер (handle). Чтобы посмотреть эти номера нужно использовать ключ -a:

И затем можно удалить правило по его номеру указав путь до цепочки (inet filter input). Например так:

Когда мы выполняли команды добавления правил фаервола они не сохранялись в конфиге /etc/nftables.conf. Поэтому перезагрузка службы вернёт фаервол до первоначального состояния. Чтобы этого не произошло, нужно сохранить все правила в конфиг. Это можно сделать двумя способами.

Сохранение правил в файл (вариант с использованием sudo):

Сохранение правил в файл (под root)

После сохранения правил, просто перезагрузите фаервол и можете посмотреть список правил:

В некоторых дистрибутивах nftables уже установлен (RedHat 8, CentOS 8) по умолчанию. В Debian 10.2 установка производится очень просто:

sudo apt-get install nftables

Список таблиц в NFT

Should I build a firewall using a nftables?

Yes. Building new firewalls on top of iptables is discouraged.

Stateful router example

NoteShell scripts break atomicity when applying the ruleset unless using nftables native scripting environment. See Nftables Scripting.

All nftable commands are done with the nft utility from net-firewall/nftables.

root nft add table ip filter

Likewise, a table for arp can be created with

root nft add table arp filter

NoteThe name «filter» used here is completely arbitrary. It could have any name

root nft list tables ip

root nft list table ip filter

root nft -a list table ip filter

root nft delete table ip filter

root nft delete chain ip filter input

root nft add rule ip filter input tcp dport 80 drop

root nft rule ip filter input tcp dport 80 drop

Nftables Families

When creating chains, you will need to assign a priority. The priority needs to be 0 or above, and chains with a lower priority get processed first.
Thus, you may wish to think of it as «order» rather than «priority».

Настройка Nftables на Linux

Nftables – это инструмент, с помощью которого идет настройка фаервола Netfilter. Для настройки он использует конфиг – /etc/nftables.conf и команду nft. А также Nftables может быть запущен как служба.

Служба и конфиг nftables

В системе Debian 11 и Ubuntu 22.04 по умолчанию существует служба nftables, что облегчает управление файрволлом. Вы можете выполнять следующие команды:

По умолчанию эта служба выключена и перед добавлением правил в файрволл, её нужно включить. При запуске служба читает конфиг /etc/nftables.conf и запускается с указанными там правилами.

По умолчанию конфиг выглядит так:

Давайте разберем его:

В каждой цепочке есть правило, которое её описывает:

type filter hook input (или forward или output) priority filter;

Цепочку вы можете назвать как угодно (chain input, или chain my_input, или chain in), но вот фраза type filter hook input определит эту цепочку как input для таблицы filter. Поменяйте input на forward или output, чтобы поменять тип цепочки.

Редактировать этот конфиг вручную не нужно, для этого есть специальная команда (nft), с помощью которой можно добавлять свои таблицы, цепочки и правила. А также удалять или редактировать их. Но так как в системе уже есть конфиг в котором есть таблица filter и цепочки input, forward и output, то нам остаётся лишь добавлять правила (rule). В этой статье я не буду рассматривать добавление таблиц и цепочек.

Просмотр действующих правил

Чтобы посмотреть правила, которые применяются прямо сейчас, выполните команду:

Если у вас команда ничего не показала, то скорее всего у вас выключена служба nftables и вам нужно её запустить.

Видим почти-что наш конфиг, но без двух строк (!/usr/sbin/nft -f и flush ruleset). То есть команда показывает нам только таблицы, цепочки и правила. А что такое policy accept и почему этого не было записано в конфиге, разберём ниже в этой статье.

Пакет, попавший в цепочку, начинает проходить правила указанные в ней сверху вниз. Фаервол сравнивает пакет с первым правилом, затем со вторым и так далее. Если фаервол определит правило для этого пакета, то с пакетом будет выполнено действие:

А если фаервол не найдет в данной цепочке подходящего правила для пакета, то фаервол выполнит действие с пакетом, которое указано в политике (policy accept или policy drop).

Список таблиц в NFT

Прохождение пакетом цепочки input

Сейчас во всех цепочках политика accept, и нет других правил. Это означает что все пакеты разрешены во все стороны (нет никаких правил и политика разрешает прохождение пакетов).

Если изменить политику на drop, то будет обратная ситуация. Нет никаких правил, а политика будет отбрасывать все пакеты.

Обычно для цепочки input добавляют некоторые разрешающие правила, а затем меняют политику на drop. Таким образом всё что мы не разрешили будет запрещено. А цепочку output вообще не трогают, оставляя политику accept. То есть к нашему серверу можно подключиться только определённым образом, а сам сервер может отправлять пакеты куда захочет (например в интернет).

Если в конфиге /etc/nftables.conf мы не обозначили политику для цепочек, то будет использован accept. Именно это и показывает команда nft list ruleset.

Removing all the rules in a chain

% nft flush chain filter output

Журналирование в nftables

Для регистрации событий используется Netfilter, при помощи модулей xt_LOG (регистрирует в syslog) и/или nfnetlink_log. Последний использует демон сбора информации ulogd2, вышедший примерно полтора года назад и способный накапливать данные на уровне отдельных пакетов или потоков и сохранять их, в том числе и в БД.

Механизм журналирования для каждого протокола настраивается через /proc.

# cat /proc/net/netfilter/nf_log
0 NONE (nfnetlink_log)
1 NONE (nfnetlink_log)
2 ipt_LOG (nfnetlink_log,ipt_LOG)

Под номером 2 у нас скрывается IPv4. Меняем на nfnetlink_log:

Use firewalld

The firewalld software takes control of all the firewalling setup in your system, so you don’t have to know all the details of what is happening in the underground. There are many other system components that can integrate with firewalld, like NetworkManager, libvirt, podman, fail2ban, docker, etc.

Оцените статью
NFT Эксперт