Перейти к содержанию
  • Лента
  • Категории
  • Последние
  • Метки
  • Популярные
  • Пользователи
  • Группы
Свернуть
exlends
Категории
  1. Главная
  2. Категории
  3. Операционные системы
  4. Linux
  5. Гайд для новичков: Firewall (ufw, iptables) — правила, порты, фильтрация трафика

Гайд для новичков: Firewall (ufw, iptables) — правила, порты, фильтрация трафика

Запланировано Прикреплена Закрыта Перенесена Linux
1 Сообщения 1 Постеры 7 Просмотры
  • Сначала старые
  • Сначала новые
  • По количеству голосов
Ответить
  • Ответить, создав новую тему
Авторизуйтесь, чтобы ответить
Эта тема была удалена. Только пользователи с правом управления темами могут её видеть.
  • MugiwaraM Не в сети
    MugiwaraM Не в сети
    Mugiwara
    написал отредактировано
    #1

    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
    1 ответ Последний ответ
    1

    Категории

    • Главная
    • Новости
    • Фронтенд
    • Бекенд
    • Языки программирования

    Контакты

    • Сотрудничество
    • info@exlends.com
    • Наш чат
    • Наш ТГ канал

    © 2024 - 2025 ExLends, Inc. Все права защищены.

    Политика конфиденциальности
    • Войти

    • Нет учётной записи? Зарегистрироваться

    • Войдите или зарегистрируйтесь для поиска.
    • Первое сообщение
      Последнее сообщение
    0
    • Лента
    • Категории
    • Последние
    • Метки
    • Популярные
    • Пользователи
    • Группы