Сетевые экраны в Linux — это не просто барьер между вашим сервером и внешним миром, а мощный инструмент, который может быть настроен под самые разные задачи: от защиты домашнего сервера до обеспечения безопасности корпоративной инфраструктуры. В экосистеме Linux существует несколько решений для управления межсетевыми экранами, и среди них выделяются nftables, ufw и firewalld. Эти инструменты различаются по подходу, сложности и возможностям, но все они работают на базе ядра Linux и подсистемы Netfilter. В этой статье мы разберем их особенности, покажем, как их настраивать с примерами, и поможем понять, какой из них лучше выбрать для ваших задач. Погружение будет глубоким, с техническими деталями и практическими советами, чтобы вы могли не просто прочитать, а сразу начать применять.

Netfilter как основа: как это работает под капотом

Все три инструмента — nftables, ufw и firewalld — опираются на Netfilter, модуль ядра Linux, который обрабатывает сетевые пакеты. Netfilter — это своего рода "диспетчер трафика", который решает, пропустить пакет, отбросить его или перенаправить. Он встроен в ядро и предоставляет хуки (точки перехвата) для входящего, исходящего и транзитного трафика. Инструменты, о которых пойдет речь, — это интерфейсы, которые позволяют администраторам задавать правила для Netfilter без необходимости писать код на уровне ядра.

Исторически iptables был основным способом взаимодействия с Netfilter, но его архитектура оказалась громоздкой: отдельные таблицы для фильтрации, NAT и других задач, дублирование кода для IPv4 и IPv6. Nftables стал его преемником, упростив и ускорив работу. Ufw и firewalld, в свою очередь, добавляют слой абстракции, делая настройку более удобной, но иногда жертвуя гибкостью. Понимание этой основы важно, чтобы осознанно выбирать инструмент и понимать, что происходит "за кулисами".

Nftables: мощь и гибкость для профессионалов

Nftables — это современный стандарт, который пришел на смену iptables в 2014 году с ядром Linux 3.13. Его ключевая особенность — унифицированный подход к фильтрации. Вместо разрозненных таблиц и утилит, как в iptables, nftables использует одну виртуальную машину в ядре, которая компилирует правила в байт-код, повышая производительность и упрощая управление.

Установка nftables в большинстве дистрибутивов проста:


sudo apt install nftables    # Для Debian/Ubuntu
sudo dnf install nftables    # Для Fedora/RHEL
sudo pacman -S nftables      # Для Arch Linux

После установки активируем службу:


sudo systemctl enable nftables
sudo systemctl start nftables

Теперь давайте настроим базовый межсетевой экран для сервера, который принимает SSH, HTTP и HTTPS, но блокирует остальной входящий трафик. Начнем с создания таблицы и цепочки:


sudo nft add table inet filter
sudo nft add chain inet filter input { type filter hook input priority 0 \; policy drop \; }

Здесь "inet" означает поддержку как IPv4, так и IPv6, а "policy drop" устанавливает политику по умолчанию — отбрасывать все, что не разрешено явно. Добавим правила для нужных сервисов:


sudo nft add rule inet filter input iif lo accept                     # Локальный трафик
sudo nft add rule inet filter input ct state established,related accept  # Установленные соединения
sudo nft add rule inet filter input tcp dport 22 accept              # SSH
sudo nft add rule inet filter input tcp dport {80, 443} accept       # HTTP и HTTPS

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


sudo nft list ruleset

Теперь представьте, что вы хотите ограничить SSH-доступ только для IP 192.168.1.100. Это можно сделать так:


sudo nft add rule inet filter input ip saddr 192.168.1.100 tcp dport 22 accept

Но что, если список доверенных IP растет? Nftables поддерживает множества (sets), которые упрощают управление:


sudo nft add set inet filter trusted_ips { type ipv4_addr \; }
sudo nft add element inet filter trusted_ips { 192.168.1.100, 192.168.1.101 }
sudo nft add rule inet filter input ip saddr @trusted_ips tcp dport 22 accept

Множества можно обновлять динамически, не переписывая правила. Например, добавить новый IP:


sudo nft add element inet filter trusted_ips { 192.168.1.102 }

Еще одна мощная фича — счетчики и лимиты. Допустим, вы хотите защитить сервер от перебора паролей по SSH, ограничив новые соединения до 5 в минуту с одного IP:


sudo nft add rule inet filter input tcp dport 22 ct state new limit rate 5/minute accept

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


sudo nft list ruleset > /etc/nftables.conf

Nftables идеален для сложных сценариев: он поддерживает отображения (maps), динамические правила и даже обработку мостового трафика. Однако его мощь требует времени на освоение, и новичкам он может показаться избыточным.

Ufw: простота без компромиссов

Ufw (Uncomplicated Firewall) — это инструмент для тех, кто хочет защитить систему быстро и без лишних сложностей. Он изначально создавался как обертка над iptables, но в последних версиях некоторых дистрибутивов (например, Ubuntu 22.04) поддерживает nftables как бэкенд. Ufw не пытается заменить низкоуровневые инструменты, а делает их доступными для обычных пользователей.

Установка стандартна:


sudo apt install ufw    # Для Debian/Ubuntu
sudo dnf install ufw    # Для Fedora

Перед активацией зададим базовые правила:


