Настройка Firewalld на CentOS 7 и 8

Firewalld – это простой и мощный межсетевой экран. Начиная с CentOS 7 Firewalld используется в качестве основного инструмента управления межсетевым экраном и является надстройкой над iptables.

В отличие от цепочек и правил в iptables, Firewalld использует концепцию, основанную на зонах и сервисах.

Управление Firewalld осуществляется из командной строки утилитой:

# firewall-cmd

Также есть GUI утилита:

# firewall-config

Зоны

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

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

Список предопределенных зон в порядке возрастания по доверию:

  • drop - Все входящие соединения разрываются без уведомления.
  • block - Все входящие соединения отклоняются сообщением icmp-host-prohibited (IPv4) или icmp6-adm-prohibited (IPv6).
  • public - Эта зона используется в большинстве случаев, когда сервер подключен к интернету и предоставляет какие-либо сервисы для пользователей, по умолчанию все входящие соединения блокируются, но вы можете указать сами, какие соединения могут быть разрешены, например, сервисы http и https для веб-сервера.
  • external - Можно использовать с включенным masquerade для внешних сетей, к примеру, если вы хотите сделать маршрутизатор.
  • internal - Можно использовать во внутренних сетях.
  • dmz - Можно использовать для создания общедоступных сетей, отделённых от внутренней сети.
  • work - Можно использовать для подключения к сети на работе.
  • home - Можно использовать для домашней сети. Если вы принесли свой ноутбук на работу, можно переключиться с профиля home на профиль work.
  • trusted - Все входящие соединения из всех сетей разрешены.
С помощью NetworkManager, либо вручную в файлах конфигурации интерфейсов сети вы можете сделать так, чтобы зоны менялись автоматически при подключении к указанным Wifi сетям. Следует иметь ввиду, что Firewalld при назначении сетевого интерфейса зоне, сам прописывает нужную опцию с указанием зоны в файл конфигурации интерфейса используя NetworkManager и без него.

Предопределенные зоны public, work, home, dmz, external и internal изначально имеют одинаковые настройки по умолчанию, кроме открытых портов сервисов, которые отличаются. Конечно, их также можно изменить. Поэтому любые нужные для работы зоны нужно донастраивать вручную под необходимые вам требования.

В этой статье мы будем рассматривать зону public, необходимую для настройки большинства серверов.

Сервисы

Сервисы в Firewalld это предопределенные правила, которые применяются в зонах и содержат необходимые настройки, чтобы разрешить входящий трафик для конкретной службы. К примеру, сервис http определяет протокол tcp и порт 80. Если мы привяжем его к определенной зоне, которой назначен определенный сетевой интерфейс, то в этой зоне (и в этом сетевом интерфейсе) будет открыт порт tcp/80.

Список всех предустановленных сервисов, поддерживаемых firewalld:

# firewall-cmd --get-services

В firewalld есть возможность добавлять любые собственные сервисы.

Сохранение настроек runtime и permanent

Конфигурация Firewalld состоит из двух частей. Первая runtime применяется сразу после выполнения команды и продолжает работать в ядре. Изменения не сохраняются после перезагрузки системы или службы firewalld. Вторая, постоянная permanent конфигурация записывается и хранится в конфигурационных файлах и загружается вместе с firewalld после перезагрузки системы.

Для того, чтобы сразу записать команду в постоянную конфигурацию, перед командой следует написать опцию --permanent, например:

# firewall-cmd --permanent --zone=public --add-service=http

Как только вы закончили ввод одной или более команд с этой опцией, необходимо их применить. Применение настроек permanent осуществляется командой:

# firewall-cmd --reload

Для большинства runtime команд (без --permanent) выполнять эту строчку не требуется, они начинают работать сразу после выполнения команды для файервола. Но, напоминаем, если вы не пишете перед другими опциями --permanent, они по умолчанию не сохранятся в постоянной конфигурации.

Как сохранить временную конфигурацию в постоянную

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

# firewall-cmd --runtime-to-permanent

Команды Firewalld и настройки для сервера

Проверка сервиса firewalld

Проверяем статус сервиса:

# systemctl status firewalld

Если сервис active (running), то приступаем к настройке.

Другой способ проверки статуса работы firewalld:

# firewall-cmd --state

Если команда выведет в консоль слово running, значит firewall запущен.

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

Список всех зон, которые присуствуют в текущей конфигурации Firewalld можно посмотреть командой:

# firewall-cmd --get-zones

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

# firewall-cmd --list-all-zones

Просмотр детальной информации по определенной зоне (например, по home):

# firewall-cmd --zone=home --list-all

Просмотр детальной информации по зоне, установленной по умолчанию (например, public):

# firewall-cmd --list-all
Если у любой команды не указана зона, то команда будет применена к зоне по умолчанию.

Зона по умолчанию в Firewalld – это зона, которая используется для всего, что явно не привязано или не назначено другой зоне. Если для интерфейса, адреса источника или сервиса нет другой зоны, используется зона по умолчанию. Посмотреть зону по умолчанию можно командой:

