Home » Настройка фаервола с помощью Firewalld на последний CentOS
Настройка фаервола с помощью Firewalld на последний CentOS

Настройка фаервола с помощью Firewalld на последний CentOS

Если ты админ сервера на CentOS, то рано или поздно тебе точно придется настраивать firewall. И если раньше все крутилось вокруг iptables, то теперь на современных дистрибутивах по умолчанию стоит firewalld — более дружелюбная и гибкая система управления фаерволом. В этой статье разберем, как правильно настроить firewalld на последнем CentOS, не наступив на те же грабли, что и тысячи админов до нас.

Firewalld — это не замена iptables, а скорее его обертка с человеческим интерфейсом. Он работает с концепцией зон (zones) и предоставляет как CLI, так и D-Bus API для управления правилами. Главное преимущество — можно менять правила на лету без перезагрузки всего firewall’а. Плюс есть понятие временных и постоянных правил, что очень удобно для тестирования.

Как работает firewalld: архитектура и принципы

Firewalld построен на концепции зон безопасности. Каждая зона определяет уровень доверия к сетевым соединениям. Сетевые интерфейсы назначаются в зоны, а зоны содержат правила для портов, сервисов и протоколов.

Основные зоны по умолчанию:

  • drop — все входящие пакеты отбрасываются без уведомления
  • block — все входящие отклоняются с icmp-host-prohibited
  • public — для недоверенных сетей (интернет)
  • external — для роутеров с включенным NAT
  • internal — для внутренних сетей
  • dmz — для DMZ-серверов
  • work — для рабочих сетей
  • home — для домашних сетей
  • trusted — весь трафик разрешен

Установка и первичная настройка

На современных версиях CentOS firewalld уже установлен по умолчанию. Но если вдруг нет:

# Установка firewalld
sudo dnf install firewalld

# Включение и запуск
sudo systemctl enable firewalld
sudo systemctl start firewalld

# Проверка статуса
sudo systemctl status firewalld

Важный момент: если у вас уже настроен iptables, то перед включением firewalld лучше сохранить текущие правила и отключить iptables сервис:

# Сохранение текущих правил iptables
sudo iptables-save > /root/iptables-backup.rules

# Отключение iptables (если используется)
sudo systemctl stop iptables
sudo systemctl disable iptables

Основные команды для работы с firewalld

Разберем основные команды, которые понадобятся в повседневной работе:

# Посмотреть состояние firewalld
sudo firewall-cmd --state

# Посмотреть все зоны
sudo firewall-cmd --get-zones

# Посмотреть активные зоны
sudo firewall-cmd --get-active-zones

# Посмотреть зону по умолчанию
sudo firewall-cmd --get-default-zone

# Посмотреть правила для зоны
sudo firewall-cmd --zone=public --list-all

# Посмотреть все правила для всех зон
sudo firewall-cmd --list-all-zones

Настройка зон и интерфейсов

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

# Посмотреть интерфейсы
ip link show

# Посмотреть в какой зоне находится интерфейс
sudo firewall-cmd --get-zone-of-interface=eth0

# Назначить интерфейс в зону (временно)
sudo firewall-cmd --zone=public --change-interface=eth0

# Назначить интерфейс в зону (постоянно)
sudo firewall-cmd --permanent --zone=public --change-interface=eth0

# Установить зону по умолчанию
sudo firewall-cmd --set-default-zone=public

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

Firewalld работает с предопределенными сервисами, что очень удобно. Вместо запоминания портов можно использовать имена сервисов:

# Посмотреть все доступные сервисы
sudo firewall-cmd --get-services

# Посмотреть какие сервисы разрешены в зоне
sudo firewall-cmd --zone=public --list-services

# Добавить сервис (временно)
sudo firewall-cmd --zone=public --add-service=http

# Добавить сервис (постоянно)
sudo firewall-cmd --permanent --zone=public --add-service=http

# Убрать сервис
sudo firewall-cmd --permanent --zone=public --remove-service=http

# Работа с портами напрямую
sudo firewall-cmd --permanent --zone=public --add-port=8080/tcp
sudo firewall-cmd --permanent --zone=public --add-port=1000-2000/udp

# Убрать порт
sudo firewall-cmd --permanent --zone=public --remove-port=8080/tcp

