UFW (Uncomplicated Firewall) — упрощенная надстройка над iptables/nftables. На сервере логика простая: сначала разрешаем нужные входящие соединения, затем включаем UFW, потом постепенно добавляем остальное.
Короткий план
- Проверить наличие UFW и статус.
- Разрешить SSH до включения.
- Включить UFW со строгими политикам по умолчанию.
- Открыть нужные сервисы и подсети.
- Включить логирование и проверить работу.
- Управлять правилами по номерам и комментариям.
- Дополнительно: IPv6, rate limit, порт-диапазоны, исходящий трафик, сброс.
Важно
- Всегда добавляйте правило для SSH до включения UFW, иначе можно потерять доступ.
- Любое изменение применяйте осознанно и держите вторую сессию открытой для отката.
Установка и базовая проверка
sudo apt update
sudo apt install -y ufw
sudo ufw status verbose
Если UFW выключен, увидите статус inactive.
Безопасный старт: не потерять SSH
Разрешаем SSH и включаем UFW. Если используете нестандартный порт, замените 22 на ваш реальный порт.
sudo ufw allow 22/tcp comment 'SSH'
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw enable
sudo ufw status verbose
Пояснения
- default deny incoming блокирует весь входящий трафик, кроме явно разрешенного.
- default allow outgoing оставляет исходящие подключения открытыми, как на большинстве серверов.
Открываем типовые сервисы
HTTP и HTTPS
sudo ufw allow 80/tcp comment 'HTTP'
sudo ufw allow 443/tcp comment 'HTTPS'
DNS для собственного резолвера
sudo ufw allow 53/udp comment 'DNS'
sudo ufw allow 53/tcp comment 'DNS zone xfer or TCP fallback'
NTP, если сервер синхронизирует время для внешних клиентов
sudo ufw allow 123/udp comment 'NTP'
SSH на нестандартном порту, пример 2222
sudo ufw allow 2222/tcp comment 'SSH alt'
Ограничение доступа по IP и подсетям
Разрешить доступ к SSH только с одного белого IP
sudo ufw deny 22/tcp
sudo ufw allow from 203.0.113.5 to any port 22 proto tcp comment 'SSH from office'
Разрешить доступ к PostgreSQL только из приватной сети
sudo ufw allow proto tcp from 10.0.0.0/8 to any port 5432 comment 'Postgres internal'
Разрешить доступ к панели админки, привязав к интерфейсу
sudo ufw allow in on eth0 to any port 8443 proto tcp comment 'Admin panel on eth0'
Диапазоны портов и протоколы
Открыть диапазон для пассивного FTP как пример
sudo ufw allow 30000:31000/tcp comment 'FTP passive range'
Разрешить только UDP на конкретном порту
sudo ufw allow 1194/udp comment 'OpenVPN'
Rate limit для SSH и других сервисов
Ограничение частоты новых соединений снижает перебор паролей
sudo ufw limit 22/tcp comment 'Limit SSH brute-force'
Управление правилами: список, номера, удаление
Посмотреть правила с номерами
sudo ufw status numbered
Удалить правило по номеру (пример удаляем правило №5 из текущего списка)
sudo ufw delete 5
Удалить правило по тексту
sudo ufw delete allow 80/tcp
Изменить правило удобнее через «удалить старое» и «добавить новое».
Включить и проверить логирование
Включить логирование на уровне medium
sudo ufw logging medium
Где смотреть
sudo tail -n 100 /var/log/ufw.log
sudo grep UFW /var/log/syslog | tail -n 100
IPv6
UFW умеет IPv6. Проверьте конфиг и статус.
Проверить, активен ли IPv6 в UFW
grep -i '^IPV6=' /etc/ufw/ufw.conf
sudo ufw status verbose
Если в ufw.conf стоит IPV6=no, переключите на yes и перезапустите UFW
sudo sed -i 's/^IPV6=.*/IPV6=yes/' /etc/ufw/ufw.conf
sudo ufw disable
sudo ufw enable
Исходящий трафик: ужесточаем при необходимости
По умолчанию исходящие соединения разрешены. Чтобы запретить все исходящие и разрешать точечно:
Запретить все исходящие
sudo ufw default deny outgoing
Разрешить исходящие DNS, HTTP, HTTPS и NTP
sudo ufw allow out 53
sudo ufw allow out 80/tcp
sudo ufw allow out 443/tcp
sudo ufw allow out 123/udp
sudo ufw status verbose
Временное отключение и полный сброс
Временно выключить
sudo ufw disable
Включить снова
sudo ufw enable
Полный сброс к заводским настройкам
sudo ufw reset
sudo ufw status verbose
Типовые рецепты для продакшена
Сервер с Nginx и SSH
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow 22/tcp comment 'SSH'
sudo ufw allow 80/tcp comment 'HTTP'
sudo ufw allow 443/tcp comment 'HTTPS'
sudo ufw limit 22/tcp comment 'Limit SSH brute-force'
sudo ufw enable
sudo ufw status verbose
Сервер приложений с базой, доступной только из локальной сети
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow 22/tcp comment 'SSH'
sudo ufw allow 8080/tcp comment 'App HTTP'
sudo ufw allow proto tcp from 10.0.0.0/8 to any port 5432 comment 'Postgres from LAN'
sudo ufw enable
sudo ufw status numbered
Жесткий egress-контроль
sudo ufw default deny incoming
sudo ufw default deny outgoing
sudo ufw allow 22/tcp
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw allow out 53
sudo ufw allow out 123/udp
sudo ufw enable
sudo ufw status verbose
Диагностика и частые проблемы
SSH пропал после включения UFW
- Проверьте локальную консоль или доступ через панель провайдера.
- Разрешите порт SSH и включите UFW заново:
sudo ufw allow 22/tcp
sudo ufw enable
Правило не работает
- Проверьте порядок и дубли
sudo ufw status numbered
- Удалите конфликтующие правила и добавьте нужное снова.
Docker и UFW
- Контейнеры управляют собственными правилами iptables. Для минимальных конфликтов держите UFW на хосте и ограничивайте доступ на уровне публикуемых портов. Если нужна строгая фильтрация, откройте только нужные порты на хосте, а остальное регулируйте в Docker Compose.
Нет логов UFW
- Включите логирование sudo ufw logging medium и проверьте /var/log/ufw.log. Если файла нет, убедитесь, что rsyslog активен.
В итоге мы получили:
- Разрешили SSH и включили UFW со строгими политиками.
- Открыли только необходимые сервисы, при необходимости ограничили по IP и интерфейсам.
- Включили логирование, освоили правила по номерам, IPv6 и rate limit.
- При необходимости ужесточили исходящий трафик и научились быстро откатываться.