# firewall-cmd --get-default-zone

Установить зону по умолчанию (пример для зоны public):

# firewall-cmd --set-default-zone public
Эта команда сразу сохраняется в постоянную конфигурацию, опцию --permanent добавлять не нужно

Разным зонам можно назначать разные сетевые интерфейсы. При этом firewalld автоматически прописывает строчку ZONE= в файл настройки указанного сетевого интерфейса ifcfg-interface (например, /etc/sysconfig/network-scripts/ifcfg-eth0). Зона является активной, когда ей назначен интерфейс или адреса источника. После первой установки CentOS или Firewalld, интерфейс зоне по умолчанию public как правило не назначется. Это означат, что действие зоны по умолчанию распространяется на все интерфейсы системы. Если хотите, вы можете для наглядности назначить этой зоне сетевой интерфейс.

Посмотреть активные зоны и назначенные им интерфесы:

# firewall-cmd --get-active-zones

Назначить интерфейс зоне (пример для зоны public и интерфейса eth0):

# firewall-cmd --permanent --zone=public --change-interface=eth0
Опция --change-interface работает просто – если зоне не назначен интерфейс, он назначается. Если зоне уже был назначен интерфейс, он меняется на указанный. Существуют также опции --add-interface и --remove-interface.

Если вы закончили с конфигурированием Firewalld с опцией --permanent, не забудьте применить настройки:

# firewall-cmd --reload

Открываем необходимые входящие порты

При выполнении команды:

# firewall-cmd --list-all

На чистой установке firewalld вы увидите зону public, установленную по умолчанию и её настройки:

public
  target: default
  icmp-block-inversion: no
  interfaces:
  sources:
  services: dhcpv6-client ssh
  ports:
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

Пустое поле interfaces означает, что зона по умолчанию охватывает все сетевые интерфейсы, и firewall сейчас активен. Разрешены входящие соединения только для сервисов dhcpv6-client и ssh.

Чтобы каждый раз не выводить весь листинг всех параметров зоны, можно воспользоваться отдельными командами, например:

# firewall-cmd --list-services
# firewall-cmd --list-ports

Добавим сервисы для веб-сервера и ftp:

# firewall-cmd --permanent --zone=public --add-service=http
# firewall-cmd --permanent --zone=public --add-service=https
# firewall-cmd --permanent --zone=public --add-service=ftp

Изменения с опцией --permanent применяются только после команды:

# firewall-cmd --reload

Посмотрим, что у нас получилось:

# firewall-cmd --list-all

(можно использовать просто firewall-cmd --list-services)

public
  target: default
  icmp-block-inversion: no
  interfaces:
  sources:
  services: dhcpv6-client ftp http https ssh
  ports:
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

Мы видим, что добавились сервисы ftp, http и https. Теперь firewalld разрешает входящие соединения с этими сервисами.

Если вы не используете IPv6, можно удалить сервис dhcpv6-client:

# firewall-cmd --permanent --zone=public --remove-service=dhcpv6-client
# firewall-cmd --reload

Можно открыть какой-то порт или диапазон портов, если такого сервиса нет, и вам не хочется его создавать:

# firewall-cmd --permanent --zone=public --add-port=8083/tcp
# firewall-cmd --permanent --zone=public --add-port=3000-3099/udp

Протокол должен быть указан из списка: tcp, udp, sctp или dccp.

Удалить открытый порт из зоны:

# firewall-cmd --permanent --zone=public --remove-port=8083/tcp
# firewall-cmd --permanent --zone=public --remove-port=3000-3099/udp

Закрываем нежелательные IP адреса (например из-за спама или атак)

Заблокировать нежелательные IP адреса или диапазоны адресов в Firewalld можно двумя способами:

  1. Через зону drop;
  2. Через расширенные правила rich-rule.

Блокировка нежелательных IP адресов через зону drop

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

# firewall-cmd --permanent --zone=drop --add-source=172.16.10.2
# firewall-cmd --permanent --zone=drop --add-source=172.16.10.0/24

Удалить IP адрес или диапазон адресов из зоны drop:

# firewall-cmd --permanent --zone=drop --remove-source=172.16.10.2
# firewall-cmd --permanent --zone=drop --remove-source=172.16.10.0/24

Проверить список заблокированных адресов источников:

# firewall-cmd --zone=drop --list-sources

Блокировка нежелательных IP адресов правилами rich-rule, применяемыми к зоне по умолчанию public

Добавить правила:

# firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="172.16.10.2" drop'
# firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="172.16.10.0/24" drop'

Если зона не указана, правила добавляются в зону по умолчанию (в нашем случае public).

Удалить правила:

# firewall-cmd --permanent --remove-rich-rule='rule family="ipv4" source address="172.16.10.2" drop'
# firewall-cmd --permanent --remove-rich-rule='rule family="ipv4" source address="172.16.10.0/24" drop'

epsilon7
Добавлено: 04.11.2020