nftables - это современная система фильтрации пакетов для Linux, которая заменяет iptables. Он предлагает унифицированный и более эффективный способ управления правилами межсетевого экрана в различных протоколах, таких как IPv4, IPv6 и ARP. nftables обеспечивает улучшенную производительность и упрощенную конфигурацию. В отличие от iptables, которые используют отдельные таблицы для IPv4, IPv6, ARP и необработанных пакетов, nftables объединяет их под единым интерфейсом.

В этой статье объясняется, как установить и настроить nftables на Ubuntu 24.04. Вы будете устанавливать основные правила брандмауэра, управлять сетевым трафиком и внедрять общие политики безопасности.

Предпосылки

  • Сервер с Ubuntu 24.04 в качестве ОС
  • Права пользователя: пользователь root или обычный пользователь с привилегиями sudo

Конвенции

1
2
# - данные команды должны выполняться с правами root либо непосредственно от имени пользователя root, либо с помощью команды sudo.
$ - данные команды должны выполняться от имени обычного пользователя.

Обновите систему

Свежая установка Ubuntu 24.04 требует обновления пакетов до последних доступных версий.

1
$ sudo apt update -y && sudo apt upgrade -y

Установите nftables

Выполните следующие действия для установки nftables в зависимости от дистрибутива Linux.

1
$ sudo apt install nftables -y

Командный синтаксис nft

1
nft [ -nNscaeSupyjtT ] [ -I directory ] [ -f filename | -i | cmd ... ]
  • -n: Показать номера правил на выходе.
  • -N: Печать более подробного вывода для правил.
  • -s: Показать статистику для правил.
  • -c: Показать название цепи для каждого правила.
  • -a: Распечатать правило с его адресной семьей и протоколом.
  • -e: Расширить детали правил.
  • -S: Распечатать свод правил (конфигурация).
  • -u: Включить режим обновления для динамических изменений.
  • -p: Распечатать текущий свод правил в формате притчи.
  • -y: Показать подробные типы объектов.
  • -j: Выход в формате JSON.
  • -t: Показать выход в формате таблицы.
  • -T: Показать токенизированный выход.
  • -I: Используйте указанный каталог для конфигурационных файлов.
  • -f: имя файла: Правила загрузки из файла.
  • -i: Интерактивный режим для прямого изменения правил.
  • cmd …: Управляйте аргументами, чтобы манипулировать правилами nftables.

Управление системой nftables

Сервис nftables управляет вашими правилами брандмауэра и обеспечивает устойчивость при перезагрузке системы. Следуйте этим шагам, чтобы включить и запустить сервис nftables в вашей системе.

  1. Включите сервис nftables, чтобы начать с загрузки.
1
$ sudo systemctl enable nftables.service
  1. Запустите сервис nftables.
1
$ sudo systemctl start nftables.service
  1. Проверьте статус сервиса.
1
$ sudo systemctl status nftables.service

Ваш результат должен быть похож на тот, который ниже:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
 nftables.service - Netfilter Tables
     Loaded: loaded (/usr/lib/systemd/system/nftables.service; enabled; preset: disabled)
     Active: active (exited) since Wed 2025-04-09 10:47:22 UTC; 5s ago
       Docs: man:nft(8)
    Process: 1838 ExecStart=/sbin/nft -f /etc/sysconfig/nftables.conf (code=exited, status=0/SUCCESS)
   Main PID: 1838 (code=exited, status=0/SUCCESS)
        CPU: 11ms

Apr  9 10:47:22 nftables-03 systemd[1]: Starting Netfilter Tables...
Apr  9 10:47:22 nftables-03 systemd[1]: Finished Netfilter Tables.

Таблицы, цепи и политика в nftables

В nftables правила организованы в таблицы, которые содержат цепочки, определяющие, как обрабатывается трафик. Каждая цепь связана с крюком (INPUT, OUTPUT, FORWARD), который определяет, когда она оценивается. Цепи также имеют политики, которые определяют действие по умолчанию, когда нет явного правила, соответствующего пакету.

