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 |
Просмотр текущих правил:
- sudo iptables -L -v -n
Отображение всех правил:
Просмотр правил с номерами строк:
- sudo iptables -L --line-numbers
Просмотр правил для конкретной таблицы:
- sudo iptables -t nat -L -v
Добавление правила: разрешение входящего SSH соединения:
- sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
Добавление правила с ограничением IP-адреса:
- sudo iptables -A INPUT -p tcp --dport 22 -s 192.168.1.0/24 -j ACCEPT
Блокировка всех других входящих соединений:
- sudo iptables -A INPUT -j DROP
Добавление правила в начало цепочки:
- sudo iptables -I INPUT 1 -p tcp --dport 80 -j ACCEPT
Удаление правила по номеру:
- sudo iptables -D INPUT 3
Удаление правила по содержанию:
- sudo iptables -D INPUT -p tcp --dport 80 -j ACCEPT
Сохранение правил (Debian/Ubuntu):
- sudo netfilter-persistent save
Сохранение правил (CentOS/RHEL):
- sudo service iptables save
Пример базовой конфигурации
Очистка всех правил:
- sudo iptables -F
Установка политики по умолчанию:
- sudo iptables -P INPUT DROP
- sudo iptables -P FORWARD DROP
- sudo iptables -P OUTPUT ACCEPT
Разрешение локальных соединений:
- sudo iptables -A INPUT -i lo -j ACCEPT
Разрешение установленных соединений:
- sudo iptables -A INPUT -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
Разрешение ICMP (ping):
- sudo iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
Логирование и блокировка всех других соединений:
- sudo iptables -A INPUT -j LOG --log-prefix "IPTables-Dropped: "
- sudo iptables -A INPUT -j DROP
Расширенные возможности IPTables
Лимитирование количества новых соединений:
- sudo iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m limit --limit 3/minute --limit-burst 3 -j ACCEPT
Блокировка определенных IP-адресов:
- sudo iptables -A INPUT -s 10.0.0.5 -j DROP
Настройка переадресации портов:
- sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 8080
Настройка NAT для доступа внутренней сети к внешней:
- 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:
- sudo apt install ufw
Активация UFW:
- sudo ufw enable
Отключение UFW:
- sudo ufw disable
Проверка статуса:
- sudo ufw status verbose
Результат проверки статуса:
Настройка политик по умолчанию:
- sudo ufw default deny incoming
- sudo ufw default allow outgoing
Разрешение сервиса по названию:
- sudo ufw allow ssh
Разрешение порта по номеру:
- sudo ufw allow 80/tcp
Разрешение диапазона портов:
- sudo ufw allow 6000:6007/tcp
Блокировка порта:
- sudo ufw deny 23/tcp
Отклонение запросов с сообщением:
- sudo ufw reject 80/tcp
Удаление правила:
- sudo ufw delete allow 80/tcp
Разрешение доступа для конкретного приложения из профилей:
- sudo ufw app list
- sudo ufw allow 'Nginx Full'
Использование числовых порядковых номеров
Просмотр правил с номерами:
- sudo ufw status numbered
При вводе команды Вы увидите список правил и их номера:
Удаление правила по номеру:
- sudo ufw delete 2
Определение дополнительных параметров
Разрешение доступа с определенного IP-адреса:
- sudo ufw allow from 192.168.1.100
Разрешение доступа к определенному порту с определенного IP-адреса:
- sudo ufw allow from 192.168.1.100 to any port 22
Разрешение доступа с определенной подсети:
- sudo ufw allow from 192.168.1.0/24
Разрешение доступа с определенной подсети к определенному порту:
- sudo ufw allow from 192.168.1.0/24 to any port 3306
Разрешение доступа через определенный интерфейс:
- sudo ufw allow in on eth1 to any port 80
Настройка переадресации портов (требует дополнительных настроек):
- sudo ufw route allow proto tcp from any to any port 80
Включение логирования:
- sudo ufw logging on
- 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:
- sudo firewall-cmd --state
Если служба запущена, Вы увидите надпись running
:
Проверить версию FirewallD:
- sudo firewall-cmd --version
Получить список всех доступных зон в системе:
- sudo firewall-cmd --get-zones
Просмотреть активные зоны вместе с привязанными интерфейсами:
- sudo firewall-cmd --get-active-zones
Детально исследовать настройки конкретной зоны:
- sudo firewall-cmd --zone=public --list-all
Для полного аудита системы можно просмотреть все зоны вместе с их настройками:
- sudo firewall-cmd --list-all-zones
Просмотр всех зон с настройками:
Управление сервисами и портами. FirewallD использует концепцию “сервисов” для удобного управления доступом к стандартным программам. Просмотр доступных сервисов:
- sudo firewall-cmd --get-services
Проверить, какие сервисы разрешены в конкретной зоне:
- sudo firewall-cmd --zone=public --list-services
Добавить разрешение для сервиса на постоянной основе:
- sudo firewall-cmd --zone=public --add-service=http --permanent
Для временного тестирования можно добавить сервис без параметра --permanent
:
- sudo firewall-cmd --zone=public --add-service=https
Удалить разрешение для сервиса:
- sudo firewall-cmd --zone=public --remove-service=http --permanent
Для нестандартных программ можно разрешить доступ по номеру порта:
- sudo firewall-cmd --zone=public --add-port=8080/tcp --permanent
Удалить разрешение для порта:
- sudo firewall-cmd --zone=public --remove-port=8080/tcp --permanent
После внесения изменений необходимо применить их:
- sudo firewall-cmd --reload
Расширенные настройки и управление зонами
FirewallD предоставляет гибкие возможности для конфигурации сетевой безопасности, позволяя создавать сложные правила для различных сетевых сред.
Настройка зон и интерфейсов. Установить зону по умолчанию для всех новых подключений:
- sudo firewall-cmd --set-default-zone=home
Привязать сетевой интерфейс к конкретной зоне:
- sudo firewall-cmd --zone=trusted --add-interface=eth0 --permanent
Удалить интерфейс из зоны:
- sudo firewall-cmd --zone=trusted --remove-interface=eth0 --permanent
Узнать, к какой зоне принадлежит интерфейс:
- sudo firewall-cmd --get-zone-of-interface=eth0
Для специфических потребностей можно создать собственную зону:
- sudo firewall-cmd --permanent --new-zone=myzone
- sudo firewall-cmd --reload
Настройка сервисов и расширенных правил. Получить детальную информацию о сервисе:
- sudo firewall-cmd --info-service=http
Создать собственный сервис для нестандартной программы:
- sudo firewall-cmd --permanent --new-service=myservice
- sudo firewall-cmd --permanent --service=myservice --set-description="My Custom Service"
- sudo firewall-cmd --permanent --service=myservice --add-port=12345/tcp
- sudo firewall-cmd --reload
Для более сложных сценариев сетевого взаимодействия FirewallD поддерживает маскарадинг (NAT) и пересылку портов:
- sudo firewall-cmd --zone=external --add-masquerade --permanent
Проверить состояние маскарадинга для зоны:
- sudo firewall-cmd --zone=external --query-masquerade
Настроить переадресацию портов в рамках одного сервера:
- sudo firewall-cmd --zone=public --add-forward-port=port=80:proto=tcp:toport=8080 --permanent
Переадресовать трафик на другой хост:
- sudo firewall-cmd --zone=public --add-forward-port=port=80:proto=tcp:toport=8080:toaddr=192.168.1.10 --permanent
Расширенные правила и безопасность
Для реализации сложных политик сетевой безопасности FirewallD поддерживает так называемые “rich-правила”, которые предоставляют максимальную гибкость при настройке.
Добавить правило для разрешения HTTP-доступа с конкретного IP-адреса:
- sudo firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.1.10" service name="http" accept' --permanent
Заблокировать доступ с определенного IP-адреса:
- sudo firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.1.10" reject' --permanent
Ограничить количество входящих соединений для повышения безопасности:
- 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 обеспечивает баланс между простотой и функциональностью с поддержкой динамического управления.
Независимо от выбранного инструмента, важно соблюдать лучшие практики безопасности и регулярно обновлять конфигурацию файрвола в соответствии с меняющимися требованиями безопасности и потребностями Вашей инфраструктуры.
Лучшие практики безопасности:
- Принцип наименьших привилегий: разрешайте только необходимый трафик и блокируйте все остальное.
- Регулярные аудиты: периодически проверяйте правила файрвола на соответствие текущим требованиям безопасности.
- Документирование изменений: ведите журнал всех изменений в конфигурации файрвола.
- Резервное копирование: всегда создавайте резервные копии конфигурации перед внесением изменений.
- Тестирование: проверяйте изменения в тестовой среде перед применением на продуктивных системах. Никогда не полагайтесь исключительно на файрвол для безопасности Вашей системы. Файрвол является лишь одним из компонентов комплексной стратегии безопасности, которая должна включать также своевременные обновления, правильное управление пользователями и разрешениями, мониторинг системы и другие меры безопасности.