6.1.7 Работа с файрволами Linux

Банер

Файрволы являются неотъемлемой частью безопасности любой операционной системы, включая Linux. Они функционируют как барьер между Вашей системой и внешним миром, контролируя входящий и исходящий сетевой трафик в соответствии с заранее определенными правилами безопасности. В Linux существует несколько инструментов для управления файрволами, каждый из которых имеет свои особенности и сферы применения.

Настройка файрволов является критическим аспектом защиты серверов и рабочих станций Linux от несанкционированного доступа, различных типов атак и потенциальных уязвимостей. Правильно настроенный файрвол позволяет ограничить доступ к Вашей системе, разрешая только авторизованный трафик и блокируя все остальное.

В контексте Linux файрволы обычно работают на уровне ядра, влияя непосредственно на сетевой стек операционной системы. Это обеспечивает высокую эффективность и производительность при фильтрации сетевого трафика, что особенно важно для высоконагруженных серверов и систем с ограниченными ресурсами.

Важно: перед внесением любых изменений в настройки файрвола, всегда создавайте резервные копии текущей конфигурации. Неверная настройка может привести к потере доступа к системе, особенно это важно при удаленном администрировании.

Сравнительная характеристика файрволов Linux

IPTables

  • Преимущества: универсальный и гибкий, низкоуровневый доступ, высокая производительность
  • Недостатки: сложный синтаксис, сложное управление, отсутствие встроенных средств сохранения
  • Рекомендуется для: опытных администраторов, ситуаций, требующих детального контроля

UFW

  • Преимущества: простой синтаксис, легкий в использовании, интегрирован в Ubuntu/Debian
  • Недостатки: менее гибкий, чем IPTables, ограниченные возможности для сложных сценариев
  • Рекомендуется для: начинающих, простых конфигураций, рабочих станций

FirewallD

  • Преимущества: динамическое управление, зоны безопасности, простой синтаксис для сложных настроек
  • Недостатки: относительно новая система, менее документирована, чем IPTables
  • Рекомендуется для: современных систем RHEL/CentOS/Fedora/AlmaLinux/RockyLinux, серверов с различными требованиями безопасности

IPTables

IPTables является традиционным и универсальным инструментом для настройки файрвола в Linux, который непосредственно взаимодействует с функциями фильтрации пакетов ядра Linux (Netfilter).

Основные концепции IPTables

IPTables организует правила фильтрации в таблицы, цепочки и правила:

  • Таблицы: определяют тип обработки пакетов (filter, nat, mangle, raw, security)

    • filter: используется для фильтрации пакетов (разрешение или блокировка трафика)
    • nat: используется для трансляции сетевых адресов
    • mangle: позволяет изменять заголовки пакетов
    • raw: используется для настроек исключений из трекинга соединений
    • security: используется для правил сетевого контроля доступа (SELinux)
  • Цепочки: группы правил для определенного типа трафика

    • INPUT: контролирует пакеты, предназначенные для локальной системы
    • OUTPUT: контролирует пакеты, создаваемые локальной системой
    • FORWARD: контролирует пакеты, маршрутизируемые через систему
    • PREROUTING: для пакетов до принятия решения о маршрутизации
    • POSTROUTING: для пакетов после принятия решения о маршрутизации
  • Правила: конкретные условия и действия для пакетов

    • Действия (targets): ACCEPT, DROP, REJECT, LOG, RETURN и другие
    • Условия: протокол, IP-адрес, порт, состояние соединения и т.д.

Базовые команды IPTables

