Firewall (брандмауэр) — это охранник на входе вашего сервера. Его задача — пропускать только нужный трафик и блокировать всё остальное. Представьте, что ваш сервер — это офис:
Без firewall: двери открыты всем. Заходит кто угодно, включая злоумышленников.
С firewall: охранник на входе проверяет каждого. Допускает только тех, у кого правильные документы (разрешённые подключения).
По умолчанию в Linux установлена система iptables — это мощный инструмент фильтрации трафика на уровне ядра. Но iptables имеет сложный синтаксис. Поэтому появился ufw (Uncomplicated Firewall) — упрощённый интерфейс над iptables, который переводит простые команды в сложные iptables-правила.
Важные концепции
Что такое портЭто канал связи. Каждое приложение слушает трафик на своём порту.
Типы портов:
0–1023 — системные (зарезервированные) порты. Требуют прав администратора.
22 — SSH (удалённое управление)
80 — HTTP (веб-сайты без шифрования)
443 — HTTPS (веб-сайты с шифрованием)
21 — FTP (передача файлов, устаревший)
25, 587 — SMTP (отправка почты)
110, 143 — POP3, IMAP (получение почты)
53 — DNS (переводит имена в IP-адреса)
1024–49151 — зарегистрированные порты. Используют приложения.
49152–65535 — динамические (ephemeral) порты. Система назначает их временно.
TCP и UDP — разница
Трафик по сети может идти двумя протоколами:
Характеристика
TCP
UDP
Надёжность
Гарантирует доставку всех пакетов в правильном порядке
Пакеты могут потеряться, но быстро
Скорость
Медленнее (из-за проверок)
Быстрее
Когда использовать
SSH, HTTP, HTTPS, FTP, Email — где важна целостность данных
Онлайн-игры, видеозвонки, DNS — где важна скорость
Пример
Вы отправляете письмо — оно должно дойти полностью
Вы смотрите видео — потеря пары кадров некритична
Важно: TCP-порт 22 отличается от UDP-порта 22. Это разные каналы!
Stateful firewall (с отслеживанием состояния)
UFW и iptables работают как stateful firewalls. Это означает, что они запоминают установленные соединения и разрешают ответные пакеты без дополнительных правил.
Пример: Вы подключаетесь к серверу SSH (порт 22). После проверки первого пакета firewall запоминает это соединение. Ответный трафик от сервера пропускается автоматически, даже если нет явного разрешающего правила для него.
Это значит, что вам не нужно писать два правила — одно для входящего, одно для исходящего трафика для каждого соединения.
Архитектура iptables
UFW работает над iptables, поэтому важно понимать его структуру.
iptables
├── Таблицы (tables)
│ ├── filter (фильтрация трафика) — **используется в 99% случаев**
│ ├── nat (преобразование адресов)
│ ├── mangle (изменение пакетов)
│ ├── raw (исключения из отслеживания)
│ └── security (правила безопасности)
│
└── Цепи (chains) — последовательности правил
├── INPUT (входящий трафик)
├── OUTPUT (исходящий трафик)
└── FORWARD (форвардинг через машину, как роутер)
Таблица filter
Таблица filter — это то, где вы выполняете классическую фильтрацию:
INPUT — пакеты, пришедшие на ваш сервер
Внешний хост → [Твой сервер] (INPUT правила применяются здесь)
Используется для блокировки/разрешения входящих подключений (SSH, HTTP, HTTPS).
OUTPUT — пакеты, отправляемые вашим сервером
[Твой сервер] → (OUTPUT правила применяются здесь) → Внешний хост
По умолчанию разрешены все исходящие пакеты. Можно запретить, если нужна максимальная безопасность.
FORWARD — пакеты, которые проходят через вашу машину (используется только если вы настраиваете маршрутизацию)
Сеть A → [Твой сервер как роутер] → (FORWARD правила) → Сеть B
Для обычного сервера FORWARD не используется.
Порядок применения правил
Правила проверяются сверху вниз до первого совпадения. Как только найдено правило, применяется его действие и дальше проверок не идёт.
Важно: порядок правил критичен!
Правило 1: DENY из 10.0.0.37
Правило 2: ALLOW из сети 10.0.0.0/24
Если 10.0.0.37 подключится, сработает правило 1 и соединение заблокируется. Правило 2 никогда не сработает для этого IP.
Если поменять местами:
Правило 1: ALLOW из сети 10.0.0.0/24
Правило 2: DENY из 10.0.0.37
Тогда 10.0.0.37 будет разрешен по правилу 1, правило 2 игнорируется.
UFW — интерфейс для новичков
Начало работы с UFW
UFW по умолчанию отключен. Перед включением обязательно добавьте правило для SSH (иначе заблокируете себя!):
sudo ufw allow 22
sudo ufw enable
Проверить статус:
sudo ufw status verbose
Вывод будет примерно такой:
Status: active
Default: deny incoming, allow outgoing, disabled routed
Это означает:
deny incoming — по умолчанию все входящие пакеты блокируются
allow outgoing — исходящий трафик разрешён
disabled routed — форвардинг отключен
Основной синтаксис UFW
sudo ufw allow <PORT>[/<PROTOCOL>] [from <IP|NETWORK>] [to <IP>] [comment "КОММЕНТАРИЙ"]
sudo ufw deny <PORT>[/<PROTOCOL>] [from <IP|NETWORK>] [to <IP>] [comment "КОММЕНТАРИЙ"]
sudo ufw delete allow <PORT>[/<PROTOCOL>] [from <IP|NETWORK>]
где:
<PORT> — номер порта (22, 80, 443)
<PROTOCOL> — tcp или udp (если не указать, применяется к обоим)
<IP|NETWORK> — конкретный IP или подсеть (192.168.1.0/24)
comment — описание правила (очень полезно!)
Примеры правил UFW
Разрешить входящий SSH со всех IP:
sudo ufw allow 22/tcp comment "SSH access"
или просто:
sudo ufw allow ssh
UFW знает имена популярных сервисов (ssh, http, https, ftp).
Разрешить HTTP и HTTPS (веб-сервер):
sudo ufw allow 80/tcp comment "HTTP"
sudo ufw allow 443/tcp comment "HTTPS"
или за раз (в версиях поновее):
sudo ufw allow 80,443/tcp
Запретить трафик на порт 23 (старый Telnet — небезопасен):
sudo ufw deny 23/tcp comment "Block Telnet"
Разрешить SSH только с конкретного IP:
sudo ufw allow from 192.168.1.100 to any port 22 comment "SSH from office"
Разрешить SSH с целой подсети:
sudo ufw allow from 192.168.1.0/24 to any port 22 comment "SSH from internal network"
Запретить конкретный IP, но разрешить остальных из подсети:
sudo ufw allow from 192.168.1.0/24 to any port 22 comment "Allow network"
sudo ufw insert 1 deny from 192.168.1.50 to any port 22 comment "Block one host"
Вставляем правило блокировки в позицию 1 (самое начало), чтобы оно проверилось первым.
Ограничить количество подключений (защита от brute-force SSH):
sudo ufw limit 22/tcp comment "Rate limit SSH"
Это ограничит соединения: максимум 6 подключений за 30 секунд. После превышения есть пауза перед следующей попыткой.
Разрешить трафик на диапазон портов (пассивный FTP):
sudo ufw allow 40000:50000/tcp comment "Passive FTP"
Разрешить входящие соединения только на интерфейс eth0:
sudo ufw allow in on eth0 from 10.0.0.0/24 to any port 22
Используется, если на машине несколько сетевых интерфейсов.
Блокировать исходящий трафик на конкретный IP (продвинутое правило):
sudo ufw deny out on eth0 to 8.8.8.8 comment "Block outgoing to Google DNS"
Просмотр правил
Список правил в неупорядоченном виде:
sudo ufw status
Вывод:
Status: active
To Action From
-- ------ ----
22/tcp ALLOW IN Anywhere
80/tcp ALLOW IN Anywhere
443/tcp ALLOW IN Anywhere
Список с номерами (нужно для удаления):
sudo ufw status numbered
Вывод:
To Action From
-- ------ ----
[ 1] 22/tcp ALLOW IN Anywhere
[ 2] 80/tcp ALLOW IN Anywhere
[ 3] 443/tcp ALLOW IN Anywhere
Подробный список с информацией о логировании:
sudo ufw status verbose
Удаление правил
По номеру (проще):
sudo ufw status numbered
sudo ufw delete 2
После удаления номера остальных правил сдвигаются вверх!
По полной спецификации:
sudo ufw delete allow 80/tcp
Спецификация должна точно совпадать с исходным правилом.
Очистить все правила и отключить firewall:
sudo ufw reset
Подтвердите. Внимание — все правила удалятся!
Логирование UFW
Включить логирование:
sudo ufw logging on
Отключить:
sudo ufw logging off
Просмотреть логи:
sudo tail -f /var/log/ufw.log
Логи обновляются в реальном времени.
Практический сценарий: настройка веб-сервера
Представим, вам нужен веб-сервер с SSH-доступом. Вот как его настроить:
# Добавляем правило для SSH (ОБЯЗАТЕЛЬНО ПЕРВЫМ!)
sudo ufw allow 22/tcp comment "SSH access"
# Включаем firewall
sudo ufw enable
# Добавляем HTTP
sudo ufw allow 80/tcp comment "HTTP"
# Добавляем HTTPS
sudo ufw allow 443/tcp comment "HTTPS"
# Проверяем результат
sudo ufw status numbered
Вывод:
To Action From
-- ------ ----
[ 1] 22/tcp ALLOW IN Anywhere
[ 2] 80/tcp ALLOW IN Anywhere
[ 3] 443/tcp ALLOW IN Anywhere
Всё остальное блокируется автоматически!
Хотим запретить HTTP (оставить только HTTPS):
sudo ufw delete allow 80/tcp
Результат:
To Action From
-- ------ ----
[ 1] 22/tcp ALLOW IN Anywhere
[ 2] 443/tcp ALLOW IN Anywhere
iptables — мощь и сложность
Если UFW не справляется — нужен iptables. Это база под UFW.
Просмотр iptables-правил
Список всех правил в filter-таблице:
sudo iptables -L -v -n
Флаги:
-L — list (показать)
-v — verbose (подробно)
-n — numeric (показывать IP вместо имён хостов, быстрее)
Вывод:
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80
Chain FORWARD (policy ACCEPT)
...
Chain OUTPUT (policy ACCEPT)
...
Список с номерами строк (для удаления):
sudo iptables -L -v -n --line-numbers
Просмотреть таблицу NAT:
sudo iptables -t nat -L -v -n
Просмотреть таблицу mangle:
sudo iptables -t mangle -L -v -n
Добавление правил в iptables
Синтаксис:
sudo iptables -A CHAIN -p PROTOCOL --dport PORT -j ACTION
где:
-A CHAIN — добавить в цепь (INPUT, OUTPUT, FORWARD)
-p PROTOCOL — протокол (tcp, udp, icmp)
--dport PORT — дестинационный порт (куда идёт пакет)
-j ACTION — действие (ACCEPT, DROP, REJECT)
Разрешить входящий SSH (порт 22):
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
Разрешить входящий HTTP (порт 80):
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
Запретить входящий telnet (порт 23):
sudo iptables -A INPUT -p tcp --dport 23 -j DROP
Разрешить входящий трафик только с конкретного IP:
sudo iptables -A INPUT -p tcp -s 192.168.1.100 --dport 22 -j ACCEPT
флаг -s — source (источник)
Разрешить входящий трафик из подсети:
sudo iptables -A INPUT -p tcp -s 192.168.1.0/24 --dport 22 -j ACCEPT
Разрешить исходящий DNS (используется везде для преводл URL в IP):
sudo iptables -A OUTPUT -p udp --dport 53 -j ACCEPT
Разрешить ответные пакеты для уже установленных соединений:
sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
флаг -m conntrack — модуль отслеживания соединений
--ctstate ESTABLISHED,RELATED — пакеты из установленного соединения или связанные с ним
Это критичное правило для stateful firewall!
Практическое правило: начальная безопасная конфигурация
# Разрешить loopback (сам с собой)
sudo iptables -A INPUT -i lo -j ACCEPT
sudo iptables -A OUTPUT -o lo -j ACCEPT
# Разрешить ответные пакеты установленных соединений
sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
sudo iptables -A OUTPUT -m conntrack --ctstate ESTABLISHED,RELATED -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
# Разрешить DNS (и входящий, и исходящий)
sudo iptables -A OUTPUT -p udp --dport 53 -j ACCEPT
sudo iptables -A INPUT -p udp --sport 53 -j ACCEPT
# Заблокировать всё остальное (по умолчанию)
sudo iptables -P INPUT DROP
sudo iptables -P FORWARD DROP
sudo iptables -P OUTPUT ACCEPT
Последние три строки — политики по умолчанию. -P — set policy.
Вставка и удаление правил в iptables
Вставить в начало цепи (проверится первым):
sudo iptables -I INPUT 1 -p tcp --dport 22 -j ACCEPT
флаг -I вместо -A; 1 — позиция
Удалить правило по номеру:
sudo iptables -L -v -n --line-numbers # сначала смотрим номера
sudo iptables -D INPUT 3 # удаляем 3-е правило из INPUT
флаг -D — delete
Удалить правило по полной спецификации:
sudo iptables -D INPUT -p tcp --dport 22 -j ACCEPT
Сохранение iptables-правил
Важно! Правила iptables хранятся в памяти. При перезагрузке они теряются!
Сохранить текущие правила:
sudo iptables-save > /etc/iptables/rules.v4
Загрузить правила при загрузке (Ubuntu/Debian):
Установите пакет iptables-persistent:
sudo apt-get install iptables-persistent
Во время установки вас спросят, сохранять ли текущие правила. Выберите “Yes”.
Правила автоматически загружатся при загрузке.
Вручную загрузить правила:
sudo iptables-restore < /etc/iptables/rules.v4
UFW vs iptables — что выбрать?
Задача
UFW
iptables
Базовая фильтрация на сервере
Используй это
Слишком сложно
Простые правила для SSH, HTTP, HTTPS
Идеально
Много букв
Нужна максимальная гибкость
Ограничено
Полный контроль
Сложное преобразование адресов (NAT)
Нет
Да
Вы новичок
Начни с этого
Страшно
Вы опытный администратор
Можно
Предпочтительно
Практический совет: Начните с UFW. Если потребуется что-то специфичное — UFW позволяет добавлять кастомные iptables-правила параллельно.
Типичные ошибки и как их избежать
Ошибка 1: Включить firewall, забыв добавить SSH
sudo ufw enable # ОЙ! SSH не открыт!
# Теперь не сможете подключиться удалённо...
Решение: Всегда первым правилом добавляйте SSH:
sudo ufw allow 22
sudo ufw enable
Ошибка 2: Неправильный порядок правил
sudo ufw allow from 192.168.1.0/24 to any port 22
sudo ufw deny from 192.168.1.50 to any port 22
IP 192.168.1.50 будет разрешен (первое правило срабатывает).
Решение: Вставляйте более специфичные правила в начало:
sudo ufw insert 1 deny from 192.168.1.50 to any port 22
Ошибка 3: Забыть указать протокол
sudo ufw allow 22 # Разрешит ТАК И ДРУГОЙ, и UDP и TCP
Иногда нужен конкретный:
sudo ufw allow 22/tcp
Ошибка 4: Забыть о IPv6
UFW автоматически добавляет правила для IPv6 (v6), но если отключите IPv6 в системе, сообщите UFW:
sudo nano /etc/default/ufw
# Найдите строку IPV6=yes, измените на no
sudo ufw reload
Полезные команды
Проверить, какие приложения слушают какие порты:
sudo netstat -tlnp
# или более современно:
sudo ss -tlnp
Вывод покажет:
LISTEN 0 128 0.0.0.0:22 0.0.0.0:* users:(("sshd",pid=1234,fd=3))
LISTEN 0 128 0.0.0.0:80 0.0.0.0:* users:(("nginx",pid=5678,fd=4))
Проверить логи UFW:
sudo tail -50 /var/log/ufw.log
Проверить статус сервиса UFW:
sudo systemctl status ufw
Перезагрузить правила UFW (без перезагрузки):
sudo ufw reload
Итого: пошаговая инструкция для новичка
Шаг 1: Добавить SSH (ОБЯЗАТЕЛЬНО!)
sudo ufw allow 22/tcp comment "SSH"
Шаг 2: Включить firewall
sudo ufw enable
Шаг 3: Добавить остальные правила по мере надобности
sudo ufw allow 80/tcp comment "HTTP"
sudo ufw allow 443/tcp comment "HTTPS"
Шаг 4: Проверить статус
sudo ufw status verbose
Шаг 5: Просмотреть логи, если что-то работает неправильно
sudo tail -f /var/log/ufw.log
Шаг 6: Если что-то сломалось — отключить
sudo ufw disable
После разбора проблемы включить обратно.
Полезные источники для дальшейшего изучения
Официальная документация UFW: https://help.ubuntu.com/community/UFW
ArchWiki про iptables: https://wiki.archlinux.org/title/Iptables
man-страницы (в терминале): man ufw, man iptables