Практические примеры настройки

Рассмотрим несколько типовых сценариев настройки firewalld:

Веб-сервер с базой данных

# Разрешаем HTTP, HTTPS и SSH
sudo firewall-cmd --permanent --zone=public --add-service=http
sudo firewall-cmd --permanent --zone=public --add-service=https
sudo firewall-cmd --permanent --zone=public --add-service=ssh

# Разрешаем подключение к MySQL только с определенного IP
sudo firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.1.100" service name="mysql" accept'

# Перезагружаем конфигурацию
sudo firewall-cmd --reload

Сервер с нестандартным SSH портом

# Убираем стандартный SSH
sudo firewall-cmd --permanent --zone=public --remove-service=ssh

# Добавляем нестандартный порт для SSH
sudo firewall-cmd --permanent --zone=public --add-port=2222/tcp

# Можно также создать кастомный сервис
sudo firewall-cmd --permanent --new-service=ssh-custom
sudo firewall-cmd --permanent --service=ssh-custom --set-description="SSH on custom port"
sudo firewall-cmd --permanent --service=ssh-custom --add-port=2222/tcp
sudo firewall-cmd --permanent --zone=public --add-service=ssh-custom

sudo firewall-cmd --reload

Продвинутые возможности: Rich Rules

Rich Rules — это мощный инструмент для создания сложных правил. С их помощью можно настроить детальное управление трафиком:

# Заблокировать IP адрес
sudo firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.1.100" reject'

# Разрешить доступ к порту только с определенной подсети
sudo firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="10.0.0.0/24" port protocol="tcp" port="3306" accept'

# Ограничить количество подключений (защита от DDoS)
sudo firewall-cmd --permanent --zone=public --add-rich-rule='rule service name="ssh" accept limit value="3/m"'

# Логирование попыток подключения
sudo firewall-cmd --permanent --zone=public --add-rich-rule='rule service name="ssh" log prefix="SSH-LOG: " level="info" limit value="3/m" accept'

# Перенаправление портов
sudo firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" forward-port port="80" protocol="tcp" to-port="8080"'

Работа с IP-сетами и блокировка

Для массовой блокировки IP-адресов удобно использовать IP-сеты:

# Создать IP-сет
sudo firewall-cmd --permanent --new-ipset=blacklist --type=hash:ip

# Добавить IP в сет
sudo firewall-cmd --permanent --ipset=blacklist --add-entry=192.168.1.100
sudo firewall-cmd --permanent --ipset=blacklist --add-entry=10.0.0.0/24

# Заблокировать весь IP-сет
sudo firewall-cmd --permanent --zone=public --add-rich-rule='rule source ipset="blacklist" reject'

sudo firewall-cmd --reload

Мониторинг и отладка

Для отладки firewalld очень полезно включить логирование:

# Включить логирование отброшенных пакетов
sudo firewall-cmd --set-log-denied=all

# Посмотреть логи
sudo journalctl -u firewalld -f

# Или в системном логе
sudo tail -f /var/log/messages | grep -i firewall

Для анализа трафика можно использовать статистику iptables:

# Посмотреть статистику по правилам
sudo iptables -L -n -v

# Посмотреть правила INPUT цепочки
sudo iptables -L INPUT -n -v --line-numbers

Автоматизация и скрипты

Firewalld отлично подходит для автоматизации. Вот пример bash-скрипта для настройки типового веб-сервера:

#!/bin/bash

# Скрипт настройки firewalld для веб-сервера

# Проверяем, запущен ли firewalld
if ! systemctl is-active --quiet firewalld; then
    echo "Starting firewalld..."
    systemctl start firewalld
    systemctl enable firewalld
fi

# Основные сервисы
services=("http" "https" "ssh")

for service in "${services[@]}"; do
    echo "Adding service: $service"
    firewall-cmd --permanent --zone=public --add-service=$service
done

# Кастомные порты (например, для API)
ports=("8080/tcp" "3000/tcp")

for port in "${ports[@]}"; do
    echo "Adding port: $port"
    firewall-cmd --permanent --zone=public --add-port=$port
done

# Ограничение SSH подключений
echo "Adding SSH rate limiting..."
firewall-cmd --permanent --zone=public --add-rich-rule='rule service name="ssh" accept limit value="5/m"'

