Основной брандмауэр в операционных системах 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. Статус брандмауэра
Первым делом необходимо посмотреть состояние брандмауэра. Для этого выполните:
sudo systemctl status firewalld
Если служба Firewalld отключена, то необходимо её включить:
sudo systemctl start firewalld
sudo systemctl enable firewalld
Теперь нужно посмотреть, запущен ли Firewalld, с помощью команды firewall-cmd:
sudo firewall-cmd --state
Если программа запущена и всё хорошо, то вы получите сообщение "running".
2. Управление зонами
Как вы уже поняли, зоны - это основной инструмент для управления сетевыми подключениями. Чтобы посмотреть зону по умолчанию, выполните:
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
3. Настройка сервисов
Вы можете посмотреть все предопределенные сервисы командой:
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
4. Как открыть порт в 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
5. Проброс портов 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
6. Расширенные правила
Если функциональности зон вам недостаточно, вы можете использовать расширенные правила. Общий синтаксис расширенных правил такой:
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 ещё проще в использовании.
https://youtu.be/bE9NoxzWp8s
Зачем копипастить статьи?, Этой гнилью от Красной Шляпы, никто не пользуется, даже на серверах. 90% Напишите про Minix и как его поднять в desktop. И как потом с этого болгенос сделать, 90% серверов мира на BSD/
Нормвально-нормально, я после Fedora тоже хотел себе CentOS запилить, но как-то не срослось. За статью спасиб по-любому )
Спасибо за статью. Подскажите CUPS не добавляется как сервис? если добавить 631 порт, то заходит на страницу.
Дюже много кота. Всё это можно было уместить гораздо компактнее, без большинства абсолютно ненужных тут иллюстраций. В остальном хороший контент.
Спасибо. Пригодилось