Гайд для новичков: Firewall (ufw, iptables) — правила, порты, фильтрация трафика
-
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 sshUFW знает имена популярных сервисов (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 Anywhereiptables — мощь и сложность
Если 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.v4UFW vs iptables — что выбрать?
Задача UFW iptables Базовая фильтрация на сервере
Используй это
Слишком сложноПростые правила для SSH, HTTP, HTTPS
Идеально
Много буквНужна максимальная гибкость
Ограничено
Полный контрольСложное преобразование адресов (NAT)
Нет
ДаВы новичок
Начни с этого
СтрашноВы опытный администратор
Можно
ПредпочтительноПрактический совет: Начните с UFW. Если потребуется что-то специфичное — UFW позволяет добавлять кастомные iptables-правила параллельно.
Типичные ошибки и как их избежать
Ошибка 1: Включить firewall, забыв добавить SSHsudo 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 22IP 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: Забыть о IPv6UFW автоматически добавляет правила для 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
© 2024 - 2025 ExLends, Inc. Все права защищены.