Таблица ключей для IPTables
Ключ Описание
-A (–append) Добавляет новое правило в конец указанной цепочки
-D (–delete) Удаляет правило из цепочки (по номеру или точному совпадению)
-I (–insert) Вставляет правило на указанную позицию в цепочке
-R (–replace) Заменяет правило на указанной позиции
-L (–list) Выводит все правила в указанной цепочке
-F (–flush) Удаляет все правила из указанной цепочки
-P (–policy) Устанавливает политику по умолчанию для цепочки
-N (–new-chain) Создает новую пользовательскую цепочку
-X (–delete-chain) Удаляет пустую пользовательскую цепочку
-t (–table) Указывает таблицу (filter, nat, mangle, raw, security)
-p (–protocol) Указывает протокол (tcp, udp, icmp, all)
-s (–source) Указывает адрес/подсеть источника
-d (–destination) Указывает адрес/подсеть назначения
-i (–in-interface) Указывает входящий сетевой интерфейс
-o (–out-interface) Указывает исходящий сетевой интерфейс
--dport Указывает порт назначения (используется с -p)
--sport Указывает порт источника (используется с -p)
-j (–jump) Указывает действие (ACCEPT, DROP, REJECT, LOG и т.д.)
-m (–match) Загружает расширение сопоставления (state, limit, conntrack и т.д.)
--line-numbers Показывает номера строк при выводе правил
--state Указывает состояние соединения (NEW, ESTABLISHED, RELATED, INVALID)
--ctstate Указывает состояние соединения для модуля conntrack
--limit Ограничивает скорость обработки пакетов
--limit-burst Указывает начальное значение счетчика для ограничения
--log-prefix Добавляет префикс к записям журнала
--icmp-type Указывает тип ICMP-сообщения
--to-port Указывает целевой порт для REDIRECT
--to-destination Указывает целевой адрес для DNAT

Просмотр текущих правил:

  1. sudo iptables -L -v -n

Отображение всех правил: rules

Просмотр правил с номерами строк:

  1. sudo iptables -L --line-numbers

Просмотр правил для конкретной таблицы:

  1. sudo iptables -t nat -L -v

Добавление правила: разрешение входящего SSH соединения:

  1. sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT

Добавление правила с ограничением IP-адреса:

  1. sudo iptables -A INPUT -p tcp --dport 22 -s 192.168.1.0/24 -j ACCEPT

Блокировка всех других входящих соединений:

  1. sudo iptables -A INPUT -j DROP

Добавление правила в начало цепочки:

  1. sudo iptables -I INPUT 1 -p tcp --dport 80 -j ACCEPT

Удаление правила по номеру:

  1. sudo iptables -D INPUT 3

Удаление правила по содержанию:

  1. sudo iptables -D INPUT -p tcp --dport 80 -j ACCEPT

Сохранение правил (Debian/Ubuntu):

  1. sudo netfilter-persistent save

Сохранение правил (CentOS/RHEL):

  1. sudo service iptables save

Пример базовой конфигурации

Очистка всех правил:

  1. sudo iptables -F

Установка политики по умолчанию:

  1. sudo iptables -P INPUT DROP
  2. sudo iptables -P FORWARD DROP
  3. sudo iptables -P OUTPUT ACCEPT

Разрешение локальных соединений:

  1. sudo iptables -A INPUT -i lo -j ACCEPT

Разрешение установленных соединений:

  1. sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

Разрешение SSH:

  1. sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT

Разрешение HTTP и HTTPS:

  1. sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
  2. sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT

Разрешение ICMP (ping):

  1. sudo iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT

Логирование и блокировка всех других соединений:

  1. sudo iptables -A INPUT -j LOG --log-prefix "IPTables-Dropped: "
  2. sudo iptables -A INPUT -j DROP

Расширенные возможности IPTables

Лимитирование количества новых соединений:

  1. sudo iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m limit --limit 3/minute --limit-burst 3 -j ACCEPT

Блокировка определенных IP-адресов:

  1. sudo iptables -A INPUT -s 10.0.0.5 -j DROP

Настройка переадресации портов:

  1. sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 8080

Настройка NAT для доступа внутренней сети к внешней:

  1. sudo iptables -t nat -A POSTROUTING -o eth0 -s 192.168.1.0/24 -j MASQUERADE

Важно: команды IPTables применяются мгновенно, но не сохраняются после перезагрузки без дополнительных действий. Используйте соответствующие инструменты для сохранения конфигурации в соответствии с Вашим дистрибутивом.

UFW (Uncomplicated Firewall)

UFW является надстройкой над IPTables, разработанной для упрощения управления файрволом. Он чаще всего используется в дистрибутивах на базе Ubuntu и Debian. UFW был создан с целью обеспечить легкий в использовании интерфейс, который скрывает сложности IPTables, сохраняя при этом его мощность.

Принцип работы UFW

UFW использует принцип правил разрешения/запрета для сервисов и портов. Вместо сложных команд IPTables, UFW позволяет использовать простые команды с ключевыми словами “allow”, “deny”, “reject” и другие. Это делает его идеальным для начинающих администраторов или для систем с несложными требованиями безопасности.

