Перейти к основному содержимому

Настройка файрвола UFW

Полное руководство по настройке Uncomplicated Firewall (UFW) в Ubuntu и Debian.

Основы UFW

Установка и первоначальная настройка

# Установка UFW (обычно уже установлен)
sudo apt update
sudo apt install ufw

# Проверка статуса
sudo ufw status

# Базовая настройка
sudo ufw default deny incoming
sudo ufw default allow outgoing

# Включение UFW
sudo ufw enable

# Отключение UFW
sudo ufw disable

Базовые правила

# Разрешить SSH (важно сделать до включения UFW!)
sudo ufw allow ssh
sudo ufw allow 22/tcp

# Разрешить HTTP и HTTPS
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw allow http
sudo ufw allow https

# Разрешить определенный порт
sudo ufw allow 3000/tcp
sudo ufw allow 8080/udp

# Разрешить диапазон портов
sudo ufw allow 6000:6007/tcp

Расширенные правила

Правила по IP адресам

# Разрешить доступ с определенного IP
sudo ufw allow from 192.168.1.100

# Разрешить доступ с подсети
sudo ufw allow from 192.168.1.0/24

# Разрешить доступ с IP на определенный порт
sudo ufw allow from 192.168.1.100 to any port 22

# Разрешить доступ к определенному интерфейсу
sudo ufw allow in on eth0 to any port 80

Блокировка трафика

# Заблокировать IP адрес
sudo ufw deny from 203.0.113.100

# Заблокировать подсеть
sudo ufw deny from 203.0.113.0/24

# Заблокировать исходящий трафик на порт
sudo ufw deny out 25

# Заблокировать определенный порт
sudo ufw deny 23/tcp

Правила по протоколам

# Разрешить ICMP (ping)
sudo ufw allow in on eth0 from any to any port 22 proto tcp

# Правило для UDP
sudo ufw allow from 192.168.1.0/24 to any port 53 proto udp

# Разрешить мультикаст
sudo ufw allow in on eth0 to 224.0.0.0/4

Управление правилами

Просмотр правил

# Просмотр статуса с номерами правил
sudo ufw status numbered

# Подробный статус
sudo ufw status verbose

# Показать добавленные правила в формате команд
sudo ufw show added

Удаление правил

# Удалить правило по номеру
sudo ufw delete 3

# Удалить правило по содержимому
sudo ufw delete allow 80/tcp
sudo ufw delete allow from 192.168.1.100

# Сбросить все правила
sudo ufw --force reset

Изменение правил

# Вставить правило в определенную позицию
sudo ufw insert 1 allow from 192.168.1.0/24

# Изменить существующее правило (удалить и добавить заново)
sudo ufw delete allow 80/tcp
sudo ufw allow 80/tcp comment 'HTTP traffic'

Конфигурация для серверов

Веб-сервер (LAMP/LEMP)

#!/bin/bash
# web-server-firewall.sh

# Сброс правил
sudo ufw --force reset

# Политики по умолчанию
sudo ufw default deny incoming
sudo ufw default allow outgoing

# SSH доступ (измените порт если необходимо)
sudo ufw allow 22/tcp comment 'SSH'

# Веб-сервер
sudo ufw allow 80/tcp comment 'HTTP'
sudo ufw allow 443/tcp comment 'HTTPS'

# FTP (если используется)
sudo ufw allow 21/tcp comment 'FTP'
sudo ufw allow 20/tcp comment 'FTP Data'

# MySQL (только с локальной сети)
sudo ufw allow from 192.168.1.0/24 to any port 3306 comment 'MySQL'

# Включение UFW
sudo ufw enable

echo "Файрвол для веб-сервера настроен"

Сервер баз данных

#!/bin/bash
# database-server-firewall.sh

# Сброс правил
sudo ufw --force reset

# Политики по умолчанию
sudo ufw default deny incoming
sudo ufw default allow outgoing

# SSH доступ
sudo ufw allow from 192.168.1.0/24 to any port 22 comment 'SSH from local network'

# MySQL/MariaDB
sudo ufw allow from 192.168.1.0/24 to any port 3306 comment 'MySQL'

# PostgreSQL
sudo ufw allow from 192.168.1.0/24 to any port 5432 comment 'PostgreSQL'

# Redis
sudo ufw allow from 192.168.1.0/24 to any port 6379 comment 'Redis'

# MongoDB
sudo ufw allow from 192.168.1.0/24 to any port 27017 comment 'MongoDB'

# Включение UFW
sudo ufw enable

echo "Файрвол для сервера БД настроен"

Почтовый сервер

#!/bin/bash
# mail-server-firewall.sh

# Базовые правила
sudo ufw default deny incoming
sudo ufw default allow outgoing

# SSH
sudo ufw allow 22/tcp comment 'SSH'

# SMTP
sudo ufw allow 25/tcp comment 'SMTP'
sudo ufw allow 587/tcp comment 'SMTP Submission'
sudo ufw allow 465/tcp comment 'SMTPS'

