firewall-cmd - настройка FireWall в CentOS 7
Основной брандмауэр в операционных системах Linux - это iptables. Но команды iptables сложны, и многим пользователям тяжело запомнить все опции и случаи, в которых их надо использовать. Поэтому разработчики дистрибутивов создают свои надстройки над iptables, которые помогают упростить управление фаерволом. У CentOS надстройка для управления iptables называется Firewalld.
У Firewalld есть несколько важных отличий, по сравнению с iptables. Здесь управление доступом к сети выполняется на уровне зон и сервисов, а не цепочек и правил. А также правила обновляются динамически, не прерывая запущенных сессий. В этой статье будет рассмотрена настройка Firewall CentOS 7 на примере Firewalld.
Основы использования Firewalld
Как я уже сказал выше, Firewalld работает не с цепочками правил, а с зонами. Каждому сетевому интерфейсу может быть присвоена определенная зона. Зона представляет из себя набор правил, ограничений и разрешений, которые применяются к этому сетевому интерфейсу. Для одного интерфейса может быть выбрана только одна зона. Разработчики создали несколько предустановленных зон:
- drop - блокировать все входящие пакеты, разрешить только исходящие
- block - в отличие от предыдущего варианта отправителю пакета будет отправлено сообщение по блокировке его пакета;
- public - поддерживаются входящие соединения только для ssh и dhclient;
- external - поддерживает NAT для скрытия внутренней сети;
- internal - разрешены сервисы ssh, samba, mdns и dhcp;
- dmz - используется для изолированных сервров, у которых нет доступа к сети. Разрешено только подключение по SSH;
- work - разрешенны сервисы ssh и dhcp;
- home - аналогично internal;
- trusted - всё разрешено.
Таким образом, чтобы разрешить или запретить какой-либо сервис, вам достаточно добавить или удалить его из текущей зоны или сменить зону интерфейса на ту, где он разрешён. Можно провести аналогию с политикой действий по умолчанию для пакетов в iptables. Зона trusted имеет политику ACCEPT и разрешает все подключения, зона block имеет политику DENY, которая запрещает все подключения, а все остальные зоны можно считать наследниками зоны block, плюс в них уже предопределены правила разрешения сетевых подключений для некоторых сервисов.
Также у Firewalld есть два вида конфигурации:
- runtime - действительна только до перезагрузки, все изменения, в которых явно не указано другое, применяются к этой конфигурации;
- permanent - постоянные настройки, которые будут работать и после перезагрузки.
Теперь вы знаете всё необходимое, поэтому перейдём к утилите firewalld-cmd.
Синтаксис и опции firewall-cmd
Управлять настройками Firewalld можно как с помощью консольной утилиты firewall-cmd, так и в графическом интерфейсе. CentOS чаще всего используется на серверах, поэтому вам придётся работать в терминале. Давайте рассмотрим синтаксис утилиты:
firewall-cmd опции
Для управления зонами используется такой синтаксис:
firewall-cmd --конфигурация --zone=зона опции
В качестве конфигурации нужно указать опцию --permanent, чтобы сохранить изменения после перезагрузки или ничего не указывать, тогда изменения будут действительны только до перезагрузки. В качестве зоны используйте имя нужной зоны. Давайте рассмотрим опции утилиты:
- --state - вывести состояние брандмауэра;
- --reload - перезагрузить правила из постоянной конфигурации;
- --complete-reload - жёсткая перезагрузка правил с разрывом всех соединений;
- --runtime-to-permanent - перенести настройки конфигурации runtime в постоянную конфигурацию;
- --permanent - использовать постоянную конфигурацию;
- --get-default-zone - отобразить зону, используемую по умолчанию;
- --set-default-zone - установить зону по умолчанию;
- --get-active-zones - отобразить активные зоны;
- --get-zones - отобразить все доступные зоны;
- --get-services - вывести предопределенные сервисы;
- --list-all-zones - вывести конфигурацию всех зон;
- --new-zone - создать новую зону;
- --delete-zone - удалить зону;
- --list-all - вывести всё, что добавлено, из выбранной зоны;
- --list-services - вывести все сервисы, добавленные к зоне;
- --add-service - добавить сервис к зоне;
- --remove-service - удалить сервис из зоны;
- --list-ports - отобразить порты, добавленные к зоне;
- --add-port - добавить порт к зоне;
- --remove-port - удалить порт из зоны;
- --query-port - показать, добавлен ли порт к зоне;
- --list-protocols - вывести протоколы, добавленные к зоне;
- --add-protocol - добавить протокол к зоне;
- --remove-protocol - удалить протокол из зоны;
- --list-source-ports - вывести порты источника, добавленные к зоне;
- --add-source-port - добавить порт-источник к зоне;
- --remove-source-port - удалить порт-источник из зоны;
- --list-icmp-blocks - вывести список блокировок icmp;
- --add-icmp-block - добавить блокировку icmp;
- --add-icmp-block - удалить блокировку icmp;
- --add-forward-port - добавить порт для перенаправления в NAT;
- --remove-forward-port - удалить порт для перенаправления в NAT;
- --add-masquerade - включить NAT;
- --remove-masquerade - удалить NAT.
Это далеко не все опции утилиты, но для этой статьи нам будет их достаточно.
Настройка Firewall в CentOS 7
1. Отключить брандмауэр
Для просмотра текущего состояния службы FirewallD вы можете использовать firewall-cmd
команду:
sudo firewall-cmd --state
Если служба FirewallD работает в вашей системе CentOS, команда, приведенная выше, выведет следующее сообщение:
Вы можете временно остановить службу FirewallD с помощью следующей команды:
sudo systemctl stop firewalld
Однако это изменение будет действительным только для текущего сеанса времени выполнения.
Чтобы навсегда отключить брандмауэр в системе CentOS 7, выполните следующие действия:
- Во-первых, остановите службу FirewallD с помощью:
sudo systemctl stop firewalld
- Отключите службу FirewallD для автоматического запуска при загрузке системы:
sudo systemctl disable firewalld
Вывод команды выше будет выглядеть примерно так:
Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
- Маска службы FirewallD, которая будет препятствовать запуску межсетевого экрана другими службами:
Как видно из выходных данных, команда mask просто создает символическую ссылку из сервиса firewalld для /dev/null
:
Created symlink from /etc/systemd/system/firewalld.service to /dev/null.
2. Статус брандмауэра
Первым делом необходимо посмотреть состояние брандмауэра. Для этого выполните:
sudo systemctl status firewalld
Если служба Firewalld отключена, то необходимо её включить:
sudo systemctl start firewalldsudo systemctl enable firewalld
Теперь нужно посмотреть, запущен ли Firewalld, с помощью команды firewall-cmd:
sudo firewall-cmd --state
Если программа запущена и всё хорошо, то вы получите сообщение "running".
3. Управление зонами
Как вы уже поняли, зоны - это основной инструмент для управления сетевыми подключениями. Чтобы посмотреть зону по умолчанию, выполните:
sudo firewall-cmd --get-default-zone
В моем случае это зона public. Вы можете изменить текущую зону с помощью опции --set-default-zone:
sudo firewall-cmd --set-default-zone=public
Чтобы посмотреть, какие зоны используются для всех сетевых интерфейсов, выполните:
sudo firewall-cmd --get-active-zones
В списке будут выведены зоны и интерфейсы, для которых они присвоены. Такой командой можно посмотреть конфигурацию для определённой зоны. Например, для зоны public:
sudo firewall-cmd --zone=public --list-all
4. Настройка сервисов
Вы можете посмотреть все предопределенные сервисы командой:
sudo firewall-cmd --get-services
Команда выведет все доступные сервисы, вы можете добавить любой из них к зоне, чтобы его разрешить. Например, разрешим подключение к http:
sudo firewall-cmd --zone=public --add-service=http --permanent
А чтобы удалить этот сервис, выполните:
sudo firewall-cmd --zone=public --remove-service=http --permanent
В обоих случаях мы использовали опцию --permanent, чтобы конфигурация сохранялась после перезагрузки. После изменений нужно обновить правила:
sudo firewall-cmd --reload
Затем, если вы посмотрите конфигурацию зоны, то там появится добавленный сервис:
sudo firewall-cmd --zone=public --list-all
5. Как открыть порт в Firewalld
Если для нужной вам программы нет сервиса, вы можете открыть её порт вручную. Для этого просто добавьте нужный порт к зоне. Например порт 8083:
sudo firewall-cmd --zone=public --add-port=8083/tcp --permanent
Чтобы удалить этот порт из зоны, выполните:
sudo firewall-cmd --zone=public --remove-port=8083/tcp --permanent
Аналогично сервисам, чтобы открыть порт в firewall centos 7 надо перезагрузить брандмауэр.
sudo firewall-cmd --reload
6. Проброс портов Firewalld
Проброс портов в Firewalld настраивается намного проще, чем в iptables. Если вам нужно, например, перенаправить трафик с порта 2223 на порт 22, достаточно добавить к зоне перенаправление:
sudo firewall-cmd --zone=public --add-forward-port=port=2223:proto=tcp:toport=22
Здесь перенаправление выполняется только на текущей машине. Если вы хотите настроить сеть NAT и пробрасывать порт на другую машину, то вам нужно сначала включить поддержку masquerade:
sudo firewall-cmd --zone=public --add-masquerade
Затем уже можно добавить порт:
sudo firewall-cmd --zone=publiс --add-forward-port=port=2223:proto=tcp:toport=22:toaddr=192.168.56.4
7. Расширенные правила
Если функциональности зон вам недостаточно, вы можете использовать расширенные правила. Общий синтаксис расширенных правил такой:
rule family="семейтво" source значение destination значение log audit действие
Вот значение основных параметров:
- В качестве семейства протоколов можно указать ipv4 или ipv6 или ничего не указывать, тогда правило будет применяться к обоим протоколам;
- source и destination - это отправитель и получатель пакета. В качестве этих параметров может быть использован IP-адрес (address), сервис (service name), порт (port), протокол (protocol) и так далее;
- log - позволяет логгировать прохождение пакетов, например в syslog. В этой настройке вы можете указать префикс строчки лога и уровень подробности логгирования;
- audit - это альтернативный способ логгирования, когда сообщения будут отправляться в службу auditd.
- Действие - это действие, которое необходимо выполнить с совпавшим пакетом. Доступны: accept, drop, reject, mark.
Давайте рассмотрим несколько примеров. Нам необходимо заблокировать доступ к серверу для пользователя с IP 135.152.53.5:
sudo firewall-cmd --zone=public --add-rich-rule 'rule family="ipv4" source address=135.152.53.5 reject'
Или нам нужно запретить для этого же пользователя только доступ к порту 22:
sudo firewall-cmd --zone=public --add-rich-rule 'rule family="ipv4" source address=135.152.53.5 port port=22 protocol=tcp reject'
Посмотреть все расширенные правила можно командой:
sudo firewall-cmd --list-rich-rules
В этой статье мы разобрали, как выполняется настройка firewall в CentOS 7 и какие задачи можно с помощью него выполнить. Программой намного проще пользоваться, чем iptables, но по моему мнению надстройка фаервола от Ubuntu - ufw ещё проще в использовании.
Только полноправные пользователи могут оставлять комментарии. Аутентифицируйтесь пожалуйста, используя сервисы.