Правила UFW обрабатываются в порядке их добавления, с первого до последнего. Когда найдено соответствующее правило, обработка прекращается. Если ни одно правило не соответствует пакету, применяется политика по умолчанию.

Основные команды UFW

Таблица ключей для UFW
Ключ Описание
enable Активирует файрвол
disable Отключает файрвол
status Показывает текущее состояние файрвола
status verbose Показывает детальное состояние файрвола
status numbered Показывает правила с номерами
default Устанавливает политику по умолчанию (allow/deny)
allow Разрешает соединение (порт, сервис, адрес)
deny Блокирует соединение без уведомления
reject Блокирует соединение с уведомлением
delete Удаляет правило (по номеру или содержанию)
insert Вставляет правило на указанную позицию
route Управляет правилами пересылки пакетов
logging Управляет режимом логирования (on/off/low/medium/high/full)
app list Показывает список доступных профилей приложений
app info Показывает информацию о профиле приложения
from Указывает источник соединения (IP-адрес, сеть)
to Указывает назначение соединения
port Указывает порт или диапазон портов
proto Указывает протокол (tcp/udp)
on Указывает сетевой интерфейс
comment Добавляет комментарий к правилу

Установка UFW:

  1. sudo apt install ufw

Активация UFW:

  1. sudo ufw enable

Отключение UFW:

  1. sudo ufw disable

Проверка статуса:

  1. sudo ufw status verbose

Результат проверки статуса: статус

Настройка политик по умолчанию:

  1. sudo ufw default deny incoming
  2. sudo ufw default allow outgoing

Разрешение сервиса по названию:

  1. sudo ufw allow ssh

Разрешение порта по номеру:

  1. sudo ufw allow 80/tcp

Разрешение диапазона портов:

  1. sudo ufw allow 6000:6007/tcp

Блокировка порта:

  1. sudo ufw deny 23/tcp

Отклонение запросов с сообщением:

  1. sudo ufw reject 80/tcp

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

  1. sudo ufw delete allow 80/tcp

Разрешение доступа для конкретного приложения из профилей:

  1. sudo ufw app list
  2. sudo ufw allow 'Nginx Full'

Использование числовых порядковых номеров

Просмотр правил с номерами:

  1. sudo ufw status numbered

При вводе команды Вы увидите список правил и их номера: Правила

Удаление правила по номеру:

  1. sudo ufw delete 2

Определение дополнительных параметров

Разрешение доступа с определенного IP-адреса:

  1. sudo ufw allow from 192.168.1.100

Разрешение доступа к определенному порту с определенного IP-адреса:

  1. sudo ufw allow from 192.168.1.100 to any port 22

Разрешение доступа с определенной подсети:

  1. sudo ufw allow from 192.168.1.0/24

Разрешение доступа с определенной подсети к определенному порту:

  1. sudo ufw allow from 192.168.1.0/24 to any port 3306

Разрешение доступа через определенный интерфейс:

  1. sudo ufw allow in on eth1 to any port 80

Настройка переадресации портов (требует дополнительных настроек):

  1. sudo ufw route allow proto tcp from any to any port 80

Включение логирования:

  1. sudo ufw logging on
  2. sudo ufw logging medium

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

FirewallD

FirewallD — это современный фреймворк управления файрволом, который является стандартным для дистрибутивов на базе Red Hat (RHEL, CentOS, AlmaLinux, RockyLinux). Он использует концепцию зон и сервисов для упрощения управления.

Основные концепции FirewallD:
  • Зоны: предварительно определенные наборы правил для различных уровней доверия

    • public: для зон без доверия, публичных сетей
    • home: для домашних сетей, большинство компьютеров в сети заслуживают доверия
    • work: для рабочих сетей, большинство компьютеров доверены
    • trusted: все соединения принимаются
    • dmz: для компьютеров в демилитаризованной зоне
    • external: для использования в маршрутизаторах с NAT
    • internal: для внутренней стороны шлюза
    • block: отклоняет все входящие соединения
    • drop: отбрасывает все входящие соединения без сообщений
  • Сервисы: определения для стандартных программ (http, ssh, ftp и т.д.)

    • Каждый сервис содержит информацию о портах, протоколах и модулях
    • Позволяет использовать понятные названия вместо номеров портов
  • Постоянные и временные правила:

    • Временные: действуют до перезагрузки или перезапуска службы
    • Постоянные: сохраняются после перезагрузки (опция --permanent)