nftables поддерживает несколько семейств адресов для обработки различных сетевых протоколов:

  • inet: Унифицированная обработка для IPv4 и IPv6.
  • ip: Фильтрация только по IPv4.
  • ip6: Фильтрация только по IPv6.
  • arp: Фильтрация пакетов ARP.
  • bridge: Ethernet фильтрация пакетов.
  • netdev: Фильтрация пакетов на уровне сетевого устройства.

Chain Hooks

Каждая цепочка в nftables связана с определенным типом трафика:

  • input: Пакеты управления, предназначенные для локальной машины.
  • output: Управляет пакетами, покидающими машину.
  • forward: Обрабатывает пакеты, маршрутизируемые через машину.

Политика

Политика относится к действию по умолчанию, предпринятому цепочкой, когда явное правило не соответствует пакету. Политика по умолчанию для цепочки определяет, принимается ли трафик, отбрасывается или отклоняется, когда он не соответствует каким-либо конкретным правилам.

  • policy accept: Позволяет весь трафик по умолчанию (полезно для тестирования или начальных конфигураций).
  • policy drop: Отбрасывает непревзойденные пакеты (наиболее безопасные, обычно используемые в производственных средах).
  • policy reject: Отправляет уведомление об отказе источнику (информативное, но выявляет наличие сервера, что может быть не идеально для безопасности).

Предупреждение: Использование принятой политики по умолчанию не рекомендуется для производственных сред, поскольку она позволяет весь трафик, если он явно не заблокирован.

Управление Default nftables конфигурация

Выполните шаги ниже, чтобы изучить конфигурации по умолчанию на вашем сервере.

  1. Посмотрите список существующих правил nftables.
1
$ sudo nft list tables

Ваш результат должен быть похож на тот, который ниже:

1
2
table ip filter
table ip6 filter

Посмотреть файл конфигурации nftables по умолчанию.

1
$ cat /etc/nftables.conf

Ваш результат должен быть похож на тот, который ниже:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
#!/usr/sbin/nft -f

flush ruleset

table inet filter {
    chain input {
        type filter hook input priority 0; policy accept;
    }
    chain forward {
        type filter hook forward priority 0; policy accept;
    }
    chain output {
        type filter hook output priority 0; policy accept;
    }
}

Конфигурация Basic nftables Правила Firewall

Выполните следующие действия для настройки и управления правилами nftables для управления сетевым трафиком.

Создание начальной таблицы и цепей

  1. Создайте новую таблицу брандмауэра для трафика IPv4 и IPv6.
1
$ sudo nft add table inet my_table

Приведенная выше команда создает новую таблицу под названием my_table, которая может обрабатывать как пакеты IPv4, так и IPv6. Пожалуйста, замените my_table своим предпочтительным названием таблицы. Семейство inet позволяет управлять обоими протоколами с помощью одного набора правил.

Примечание: В этой статье используется название my_table. Пожалуйста, замените my_table своим предпочтительным названием таблицы.

  1. Добавьте цепочку ввода с политикой принятия по умолчанию.
1
$ sudo nft add chain inet my_table input { type filter hook input priority 0 \; }

Вышеприведенная команда создает цепочку фильтрации, которая применяется к входящему трафику. Вариант type filter определяет его как цепочку фильтрации, в то время как hook input гарантирует, что он обрабатывает входящие пакеты. Установка priority 0 определяет порядок выполнения, причем сначала запускаются более низкие значения.

  1. Создайте прямую цепочку с политикой принятия по умолчанию.
1
$ sudo nft add chain inet my_table forward { type filter hook forward priority 0\; }

Вышеприведенная команда создает цепочку фильтрации, которая применяется к пересылаемому трафику. Вариант type filter определяет его как цепочку фильтрации, в то время как hook forward гарантирует, что он обрабатывает пересылаемые пакеты. Установка priority 0 определяет порядок выполнения, причем сначала запускаются более низкие значения.

  1. Разрешить установленные соединения для поддержания существующих коммуникаций.
