Сетевые экраны в 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 для критических серверов. Главное — не оставлять "дверь" открытой и регулярно проверять, что замки на месте.