sudo ufw default deny incoming    # Блокируем весь входящий трафик
sudo ufw default allow outgoing   # Разрешаем исходящий
sudo ufw allow ssh                # Открываем SSH
sudo ufw enable                   # Запускаем

Теперь добавим доступ для веб-сервера:


sudo ufw allow http    # Порт 80
sudo ufw allow https   # Порт 443

Проверим состояние:


sudo ufw status

Вывод покажет, что открыто SSH (порт 22), HTTP (80) и HTTPS (443), а остальной входящий трафик заблокирован. Если нужно ограничить SSH определенной подсетью, например, 192.168.1.0/24:


sudo ufw allow from 192.168.1.0/24 to any port 22

Ufw поддерживает сервисы, что упрощает работу. Вместо номеров портов можно указывать имена из `/etc/services`. Например:


sudo ufw allow mysql    # Порт 3306

А если вы тестируете приложение на нестандартном порту, например, 8080:


sudo ufw allow 8080/tcp

Интересно, что ufw умеет ограничивать количество соединений для защиты от атак. Для SSH это делается так:


sudo ufw limit ssh

По умолчанию это ограничивает до 6 подключений за 30 секунд с одного IP — полезно против перебора паролей. Удалить правило тоже просто:


sudo ufw delete allow 8080/tcp

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

Firewalld: динамика и зоны для сложных сетей

Firewalld — это решение, которое привносит концепцию зон в управление сетевыми экранами. Оно популярно в дистрибутивах Red Hat (Fedora, CentOS, RHEL), но работает и в других системах. Зоны позволяют применять разные правила в зависимости от контекста сети: "public" для общедоступных сетей, "trusted" для доверенных, "home" для домашних и так далее.

Установка и запуск:


sudo dnf install firewalld    # Для Fedora/RHEL
sudo apt install firewalld    # Для Debian/Ubuntu
sudo systemctl enable --now firewalld

По умолчанию активна зона "public". Откроем порты для веб-сервера:


sudo firewall-cmd --zone=public --add-service=http --permanent
sudo firewall-cmd --zone=public --add-service=https --permanent
sudo firewall-cmd --reload

Проверим:


sudo firewall-cmd --list-all

Для SSH с ограничением по IP (например, 192.168.1.10):


sudo firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.1.10" service name="ssh" accept' --permanent
sudo firewall-cmd --reload

Firewalld поддерживает сервисы — предопределенные наборы правил. Посмотреть доступные можно так:


sudo firewall-cmd --get-services

Если нужного сервиса нет, создадим свой, например, для порта 8080:


sudo firewall-cmd --permanent --new-service=custom-app
sudo firewall-cmd --permanent --service=custom-app --add-port=8080/tcp
sudo firewall-cmd --permanent --zone=public --add-service=custom-app
sudo firewall-cmd --reload

Зоны — это то, что делает firewalld уникальным. Допустим, у вас два интерфейса: eth0 для внутренней сети и eth1 для внешней. Назначим eth0 зону "internal":


sudo firewall-cmd --zone=internal --change-interface=eth0 --permanent
sudo firewall-cmd --zone=internal --add-service=ssh --permanent
sudo firewall-cmd --reload

Для защиты от DDoS можно добавить лимит:


sudo firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" service name="http" limit value="20/m" accept'
sudo firewall-cmd --reload

Firewalld позволяет менять правила на лету без прерывания соединений, что делает его удобным для серверов, где важна непрерывность работы.

Практические сценарии: как это работает на деле

Чтобы лучше понять различия, рассмотрим реальный пример: настройка сервера с веб-приложением, SSH и защитой от перебора паролей.

- Nftables:

sudo nft add table inet filter
sudo nft add chain inet filter input { type filter hook input priority 0 \; policy drop \; }
sudo nft add rule inet filter input ct state established,related accept
sudo nft add rule inet filter input tcp dport {80, 443} accept
sudo nft add rule inet filter input ip saddr 192.168.1.0/24 tcp dport 22 limit rate 5/minute accept

- Ufw:

sudo ufw default deny incoming
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw allow from 192.168.1.0/24 to any port 22
sudo ufw limit ssh
sudo ufw enable

- Firewalld:

sudo firewall-cmd --zone=public --add-service=http --permanent
sudo firewall-cmd --zone=public --add-service=https --permanent
sudo firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" service name="ssh" limit value="5/m" accept' --permanent
sudo firewall-cmd --reload

Nftables дает больше контроля (например, точные лимиты), ufw проще в настройке, а firewalld удобен для управления зонами.

Какой инструмент выбрать: выводы и мысли

Выбор между nftables, ufw и firewalld зависит от ваших задач. Nftables — это выбор профессионалов, которым нужен полный контроль и высокая производительность. Он сложен, но открывает двери к любым конфигурациям. Ufw — идеальный вариант для новичков или небольших систем, где важна скорость настройки. Firewalld хорош для динамичных сред, где сеть меняется, а правила нужно адаптировать на лету.

Подумайте о своем сервере как о доме: ufw — это простая дверь с замком, firewalld — умный дом с зонами доступа, а nftables — система безопасности с камерами и датчиками, которую вы собираете сами. Что выбрать, зависит от того, насколько вы готовы копаться в настройках и какие угрозы хотите предотвратить. В реальной жизни можно даже комбинировать их: ufw для рабочих станций, firewalld для маршрутизаторов, nftables для критических серверов. Главное — не оставлять "дверь" открытой и регулярно проверять, что замки на месте.