Зоны являются центральным понятием в FirewallD и представляют различные уровни доверия для сетевых соединений. Каждую зону можно настроить с помощью собственного набора правил брандмауэра, а сетевые интерфейсы можно назначить определенным зонам в соответствии с их потребностями в безопасности. Это позволяет легко управлять различными сетевыми средами с одной системы.

Базовое управление FirewallD

Прежде чем начать настройку правил брандмауэра, важно уметь проверять текущее состояние системы и осуществлять базовое управление FirewallD. Это позволяет администратору понимать имеющуюся конфигурацию и эффективно вносить изменения.

Таблица ключей для FirewallD
Ключ Описание
--state Показывает состояние службы FirewallD
--reload Перезагружает конфигурацию
--complete-reload Полная перезагрузка, включая все модули
--runtime-to-permanent Сохраняет текущие временные правила как постоянные
--permanent Обозначает изменение как постоянное (сохраняется после перезагрузки)
--get-default-zone Показывает зону по умолчанию
--set-default-zone Устанавливает зону по умолчанию
--get-zones Выводит список всех доступных зон
--get-active-zones Выводит активные зоны с привязанными интерфейсами
--zone Указывает зону для операции
--list-all Выводит все параметры указанной зоны
--list-all-zones Выводит параметры всех зон
--new-zone Создает новую зону
--get-services Выводит список всех доступных сервисов
--get-icmptypes Выводит список всех доступных типов ICMP
--add-service Добавляет сервис в зону
--remove-service Удаляет сервис из зоны
--add-port Добавляет порт в зону
--remove-port Удаляет порт из зоны
--add-protocol Добавляет протокол в зону
--remove-protocol Удаляет протокол из зоны
--add-interface Привязывает интерфейс к зоне
--remove-interface Удаляет интерфейс из зоны
--add-source Добавляет источник (IP/сеть) в зону
--remove-source Удаляет источник (IP/сеть) из зоны
--add-masquerade Включает маскарадинг (NAT) для зоны
--remove-masquerade Выключает маскарадинг для зоны
--add-forward-port Добавляет правило пересылки портов
--remove-forward-port Удаляет правило пересылки портов
--add-rich-rule Добавляет расширенное правило в зону
--remove-rich-rule Удаляет расширенное правило из зоны
--query-masquerade Проверяет состояние маскарадинга для зоны
--new-service Создает новый сервис
--service Указывает сервис для конфигурации
--set-description Устанавливает описание для сервиса/зоны
--add-port-to-service Добавляет порт к сервису
--info-service Показывает информацию о сервисе
--timeout Устанавливает временное правило на указанный период

Проверить, запущена ли служба FirewallD:

  1. sudo firewall-cmd --state

Если служба запущена, Вы увидите надпись running: running

Проверить версию FirewallD:

  1. sudo firewall-cmd --version

Получить список всех доступных зон в системе:

  1. sudo firewall-cmd --get-zones

Просмотреть активные зоны вместе с привязанными интерфейсами:

  1. sudo firewall-cmd --get-active-zones

Детально исследовать настройки конкретной зоны:

  1. sudo firewall-cmd --zone=public --list-all

Для полного аудита системы можно просмотреть все зоны вместе с их настройками:

  1. sudo firewall-cmd --list-all-zones

Просмотр всех зон с настройками: Всі зони

Управление сервисами и портами. FirewallD использует концепцию “сервисов” для удобного управления доступом к стандартным программам. Просмотр доступных сервисов:

  1. sudo firewall-cmd --get-services

Проверить, какие сервисы разрешены в конкретной зоне:

  1. sudo firewall-cmd --zone=public --list-services

Добавить разрешение для сервиса на постоянной основе:

  1. sudo firewall-cmd --zone=public --add-service=http --permanent

Для временного тестирования можно добавить сервис без параметра --permanent:

  1. sudo firewall-cmd --zone=public --add-service=https

Удалить разрешение для сервиса:

  1. sudo firewall-cmd --zone=public --remove-service=http --permanent