1
$ sudo nft add rule inet my_table input ct state established,related accept

Это правило использует отслеживание соединений для управления трафиком. Опция ct state позволяет отслеживать соединение, в то время как established позволяет пакеты из существующих. соединений.

Добавить, перечислить и удалить правила

Выполните следующие действия, чтобы добавить, перечислить и удалить правила nftables для управления доступом к сети.

  1. Добавить правило для блокировки входящего трафика с определенного IP-адреса:
1
$ sudo nft add rule inet my_table input ip saddr 192.0.2.10 drop

Вышеприведенная команда добавляет в таблицу my_table правило, блокирующее входящий трафик с IP-адреса 192.0.2.10. Правило применяется к input цепи в семействе inet.

  1. Просмотр всех активных правил nftables для проверки конфигурации.
1
$ sudo nft list ruleset

Вышеприведенная команда перечисляет все действующие правила nftables для проверки ваших конфигураций.

  1. Перечислите правила с номерами.
1
$ sudo nft list chain inet my_table input

Вышеприведенная команда перечисляет правила в цепочке input таблицы my_table, поэтому вы можете ссылаться на конкретное правило удаления.

Ваш результат должен быть похож на тот, который ниже:

1
2
3
4
5
6
7
table inet my_table {
        chain input {
                type filter hook input priority filter; policy accept;
                ct state established,related accept
                ip saddr 192.0.2.10 drop
        }
}
  1. Определите номер с output и удалите соответствующее правило.
1
$ sudo nft delete rule inet my_table input handle 0

Вышеприведенная команда удаляет правило с номером 0 из цепочки input таблицы my_table.

Внедрение основных правил безопасности

  1. Предоставьте SSH доступ к вашему серверу.
1
$ sudo nft add rule inet my_table input tcp dport 22 accept

Вышеприведенная команда добавляет правило, которое соответствует пакетам протокола TCP и целям порта 22 назначения (порт SSH по умолчанию). Он принимает пакеты, позволяющие подключаться к SSH.

  1. Блокируйте конкретный IP-адрес, который показывает подозрительную активность.
1
$ sudo nft add rule inet my_table input ip saddr 192.0.2.10 drop

Вышеупомянутая команда добавляет правило, которое соответствует пакетам с указанного IP-адреса источника, отбрасывает их без уведомления отправителя и предотвращает любой доступ с этого IP-адреса.

  1. Разрешить HTTP-трафик на порту 80.
1
$ sudo nft add rule inet my_table input tcp dport 80 accept

Вышеприведенная команда добавляет правило, которое соответствует пакетам протокола TCP, нацеленным на порт 80 (порт HTTP по умолчанию). Он принимает соответствующие пакеты, позволяя веб-трафику достигать сервера.

  1. Разрешить HTTPS-трафик на порту 443.
1
$ sudo nft add rule inet my_table input tcp dport 443 accept

Вышеприведенная команда добавляет правило, которое соответствует пакетам протокола TCP, нацеленным на порт 443 (по умолчанию для HTTPS). Это гарантирует, что зашифрованный веб-трафик разрешен при блокировании других типов трафика на этом порту.

  1. Опустить весь входящий трафик.
1
$ sudo nft add rule inet my_table input ip daddr 0.0.0.0/0 counter drop

Вышеупомянутая команда добавляет правило, которое по умолчанию отбрасывает весь входящий трафик, позволяя только предварительно настроенные правила (SSH, HTTP, HTTPS). Он блокирует нежелательный доступ.

Включить NAT и Port Forwarding

  1. Включите функциональность NAT в ядре Linux, редактируя файл /etc/sysctl.conf с помощью любого текстового редактора, такого как nano.
1
$ sudo nano /etc/sysctl.conf
  1. Не комментируйте следующую строку.
1
2
3
4
...
# Uncomment the next line to enable packet forwarding for IPv4
net.ipv4.ip_forward=1
....

Сохраните и закройте файл.

  1. Применяйте изменения.