# Применяем изменения
firewall-cmd --reload

echo "Firewall configuration completed!"
echo "Active rules:"
firewall-cmd --zone=public --list-all

Сравнение с другими решениями

Особенность firewalld iptables ufw
Простота использования Высокая Низкая Очень высокая
Гибкость настройки Высокая Очень высокая Средняя
Изменения без перезагрузки Да Нет Да
D-Bus API Да Нет Нет
Зоны безопасности Да Нет Нет
Совместимость с NetworkManager Отличная Нет Средняя

Часто встречающиеся ошибки и их решения

Проблема: После настройки firewalld потерял доступ к серверу по SSH.

Решение: Всегда проверяйте, что SSH разрешен перед применением правил:

# Проверить SSH перед изменениями
sudo firewall-cmd --zone=public --query-service=ssh

# Если нет, добавить
sudo firewall-cmd --permanent --zone=public --add-service=ssh
sudo firewall-cmd --reload

Проблема: Правила не применяются после перезагрузки.

Решение: Не забывайте использовать флаг --permanent и делать --reload:

# Неправильно (временное правило)
sudo firewall-cmd --zone=public --add-service=http

# Правильно (постоянное правило)
sudo firewall-cmd --permanent --zone=public --add-service=http
sudo firewall-cmd --reload

Интеграция с другими инструментами

Firewalld отлично интегрируется с современными инструментами:

  • Ansible: Модуль firewalld для автоматизации
  • Docker: Может работать совместно с Docker (но есть нюансы)
  • Kubernetes: Используется в качестве CNI плагина
  • NetworkManager: Автоматическое переключение зон

Пример Ansible playbook:

---
- name: Configure firewalld
  hosts: webservers
  become: yes
  tasks:
    - name: Start and enable firewalld
      systemd:
        name: firewalld
        state: started
        enabled: yes

    - name: Open ports for web services
      firewalld:
        service: "{{ item }}"
        permanent: yes
        state: enabled
        immediate: yes
      loop:
        - http
        - https
        - ssh

Оптимизация производительности

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

# Отключить ненужные сервисы firewalld
sudo systemctl mask firewalld

# Использовать прямые правила iptables для критичных сервисов
sudo firewall-cmd --permanent --direct --add-rule ipv4 filter INPUT 0 -p tcp --dport 80 -j ACCEPT

# Настроить connection tracking
echo 'net.netfilter.nf_conntrack_max = 1048576' >> /etc/sysctl.conf
echo 'net.netfilter.nf_conntrack_tcp_timeout_established = 3600' >> /etc/sysctl.conf

Безопасность и лучшие практики

  • Принцип минимальных привилегий: Открывайте только необходимые порты
  • Используйте fail2ban: Для защиты от брутфорса
  • Регулярно обновляйте правила: Убирайте неиспользуемые сервисы
  • Мониторинг: Настройте алерты на подозрительную активность
  • Бэкапы конфигурации: Регулярно сохраняйте настройки
# Создать бэкап конфигурации
sudo cp -r /etc/firewalld /etc/firewalld.backup.$(date +%Y%m%d)

# Экспорт в читаемый формат
sudo firewall-cmd --list-all-zones > /root/firewall-config-$(date +%Y%m%d).txt

Заключение и рекомендации

Firewalld — это мощный и гибкий инструмент для управления фаерволом в современных дистрибутивах Linux. По сравнению с классическими iptables, он предоставляет более удобный интерфейс и расширенные возможности для управления безопасностью сети.

Основные преимущества использования firewalld:

  • Простота настройки и управления
  • Возможность изменения правил на лету
  • Концепция зон для разных типов сетей
  • Интеграция с современными инструментами
  • Хорошая документация и поддержка сообщества

Рекомендую использовать firewalld для:

  • Веб-серверов и приложений
  • Серверов баз данных
  • Рабочих станций разработчиков
  • Любых серверов, где важна гибкость управления

Если вам нужен надежный сервер для экспериментов с firewalld, обратите внимание на аренду VPS или выделенного сервера. Удачи в настройке!

Полезные ссылки для дальнейшего изучения:


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

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

Leave a reply

Your email address will not be published. Required fields are marked