Для нестандартных программ можно разрешить доступ по номеру порта:

  1. sudo firewall-cmd --zone=public --add-port=8080/tcp --permanent

Удалить разрешение для порта:

  1. sudo firewall-cmd --zone=public --remove-port=8080/tcp --permanent

После внесения изменений необходимо применить их:

  1. sudo firewall-cmd --reload

Расширенные настройки и управление зонами

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

Настройка зон и интерфейсов. Установить зону по умолчанию для всех новых подключений:

  1. sudo firewall-cmd --set-default-zone=home

Привязать сетевой интерфейс к конкретной зоне:

  1. sudo firewall-cmd --zone=trusted --add-interface=eth0 --permanent

Удалить интерфейс из зоны:

  1. sudo firewall-cmd --zone=trusted --remove-interface=eth0 --permanent

Узнать, к какой зоне принадлежит интерфейс:

  1. sudo firewall-cmd --get-zone-of-interface=eth0

Для специфических потребностей можно создать собственную зону:

  1. sudo firewall-cmd --permanent --new-zone=myzone
  2. sudo firewall-cmd --reload

Настройка сервисов и расширенных правил. Получить детальную информацию о сервисе:

  1. sudo firewall-cmd --info-service=http

Создать собственный сервис для нестандартной программы:

  1. sudo firewall-cmd --permanent --new-service=myservice
  2. sudo firewall-cmd --permanent --service=myservice --set-description="My Custom Service"
  3. sudo firewall-cmd --permanent --service=myservice --add-port=12345/tcp
  4. sudo firewall-cmd --reload

Для более сложных сценариев сетевого взаимодействия FirewallD поддерживает маскарадинг (NAT) и пересылку портов:

  1. sudo firewall-cmd --zone=external --add-masquerade --permanent

Проверить состояние маскарадинга для зоны:

  1. sudo firewall-cmd --zone=external --query-masquerade

Настроить переадресацию портов в рамках одного сервера:

  1. sudo firewall-cmd --zone=public --add-forward-port=port=80:proto=tcp:toport=8080 --permanent

Переадресовать трафик на другой хост:

  1. sudo firewall-cmd --zone=public --add-forward-port=port=80:proto=tcp:toport=8080:toaddr=192.168.1.10 --permanent

Расширенные правила и безопасность

Для реализации сложных политик сетевой безопасности FirewallD поддерживает так называемые “rich-правила”, которые предоставляют максимальную гибкость при настройке.

Добавить правило для разрешения HTTP-доступа с конкретного IP-адреса:

  1. sudo firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.1.10" service name="http" accept' --permanent

Заблокировать доступ с определенного IP-адреса:

  1. sudo firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.1.10" reject' --permanent

Ограничить количество входящих соединений для повышения безопасности:

  1. sudo firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" service name="http" accept limit value="5/m"' --permanent

Важно: правила FirewallD, добавленные без параметра --permanent, будут потеряны после перезагрузки системы или службы. Всегда используйте --permanent для постоянных изменений и выполняйте --reload для применения изменений.

Вывод

Файрволы Linux предоставляют удобные инструменты для защиты Ваших систем от несанкционированного доступа и сетевых атак. Выбор конкретного инструмента зависит от Ваших потребностей, уровня опыта и используемого дистрибутива Linux.

IPTables остается лучшим низкоуровневым инструментом для опытных администраторов, UFW предлагает упрощенный интерфейс для базовых потребностей, а FirewallD обеспечивает баланс между простотой и функциональностью с поддержкой динамического управления.

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

Лучшие практики безопасности:
  1. Принцип наименьших привилегий: разрешайте только необходимый трафик и блокируйте все остальное.
  2. Регулярные аудиты: периодически проверяйте правила файрвола на соответствие текущим требованиям безопасности.
  3. Документирование изменений: ведите журнал всех изменений в конфигурации файрвола.
  4. Резервное копирование: всегда создавайте резервные копии конфигурации перед внесением изменений.
  5. Тестирование: проверяйте изменения в тестовой среде перед применением на продуктивных системах. Никогда не полагайтесь исключительно на файрвол для безопасности Вашей системы. Файрвол является лишь одним из компонентов комплексной стратегии безопасности, которая должна включать также своевременные обновления, правильное управление пользователями и разрешениями, мониторинг системы и другие меры безопасности.