1
$ sudo sysctl -p
  1. Создайте новую таблицу NAT для обработки перевода сетевых адресов (NAT) для вашего сервера.
1
$ sudo nft add table nat

Вышеприведенная команда создает новую таблицу nat, где можно определить правила NAT для перевода адресов в исходящем трафике.

  1. Создайте цепочку маршрутизации в таблице NAT для обработки пакетов после маршрутизации.
1
$ sudo nft add chain nat postrouting { type nat hook postrouting priority 100 \; }
  1. Добавьте маскирующее правило для вашей внутренней сети, чтобы обеспечить совместное использование интернет-соединения.
1
$ sudo nft add rule nat postrouting ip saddr 192.0.2.0/24 oif enp1s0 masquerade

Это правило говорит nftables выполнять NAT (маскирование) для исходящего трафика из сети 192.0.2.0/24. Часть oif enp1s0 указывает, что правило применяется к трафику, покидающему интерфейс enp1s0, который обычно является сетевым интерфейсом, подключенным к Интернету.

Сохранить правила постоянно при перезагрузке

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

  1. Сохраните текущую конфигурацию брандмауэра в /etc/nftables.conf файл.
1
$ sudo nft list ruleset | sudo tee  /etc/nftables.conf

Вышеприведенная команда сохраняет текущие правила nftables для /etc/nftables.conf файл, гарантируя, что они могут быть восстановлены после перезагрузки.

  1. Применяйте сохраненные правила из конфигурации /etc/nftables.conf файл.
1
$ sudo nft -f /etc/nftables.conf

Перезагружает правила брандмауэра из сохраненного файла конфигурации (/etc/nftables.conf).

  1. Перезапустите сервис nftables.
1
$ sudo systemctl restart nftables.service

Это перезагружает правила брандмауэра и гарантирует, что они сохраняются после перезагрузки.

Расширенная конфигурация правил

  1. Ограничение скорости реализации для соединений SSH.
1
$ sudo nft add rule inet my_table input tcp dport 22 limit rate 3/minute accept

Вышеупомянутая команда добавляет правило, которое нацелено на трафик SSH (порт 22), ограничивает соединения до 3 в минуту и принимает соединения в пределах предела, чтобы помочь предотвратить атаки грубой силы.

  1. Настройка переадресации портов для веб-трафика.

Создайте цепочку маршрутизации в таблице нат (если ее нет).

1
$ sudo nft add chain ip nat prerouting { type nat hook prerouting priority 0 \; }

Добавьте правило пересылки портов.

1
$ sudo nft add rule nat prerouting tcp dport 80 dnat to 192.0.2.10

Вышеприведенная команда добавляет правило, которое захватывает входящий HTTP-трафик (порт 80), перенаправляет его на внутренний сервер (192.0.2.10) и позволяет размещать внутренние веб-сервисы.

  1. Включите регистрацию для пакетов.
1
$ sudo nft 'add rule inet my_table input log prefix "nftables-drop: " drop'

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

  1. Смешайте все правила.
1
$ sudo nft flush ruleset

Предупреждение: Будьте осторожны при смывании правил, так как это удалит все существующие правила nftables, эффективно сбросив конфигурацию брандмауэра

Завершение

Вы установили и настроили nftables на свой сервер Ubuntu 24.04.. Вы создавали таблицы, настраивали цепочки с различными политиками и управляли правилами брандмауэра. Структура nftables модернизирует фильтрацию пакетов, обеспечивая унифицированное управление трафиком IPv4 и IPv6, обновление правил атомарности и повышение производительности за счет оптимизированной обработки пакетов. Благодаря встроенным функциям, таким как отслеживание соединений и расширенные возможности регистрации, nftables упрощает сложную задачу управления безопасностью сети. Посетите официальные вики nftables для получения дополнительной информации и расширенных конфигураций.

Если вам понравился этот пост об установке nftables на Ubuntu 24.04, пожалуйста, поделитесь им со своими друзьями в социальных сетях, которым может быть интересна эта статья или оставьте комментарий ниже.