# POP3/IMAP
sudo ufw allow 110/tcp comment 'POP3'
sudo ufw allow 995/tcp comment 'POP3S'
sudo ufw allow 143/tcp comment 'IMAP'
sudo ufw allow 993/tcp comment 'IMAPS'

# HTTP/HTTPS для веб-интерфейса
sudo ufw allow 80/tcp comment 'HTTP'
sudo ufw allow 443/tcp comment 'HTTPS'

sudo ufw enable

Логирование и мониторинг

Настройка логирования

# Включить логирование
sudo ufw logging on

# Уровни логирования: off, low, medium, high, full
sudo ufw logging medium

# Просмотр логов
sudo tail -f /var/log/ufw.log

# Анализ заблокированных соединений
sudo grep "[UFW BLOCK]" /var/log/ufw.log

Скрипт мониторинга

#!/bin/bash
# ufw-monitor.sh

LOG_FILE="/var/log/ufw.log"
REPORT_FILE="/tmp/ufw-report.txt"

echo "=== UFW Отчет $(date) ===" > $REPORT_FILE
echo >> $REPORT_FILE

# Топ заблокированных IP
echo "Топ 10 заблокированных IP адресов:" >> $REPORT_FILE
grep "UFW BLOCK" $LOG_FILE | awk '{print $12}' | cut -d= -f2 | sort | uniq -c | sort -nr | head -10 >> $REPORT_FILE
echo >> $REPORT_FILE

# Топ портов
echo "Топ заблокированных портов:" >> $REPORT_FILE
grep "UFW BLOCK" $LOG_FILE | awk '{print $14}' | cut -d= -f2 | sort | uniq -c | sort -nr | head -10 >> $REPORT_FILE
echo >> $REPORT_FILE

# Статистика за последний час
echo "Заблокированные соединения за последний час:" >> $REPORT_FILE
grep "UFW BLOCK" $LOG_FILE | grep "$(date '+%b %d %H')" | wc -l >> $REPORT_FILE

cat $REPORT_FILE

Продвинутая конфигурация

Кастомные правила

# Создание файла с кастомными правилами
sudo nano /etc/ufw/before.rules

# Добавление в начало файла (после заголовков):
# Разрешить loopback
-A ufw-before-input -i lo -j ACCEPT
-A ufw-before-output -o lo -j ACCEPT

# Разрешить ICMP
-A ufw-before-input -p icmp --icmp-type destination-unreachable -j ACCEPT
-A ufw-before-input -p icmp --icmp-type time-exceeded -j ACCEPT
-A ufw-before-input -p icmp --icmp-type parameter-problem -j ACCEPT
-A ufw-before-input -p icmp --icmp-type echo-request -j ACCEPT

# Защита от Port Scanning
-A ufw-before-input -p tcp --tcp-flags SYN,ACK,FIN,RST RST -m limit --limit 1/s -j ACCEPT

Fail2Ban интеграция

# Установка Fail2Ban
sudo apt install fail2ban

# Создание конфигурации для UFW
sudo nano /etc/fail2ban/jail.local

[ufw]
enabled = true
filter = ufw
logpath = /var/log/ufw.log
maxretry = 5
bantime = 3600

# Создание фильтра
sudo nano /etc/fail2ban/filter.d/ufw.conf

[Definition]
failregex = \[UFW BLOCK\] IN=.* SRC=<HOST>
ignoreregex =

Автоматизация управления

#!/bin/bash
# ufw-backup-restore.sh

case "$1" in
backup)
# Создание бэкапа правил
sudo ufw status numbered > /etc/ufw/backup-$(date +%Y%m%d).txt
sudo cp /etc/ufw/user.rules /etc/ufw/user.rules.backup
sudo cp /etc/ufw/user6.rules /etc/ufw/user6.rules.backup
echo "Бэкап UFW создан"
;;
restore)
# Восстановление из бэкапа
sudo ufw --force reset
sudo cp /etc/ufw/user.rules.backup /etc/ufw/user.rules
sudo cp /etc/ufw/user6.rules.backup /etc/ufw/user6.rules
sudo ufw enable
echo "UFW восстановлен из бэкапа"
;;
*)
echo "Использование: $0 {backup|restore}"
exit 1
;;
esac

Тестирование и отладка

Проверка правил

# Тестирование без применения
sudo ufw --dry-run enable

# Проверка синтаксиса конфигурации
sudo ufw --dry-run reload

# Проверка подключения к портам
nmap -p 22,80,443 localhost

# Тестирование с удаленного хоста
telnet server_ip 80
nc -zv server_ip 80

Отладка

# Включить детальное логирование
sudo ufw logging full

# Просмотр правил iptables, созданных UFW
sudo iptables -L -n -v

# Временное отключение для отладки
sudo ufw disable
# ... отладка ...
sudo ufw enable
Безопасность

Всегда разрешайте SSH доступ перед включением UFW, чтобы не потерять доступ к серверу.

Осторожность

Будьте внимательны при настройке правил на удаленных серверах. Неправильная конфигурация может заблокировать ваш доступ.