UFW (Uncomplicated Firewall) — фронтенд для управления правилами netfilter в Linux, разработанный специально для Ubuntu. Он не заменяет iptables/nftables, а предоставляет упрощённый интерфейс для типовых задач: открытие портов, ограничение скорости подключений, работа с профилями приложений. После установки UFW по умолчанию выключен, а политики настроены так: входящий трафик — deny, исходящий — allow, пересылка (forward) — deny.
Перед любыми изменениями убедитесь, что знаете текущее состояние:
Если firewall ещё не активирован, вывод будет:
Это нормально для свежеустановленного сервера. Правила, добавленные до активации, сохраняются и применяются при включении.
При выполнении
Если SSH работает на нестандартном порту, например 2222:
Только после этого включайте firewall:
Если вы уже подключены по SSH, ufw выдаст предупреждение и запросит подтверждение. Для автоматизации (например, в скриптах) используйте флаг
После активации правила добавляются и удаляются без сброса цепочек — существующие соединения не рвутся. Исключение: изменение правил или дефолтной политики всё же вызывает flush.
Вместо простого
Это не заменяет fail2ban для сложной аналитики, но отсекает примитивные переборы паролей без дополнительной настройки.
Проверить текущие политики:
Пример вывода:
Изменение политик:
Политика
Если протокол не указан, правило применяется и к TCP, и к UDP. UFW также понимает имена служб из
Ограничить доступ к порту определённой подсетью:
Разрешить несколько портов одной командой (максимум 15 портов, диапазон считается за 2):
Обратите внимание: такая группа портов управляется как единое правило — удалить из неё отдельный порт нельзя, только всё правило целиком.
UFW читает профили из
Пример вывода:
Использование профиля вместо номера порта:
Посмотреть, какие порты включает профиль:
Пример вывода:
При включённом IPv6 удаление по номеру убирает только одно правило (IPv4 или IPv6). Чтобы удалить оба варианта одной командой, используйте исходный синтаксис:
Порядок правил важен: первое совпадение выигрывает. Более специфичные правила должны стоять выше общих.
Это вставит правило блокировки на первую позицию, и оно будет обработано раньше, чем общий
Правило добавится перед всеми существующими правилами соответствующего IP-типа (отдельно для IPv4 и IPv6).
По умолчанию логирование включено на уровне
Изменение уровня:
Логи пишутся в
Логирование конкретного правила:
IPv6 включён по умолчанию. Правила, записанные без указания адреса, применяются к обоим стекам. Если
Отключить IPv6-фильтрацию можно в
После изменения требуется перезагрузка:
Если сервер работает как маршрутизатор или шлюз, нужно разрешить пересылку:
И включить форвардинг в
Правила пересылки используют ключевое слово
Интерфейсы в правилах
Потеря доступа при первом включении. Самая частая ошибка — выполнить
Удаление правила по номеру при включённом IPv6. Команда
Конфликт с Docker. Docker при запуске добавляет собственные правила в цепочку FORWARD и может создавать правила в цепочке INPUT, которые обходят UFW. Если на сервере работает Docker, проверяйте итоговое состояние через
Правило не срабатывает из-за порядка. UFW обрабатывает правила последовательно, первое совпадение побеждает. Если общий
Полное состояние firewall в формате iptables:
Прослушиваемые порты и связанные с ними правила:
Эта команда показывает, какие порты открыты, какой процесс их слушает и какие правила UFW влияют на каждый порт.
Список правил в том виде, в котором они были добавлены:
Проверка конкретного порта извне (с другой машины):
Временное отключение (правила сохраняются):
Полный сброс всех правил и политик к значениям по умолчанию:
Команда
После выполнения проверьте, что SSH-сессия не прервалась и
Проверка текущего состояния
Перед любыми изменениями убедитесь, что знаете текущее состояние:
Bash:
sudo ufw status verbose
Если firewall ещё не активирован, вывод будет:
Код:
Status: inactive
Это нормально для свежеустановленного сервера. Правила, добавленные до активации, сохраняются и применяются при включении.
Главное правило: сначала SSH, потом enable
При выполнении
ufw enable происходит сброс цепочек (flush), что может разорвать существующие соединения, включая текущую SSH-сессию. Поэтому правило для SSH добавляется до активации:
Bash:
sudo ufw allow 22/tcp comment 'SSH'
Если SSH работает на нестандартном порту, например 2222:
Bash:
sudo ufw allow 2222/tcp comment 'SSH'
Только после этого включайте firewall:
Bash:
sudo ufw enable
Если вы уже подключены по SSH, ufw выдаст предупреждение и запросит подтверждение. Для автоматизации (например, в скриптах) используйте флаг
--force:
Bash:
sudo ufw --force enable
После активации правила добавляются и удаляются без сброса цепочек — существующие соединения не рвутся. Исключение: изменение правил или дефолтной политики всё же вызывает flush.
Rate limiting для защиты от brute-force
Вместо простого
allow для SSH лучше использовать limit. UFW заблокирует IP-адрес, если с него инициировано 6 и более новых соединений за 30 секунд:
Bash:
sudo ufw limit 22/tcp comment 'SSH rate limit'
Это не заменяет fail2ban для сложной аналитики, но отсекает примитивные переборы паролей без дополнительной настройки.
Политики по умолчанию и их изменение
Проверить текущие политики:
Bash:
sudo ufw status verbose
Пример вывода:
Код:
Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), disabled (routed)
New profiles: skip
Изменение политик:
Bash:
sudo ufw default deny incoming
sudo ufw default allow outgoing
Политика
deny на входящий трафик означает, что любой порт закрыт, если для него нет явного правила allow. Это безопасная база для сервера.Открытие портов для сервисов
Простой синтаксис
Bash:
sudo ufw allow 80/tcp comment 'HTTP'
sudo ufw allow 443/tcp comment 'HTTPS'
sudo ufw allow 53 comment 'DNS'
Если протокол не указан, правило применяется и к TCP, и к UDP. UFW также понимает имена служб из
/etc/services:
Bash:
sudo ufw allow http
sudo ufw allow https
Расширенный синтаксис с указанием источника и интерфейса
Ограничить доступ к порту определённой подсетью:
Bash:
sudo ufw allow in on eth0 from 192.168.0.0/16 to any port 5432 proto tcp comment 'PostgreSQL LAN'
Разрешить несколько портов одной командой (максимум 15 портов, диапазон считается за 2):
Bash:
sudo ufw allow proto tcp from any to any port 80,443,8080:8090 comment 'web app'
Обратите внимание: такая группа портов управляется как единое правило — удалить из неё отдельный порт нельзя, только всё правило целиком.
Профили приложений
UFW читает профили из
/etc/ufw/applications.d/. Список доступных:
Bash:
sudo ufw app list
Пример вывода:
Код:
Available applications:
Nginx Full
Nginx HTTP
Nginx HTTPS
OpenSSH
Использование профиля вместо номера порта:
Bash:
sudo ufw allow 'Nginx Full'
sudo ufw allow 'OpenSSH'
Посмотреть, какие порты включает профиль:
Bash:
sudo ufw app info 'Nginx Full'
Управление правилами: удаление, вставка, нумерация
Просмотр правил с номерами
Bash:
sudo ufw status numbered
Пример вывода:
Код:
Status: active
To Action From
-- ------ ----
[ 1] 22/tcp LIMIT IN Anywhere
[ 2] 80/tcp ALLOW IN Anywhere
[ 3] 443/tcp ALLOW IN Anywhere
[ 4] 22/tcp (v6) LIMIT IN Anywhere (v6)
Удаление по номеру
Bash:
sudo ufw delete 2
При включённом IPv6 удаление по номеру убирает только одно правило (IPv4 или IPv6). Чтобы удалить оба варианта одной командой, используйте исходный синтаксис:
Bash:
sudo ufw delete allow 80/tcp
Вставка правила на определённую позицию
Порядок правил важен: первое совпадение выигрывает. Более специфичные правила должны стоять выше общих.
Bash:
sudo ufw insert 1 deny from 10.0.0.135 to any port 22 proto tcp
Это вставит правило блокировки на первую позицию, и оно будет обработано раньше, чем общий
allow на порт 22.Prepend для динамических правил
Bash:
sudo ufw prepend deny from 203.0.113.50
Правило добавится перед всеми существующими правилами соответствующего IP-типа (отдельно для IPv4 и IPv6).
Логирование
По умолчанию логирование включено на уровне
low. Уровни:| Уровень | Что логируется |
|---|---|
| off | Ничего |
| low | Заблокированные пакеты, не соответствующие политике, и пакеты с ограничением скорости |
| medium | Всё из low + разрешённые новые соединения |
| high | Всё из medium + все пакеты (может быстро заполнить диск) |
| full | Всё из high без ограничения скорости записи |
Изменение уровня:
Bash:
sudo ufw logging medium
Логи пишутся в
/var/log/ufw.log (или в syslog, зависит от конфигурации rsyslog). Для уровней выше medium на загруженных серверах объём логов может стать проблемой — следите за ротацией.Логирование конкретного правила:
Bash:
sudo ufw allow 22/tcp log
IPv6
IPv6 включён по умолчанию. Правила, записанные без указания адреса, применяются к обоим стекам. Если
ufw allow 22/tcp добавлено при активном IPv6, в status numbered вы увидите два правила: одно для IPv4, второе с пометкой (v6).Отключить IPv6-фильтрацию можно в
/etc/default/ufw:
Код:
IPV6=no
После изменения требуется перезагрузка:
Bash:
sudo ufw reload
Пересылка трафика (forwarding)
Если сервер работает как маршрутизатор или шлюз, нужно разрешить пересылку:
Bash:
sudo ufw default allow routed
И включить форвардинг в
/etc/ufw/sysctl.conf:
Код:
net/ipv4/ip_forward=1
net/ipv6/conf/default/forwarding=1
net/ipv6/conf/all/forwarding=1
Правила пересылки используют ключевое слово
route:
Bash:
sudo ufw route allow in on eth0 out on eth1 to 10.0.0.0/8 from 192.168.0.0/16
Интерфейсы в правилах
route указываются относительно направления потока пакетов через firewall, а не относительно самого хоста.Типичные ошибки и как их избежать
Потеря доступа при первом включении. Самая частая ошибка — выполнить
ufw enable без предварительного правила для SSH. Решение: всегда добавляйте правило до активации. Если доступ уже потерян, потребуется консольный доступ через VNC/IPMI или rescue-режим хостинга.Удаление правила по номеру при включённом IPv6. Команда
ufw delete 3 удалит только одно из двух правил (IPv4 или IPv6). Второе останется. Проверяйте status numbered после удаления.Конфликт с Docker. Docker при запуске добавляет собственные правила в цепочку FORWARD и может создавать правила в цепочке INPUT, которые обходят UFW. Если на сервере работает Docker, проверяйте итоговое состояние через
sudo ufw show raw или sudo iptables -n -L -v.Правило не срабатывает из-за порядка. UFW обрабатывает правила последовательно, первое совпадение побеждает. Если общий
deny стоит выше специфичного allow, трафик будет заблокирован. Используйте insert или prepend для корректировки порядка.Диагностика и проверка результата
Полное состояние firewall в формате iptables:
Bash:
sudo ufw show raw
Прослушиваемые порты и связанные с ними правила:
Bash:
sudo ufw show listening
Эта команда показывает, какие порты открыты, какой процесс их слушает и какие правила UFW влияют на каждый порт.
Список правил в том виде, в котором они были добавлены:
Bash:
sudo ufw show added
Проверка конкретного порта извне (с другой машины):
Bash:
nc -zv SERVER_IP 22
nc -zv SERVER_IP 80
Отключение и сброс
Временное отключение (правила сохраняются):
Bash:
sudo ufw disable
Полный сброс всех правил и политик к значениям по умолчанию:
Bash:
sudo ufw reset
Команда
reset удаляет все пользовательские правила и возвращает firewall в неактивное состояние. Используйте её осторожно — восстановление потребует повторной настройки.Итоговый минимальный набор для типового сервера
Bash:
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw limit 22/tcp comment 'SSH'
sudo ufw allow 80/tcp comment 'HTTP'
sudo ufw allow 443/tcp comment 'HTTPS'
sudo ufw enable
sudo ufw status verbose
После выполнения проверьте, что SSH-сессия не прервалась и
status verbose показывает ожидаемые правила. Если сервер за NAT или балансировщиком, убедитесь, что правила соответствуют реальным интерфейсам и источникам трафика.
