Прежде чем включать файрвол на удалённом сервере, убедитесь, что порт SSH (22 или нестандартный, если вы его сменили) разрешён правилом. Иначе соединение оборвётся, и зайти на машину получится только через консоль провайдера.
Файрвол на сервере: UFW и iptables — настройка и управление правилами

Любой Linux-сервер с публичным IP в первые часы после запуска сталкивается с перебором паролей и сканированием портов. Пока файрвол не настроен, извне доступны все порты, на которых запущенные сервисы принимают подключения: SSH, веб-сервер и база данных, которую администратор забыл привязать к приватному интерфейсу. Для фильтрации трафика в Linux используют инструменты разного уровня: iptables — низкоуровневую утилиту со сложным синтаксисом для управления правилами ядра, и UFW (Uncomplicated Firewall) — надстройку с понятными командами, возможностей которой хватает для большинства серверных задач. Ниже разберём оба инструмента: UFW для повседневной работы и iptables для сценариев, требующих тонкого контроля.
- UFW и команды iptables управляют одним механизмом: правила выполняет Netfilter в ядре, а утилиты задают их на разных уровнях абстракции.
- Базовая настройка публичного сервера — политика , явно открытые порты запущенных сервисов и ограничение частоты новых подключений к SSH.
default deny incoming - iptables нужен для задач, с которыми UFW не справляется: настройки NAT и проброса портов, собственных порогов ограничения частоты подключений и работы с цепочкой .
FORWARD - Правила iptables не сохраняются после перезагрузки без или пакета
iptables-save. UFW сохраняет правила автоматически.iptables-persistent
Трафик в Linux фильтруется в ядре, а утилиты в пользовательском пространстве задают правила. Стек выглядит так:
UFW / firewalld → iptables / nftables → Netfilter (ядро)
- Netfilter — подсистема ядра Linux с набором хуков для перехвата и обработки сетевых пакетов. На ней построены iptables, ip6tables, nftables и другие инструменты фильтрации.
- iptables — утилита командной строки для управления таблицами фильтрации пакетов IPv4 (документация iptables). Для IPv6 ту же роль выполняет ip6tables.
- nftables — преемник iptables, ip6tables, arptables и ebtables, который объединяет фильтрацию IPv4, IPv6 и других протоколов в одной подсистеме ядра (nftables wiki).
- UFW — интерфейс командной строки, который упрощает настройку iptables и Netfilter. В Ubuntu это файрвол по умолчанию (Ubuntu Server Documentation).
- firewalld — альтернативный фронтенд того же стека, который используется по умолчанию в Fedora, CentOS/RHEL и Rocky Linux (Red Hat Documentation).
UFW и firewalld генерируют правила для iptables. Поэтому при настройке файрвола через UFW и вручную через iptables администратор работает с одним механизмом ядра на разных уровнях абстракции.
Таблицы, цепочки и действия
Для повседневной работы достаточно основной таблицы фильтрации —
filter| Цепочка | Какой трафик обрабатывает |
| INPUT | Входящий на сам сервер |
| OUTPUT | Исходящий с сервера |
| FORWARD | Транзитный, проходящий через сервер (роутер, NAT) |
Правило заканчивается действием:
ACCEPTDROPREJECTLOGРазница между
DROPREJECTDROPREJECTDROPREJECTУстановка и базовые команды
# Установка (в Ubuntu пакет обычно уже установлен) sudo apt install ufw # Проверить статус sudo ufw status sudo ufw status verbose # подробно, с политиками по умолчанию sudo ufw status numbered # с номерами правил # Включить или отключить sudo ufw enable sudo ufw disable # Сбросить все правила sudo ufw reset
При разборе проблем с доступом начните с
ufw status verboseПолитики по умолчанию
# Запретить всё входящее, разрешить всё исходящее sudo ufw default deny incoming sudo ufw default allow outgoing
Эта пара политик подходит для базовой настройки сервера. Сервер не принимает входящие соединения, пока вы явно не откроете нужные порты. Исходящий трафик не ограничен, поэтому обновления пакетов, обращения к внешним API и отправка метрик продолжают работать.
Ограничивать исходящий трафик имеет смысл в изолированных контурах с жёсткими требованиями. Настройку в них начинают с инвентаризации всех внешних зависимостей сервиса, иначе первым перестанет работать
apt updateРазрешение портов и сервисов
Одна из частых задач администратора — открыть порт для конкретного сервиса. В UFW для этого достаточно одной команды:
# По номеру порта sudo ufw allow 22 # SSH sudo ufw allow 80 # HTTP sudo ufw allow 443 # HTTPS sudo ufw allow 8080 # нестандартный порт приложения # По имени сервиса (имена берутся из /etc/services) sudo ufw allow ssh sudo ufw allow http sudo ufw allow https # Диапазон портов sudo ufw allow 3000:3010/tcp sudo ufw allow 3000:3010/udp # Протокол указан явно sudo ufw allow 53/udp # DNS sudo ufw allow 53/tcp # Запретить доступ к порту sudo ufw deny 23 # telnet
Если протокол не указан, UFW открывает порт и для TCP, и для UDP. Для веб-сервера это лишнее: указывайте
80/tcp443/tcpПравила по IP-адресу и подсети
В правилах UFW можно указать источник, назначение и интерфейс. Эти параметры позволяют ограничить доступ к сервисам:
# Разрешить весь трафик с конкретного IP sudo ufw allow from 192.168.1.100 # Разрешить доступ к конкретному порту с конкретного IP sudo ufw allow from 192.168.1.100 to any port 5432 # Разрешить доступ из подсети sudo ufw allow from 10.0.0.0/8 to any port 22 # Разрешить доступ из подсети только через определённый интерфейс sudo ufw allow in on eth0 from 192.168.1.0/24 to any port 3306 # Запретить весь трафик из подсети sudo ufw deny from 203.0.113.0/24
Привязка к интерфейсу (
in on eth0Управление правилами
UFW проверяет правила по порядку, поэтому их положение в списке влияет на результат:
# Показать правила с номерами sudo ufw status numbered # Удалить правило по номеру sudo ufw delete 3 # Удалить правило по его описанию sudo ufw delete allow 80 sudo ufw delete allow from 192.168.1.100 to any port 5432 # Вставить правило на нужную позицию sudo ufw insert 1 allow from 10.0.0.0/8
Удалять правила по номеру удобно в консоли, но после каждой операции номера сдвигаются. В скриптах и Ansible-ролях надёжнее удалять правила по описанию: такая команда идемпотентна и не зависит от текущего порядка правил.
Логирование
# Включить логирование sudo ufw logging on sudo ufw logging medium # low / medium / high / full # Смотреть журнал tail -f /var/log/ufw.log
Уровень
lowmediumhighfullfulllowmediumВеб-сервер (nginx или Apache)
sudo ufw default deny incoming sudo ufw default allow outgoing # SSH — только с доверенного IP (подставьте свой адрес или диапазон) sudo ufw allow from 203.0.113.10 to any port 22 # HTTP и HTTPS — для всех sudo ufw allow 80/tcp sudo ufw allow 443/tcp sudo ufw enable
Сначала добавьте правила и только затем выполните
ufw enabledeny incomingЕсли администраторы подключаются с динамических адресов, ограничить доступ к SSH по IP не получится. В таком случае порт 22 открывают для всех, а для защиты от перебора паролей используют fail2ban, который блокирует адреса по журналу неудачных входов, и
ufw limitСервер PostgreSQL — только из своей сети
# Доступ к PostgreSQL только из приватной подсети sudo ufw allow from 10.0.0.0/8 to any port 5432 # Или только с конкретного сервера приложений sudo ufw allow from 10.0.1.5 to any port 5432
В production СУБД не должна принимать подключения на
0.0.0.0listen_addressespg_hba.confПриватный API-сервер
# SSH — отовсюду, с защитой через fail2ban sudo ufw allow 22/tcp # API — только из офисной подсети sudo ufw allow from 192.168.10.0/24 to any port 8080 # Метрики — только с сервера мониторинга sudo ufw allow from 10.0.0.20 to any port 9090 # Prometheus sudo ufw allow from 10.0.0.20 to any port 9100 # node_exporter
Открытые порты экспортёров метрик — частая брешь в защите периметра:
node_exporterUFW поддерживает профили приложений: описания портов хранятся в каталоге
/etc/ufw/applications.d/ufw app listufw app info# Список доступных профилей sudo ufw app list # Информация о конкретном профиле sudo ufw app info Nginx # Разрешить доступ по профилю sudo ufw allow 'Nginx Full' # HTTP + HTTPS sudo ufw allow 'Nginx HTTP' # только HTTP sudo ufw allow 'Nginx HTTPS' # только HTTPS sudo ufw allow 'OpenSSH'
Профили устанавливаются вместе с пакетами: например, после установки nginx появляются
Nginx FullNginx HTTPNginx HTTPS/etc/ufw/applications.d/myapp[MyApp] title=My Application description=Custom app on port 8080 ports=8080/tcp
Команда
sudo ufw app update MyAppsudo ufw allow MyAppufw statusUFW позволяет фильтровать трафик по портам, адресам и интерфейсам. Для более сложных задач — ограничения частоты подключений с собственными счётчиками, настройки NAT и проброса портов, маркировки пакетов для QoS и сложных правил с учётом состояния соединений — команды iptables пишут напрямую.
Просмотр правил
# Таблица filter — основная sudo iptables -L -n -v # подробно, без преобразования адресов и портов в имена sudo iptables -L -n -v --line-numbers # с номерами строк # Таблица NAT sudo iptables -t nat -L -n -v # Таблица mangle sudo iptables -t mangle -L -n -v
Флаг
-n-vБазовые правила цепочки INPUT
# Разрешить установленные и связанные соединения sudo iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # Разрешить loopback sudo iptables -A INPUT -i lo -j ACCEPT # SSH sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT # HTTP и HTTPS sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT # ICMP (ping) sudo iptables -A INPUT -p icmp -j ACCEPT # Политики по умолчанию sudo iptables -P INPUT DROP sudo iptables -P FORWARD DROP sudo iptables -P OUTPUT ACCEPT
Не забудьте разрешить трафик через loopback-интерфейс. Многие сервисы общаются друг с другом через
127.0.0.1loПолитики по умолчанию (
-PINPUT DROPПервое правило необходимо: без
ESTABLISHED,RELATEDINPUT DROPМодуль
recent# Фиксировать новые соединения на порт 22 в списке SSH sudo iptables -A INPUT -p tcp --dport 22 -m state --state NEW \ -m recent --set --name SSH # Отбрасывать, если с одного IP пришло 4 и более соединения за 60 секунд sudo iptables -A INPUT -p tcp --dport 22 -m state --state NEW \ -m recent --update --seconds 60 --hitcount 4 --name SSH \ -j DROP
Первое правило добавляет адрес в список и обновляет счётчик, второе проверяет число обращений. Порядок важен: пакет сначала учитывается в списке, затем проверяется по нему.
В UFW есть упрощённый аналог:
sudo ufw limit ssh
Команда
ufw limitrecentДля NAT и проброса портов нужно включить пересылку пакетов IPv4 с помощью параметра ядра
net.ipv4.ip_forward# Включить до перезагрузки echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward # Для постоянной настройки добавить в /etc/sysctl.conf строку: # net.ipv4.ip_forward = 1 # Затем применить настройки: sudo sysctl -p
Затем добавляют правила трансляции:
# Проброс внешнего порта 8080 на внутренний сервер 10.0.0.5:80 sudo iptables -t nat -A PREROUTING -p tcp --dport 8080 \ -j DNAT --to-destination 10.0.0.5:80 sudo iptables -A FORWARD -p tcp -d 10.0.0.5 --dport 80 -j ACCEPT # Masquerading — NAT для исходящего трафика внутренних машин sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
Без разрешающего правила в цепочке
FORWARDУдаление правил и сброс цепочек
# Показать правила с номерами sudo iptables -L INPUT -n -v --line-numbers # Удалить правило по номеру sudo iptables -D INPUT 3 # Удалить правило по описанию: та же команда, но -D вместо -A sudo iptables -D INPUT -p tcp --dport 80 -j ACCEPT # Очистить правила и удалить пользовательские цепочки таблицы filter sudo iptables -F sudo iptables -X # Вернуть политики в ACCEPT (разрешает весь трафик в этих цепочках) sudo iptables -P INPUT ACCEPT sudo iptables -P FORWARD ACCEPT
Команда
iptables -FINPUTDROPiptables -P INPUT ACCEPTiptables -FСохранение правил iptables
Правила iptables хранятся в памяти ядра и сами по себе не восстанавливаются после перезагрузки. Для их сохранения и восстановления используют
iptables-saveiptables-restoreiptables-persistentnetfilter-persistent# Установить пакет sudo apt install iptables-persistent # Сохранить текущие правила sudo netfilter-persistent save # Или вручную sudo iptables-save > /etc/iptables/rules.v4 sudo ip6tables-save > /etc/iptables/rules.v6 # Восстановить правила из файла sudo iptables-restore < /etc/iptables/rules.v4
Файл
rules.v4| Задача | UFW | iptables |
| Открыть или закрыть порт | да | да |
| Правила по IP-адресам и подсетям | да | да |
| Профили приложений | да | нет |
| Базовое ограничение частоты подключений | да, ufw limit | да |
| Ограничение частоты подключений с собственными порогами | нет | да |
| NAT и проброс портов | нет | да |
| Маркировка пакетов (QoS) | нет | да |
| Подробное логирование | частично | да |
| Сохранение правил | автоматически | вручную |
| Порог входа | низкий | высокий |
Начинайте с UFW и добавляйте правила iptables для задач, с которыми UFW не справляется. Эти инструменты не конфликтуют: UFW генерирует правила для того же стека, а команды
iptables -AПри совместном использовании учитывайте порядок обработки. Правила в цепочке проверяются сверху вниз, и первое совпадение определяет, что произойдёт с пакетом. UFW размещает правила в собственных цепочках
ufw-*INPUT-A INPUT-I INPUT 1nftables — преемник iptables, ip6tables, arptables и ebtables, который объединяет обработку IPv4, IPv6 и других протоколов в одной подсистеме ядра (nftables wiki). Подсистема входит в состав ядра Linux с версии 3.13.
В Ubuntu и Debian переход уже произошёл и мог остаться незаметным для администратора. Начиная с Ubuntu 20.04 LTS пакет iptables использует слой совместимости
iptables-nftlegacy# Полный набор правил nftables sudo nft list ruleset # Аналог iptables -L для основной таблицы sudo nft list table inet filter
Синтаксис nftables проще читать: условие и действие задаются в одном правиле без множества модулей, а наборы адресов и портов (sets) заменяют десятки однотипных строк. Для большинства серверных задач переход не требует переписывать конфигурацию: UFW скрывает различия между iptables и nftables, а менять работающие правила без необходимости рискованно.
Изучать nftables напрямую стоит, если вы создаёте новый проект, настраиваете высоконагруженный маршрутизатор, где важна эффективность обработки больших наборов правил, или используете дистрибутив, в котором iptables уже помечен как устаревший инструмент и поставляется только для совместимости.
Перед тем как назначить серверу публичный IP-адрес, проверьте настройки:
- для входящего трафика задана политика по умолчанию ;
deny - SSH разрешён на том порту, который используется на сервере: если порт нестандартный, правило должно разрешать его, а не порт 22;
- HTTP и HTTPS открыты, если на сервере работает веб-сервер;
- порты СУБД (PostgreSQL, MySQL, Redis, MongoDB) недоступны извне или открыты только для нужных адресов;
- для SSH включено ограничение частоты подключений через или правило с модулем
ufw limit ssh;recent - логирование включено командой ;
sudo ufw logging on - правила iptables сохранены, если вы не используете UFW;
- текущие правила проверены командой или
sudo ufw status verbose;sudo iptables -L -n -v - после включения файрвола проверено подключение к серверу из новой сессии: существующая SSH-сессия сохраняется благодаря правилу и не подтверждает, что новые подключения разрешены.
ESTABLISHED
Последний пункт пропускают чаще всего. Откройте вторую сессию, не закрывая первую. Если подключиться не получится, вы сможете откатить правила через действующую сессию.
Частые вопросы про файрвол на Linux
Потерял доступ по SSH после включения UFW — что делать?
Восстанавливать доступ придётся в обход сети. Если сервер работает в облаке, подключитесь к нему через консоль провайдера. В VK Cloud она открывается в карточке ВМ. Выполните
sudo ufw disablesudo ufw allow 22UFW и группы безопасности облака — нужно ли и то и другое?
Это два независимых уровня защиты. Сетевые правила провайдера фильтруют трафик до его поступления на виртуальную машину и не зависят от состояния UFW внутри системы (VK Cloud, Networks — Firewall). UFW защищает саму машину: его правила сохраняются при переносе ВМ между проектами и продолжают действовать, даже если сетевые ограничения временно ослаблены для отладки. Разумно использовать оба уровня: сетевой фильтр для защиты периметра, UFW — для защиты конкретного хоста.
Почему после *sudo ufw enable* перестал работать сайт?
Почти всегда причина в том, что правила для портов 80 и 443 не добавили до включения файрвола, поэтому политика
deny incomingufw allow 22ufw allow 80/tcpufw allow 443/tcpufw enablesudo ufw statusss -tlnpМожно ли использовать UFW и iptables одновременно?
Да. UFW создаёт правила в цепочках
ufw-*iptables -A INPUT ...INPUTiptables -L -n -vКак временно отключить файрвол для диагностики?
Для UFW выполните
sudo ufw disablesudo ufw enablesudo iptables -P INPUT ACCEPT && sudo iptables -Fsudo iptables-restore < /etc/iptables/rules.v4Для типового сервера с веб-приложением и базой данных достаточно UFW: он позволяет открыть порты веб-сервера, ограничить доступ к СУБД нужной подсетью, включить ограничение частоты подключений к SSH и создать профиль приложения для собственного сервиса. Для NAT, проброса портов, собственных порогов ограничения частоты подключений и работы с цепочкой
FORWARDНачните с трёх действий на сервере, с которым работаете сейчас: задайте политику
default deny incomingОтработать настройку удобно на отдельной машине. Облачные серверы VK Cloud можно запустить из готовых образов Ubuntu и управлять ими через CLI, API и Terraform-провайдер. Сетевой фильтр проекта обеспечивает дополнительный рубеж защиты независимо от правил внутри ВМ.
Оставьте заявку, чтобы получить консультацию
Наши специалисты свяжутся с вами в ближайшее время и ответят на все вопросы.
Узнавайте о выходе новых статей в блоге первыми!
Будем держать в курсе новостей и облачных трендов


Почитать по теме

Доверенный ПАК для значимого объекта КИИ

Ответственность за КИИ без взлома

