- Home »

Настройка фаервола с помощью 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 или выделенного сервера. Удачи в настройке!
Полезные ссылки для дальнейшего изучения:
В этой статье собрана информация и материалы из различных интернет-источников. Мы признаем и ценим работу всех оригинальных авторов, издателей и веб-сайтов. Несмотря на то, что были приложены все усилия для надлежащего указания исходного материала, любая непреднамеренная оплошность или упущение не являются нарушением авторских прав. Все упомянутые товарные знаки, логотипы и изображения являются собственностью соответствующих владельцев. Если вы считаете, что какой-либо контент, использованный в этой статье, нарушает ваши авторские права, немедленно свяжитесь с нами для рассмотрения и принятия оперативных мер.
Данная статья предназначена исключительно для ознакомительных и образовательных целей и не ущемляет права правообладателей. Если какой-либо материал, защищенный авторским правом, был использован без должного упоминания или с нарушением законов об авторском праве, это непреднамеренно, и мы исправим это незамедлительно после уведомления. Обратите внимание, что переиздание, распространение или воспроизведение части или всего содержимого в любой форме запрещено без письменного разрешения автора и владельца веб-сайта. Для получения разрешений или дополнительных запросов, пожалуйста, свяжитесь с нами.