Раздел помощи SpaceWeb

Настройка firewalld в CentOS

15 фев, 2024

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

В Linux на уровне ядра используется подсистема Netfilter, а для управления брандмауэром могут применяться различные утилиты, такие как iptables, nftables или firewalld.

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

Например, в дистрибутиве Ubuntu за это отвечает ufw (Uncomplicated Firewall), а в семействе дистрибутивов RedHat (CentOS, Alma, Fedora, RHEL) широко используется firewalld, о котором мы и поговорим дальше.

Что такое Firewalld

Firewalld – это системный инструмент управления брандмауэром для операционной системы Linux. Он предоставляет пользователю удобный интерфейс для настройки брандмауэра, позволяя определять правила безопасности для сетевых соединений. 

Firewalld предназначен для упрощения процесса управления брандмауэром и обеспечивает динамическую настройку правил, что облегчает администрирование безопасности сети.

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

Настройка Firewalld в CentOS

Шаг 1. Установка и активация firewalld

На некоторых дистрибутивах Linux firewalld устанавливается автоматически, включая многие образы CentOS 8. Однако также может потребоваться установить firewalld вручную:

sudo dnf install firewalld

Как только установка firewalld завершится, включите его и перезагрузите сервер. 

sudo systemctl enable firewalld
sudo systemctl start firewalld

После перезапуска сервера ваш брандмауэр должен активироваться. Сетевые интерфейсы будут помещены в настроенные зоны (или вернутся к настроенной зоне и применятся к соответствующим интерфейсам).

Чтобы убедиться, что firewalld успешно запустился, выполните следующую команду:

sudo firewall-cmd --state

Вывод должен быть таким:

running

Шаг 2. Знакомство с зонами 

Как работать с firewalld в CentOS? Прежде всего надо начать с управления зонами. 

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

Какими могут быть зоны? Вот несколько примеров:

  • Public (Публичная). Используется в общедоступных сетях.
  • Internal (Внутренняя). Предназначена для доверенных внутренних сетей – например, для локальной сети офиса или домашней сети. 
  • DMZ (Зона разделения сетей). Обычно используется для размещения служб, доступных из внешней сети.
  • Work (Рабочая). Может использоваться для рабочих сред, где требуется более строгий контроль доступа на сетевом уровне, чем в общедоступных сетях, но более свободный, чем во внутренних.
  • Home (Домашняя). Похожа на рабочую зону. Может быть настроена с учетом потребностей домашнего пользователя.

Каждая зона определяет свои правила безопасности, а администратор может назначать зоны различным сетевым интерфейсам в зависимости от их доверенности и предназначения.

Перед тем как вносить дальнейшие изменения, давайте ближе познакомимся с текущим окружением и правилами, установленными в firewalld. 

  1. Чтобы узнать, какая зона в данный момент установлена по умолчанию, выполните команду:

firewall-cmd --get-default-zone

Пример результата:

public


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

Это можно легко проверить с помощью команды:

firewall-cmd --get-active-zones

Вывод:

public
  interfaces: eth0 eth1

Здесь мы видим, что у нашего сервера есть два сетевых интерфейса, которые управляются файерволом (eth0 и eth1), и они оба находятся в активной зоне public.

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

firewall-cmd --get-zones

Вывод:

block dmz drop external home internal public trusted work

Также можно изучить конфигурацию конкретной зоны, включив параметр «--zone=» в нашу команду «--list-all»:

sudo firewall-cmd --zone=work --list-all

Вывод будет следующим:

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

Далее рассмотрим, как назначать зоны для сетевых интерфейсов.

Шаг 3. Выбор зон

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

Однако вы можете перемещать интерфейс между зонами, используя параметр «--zone=» в сочетании с «--change-interface=». Как и в случае с любыми командами, которые вносят какие-либо изменения в брандмауэр, для этого потребуется утилита sudo.

В качестве примера давайте переместим интерфейс eth0 в зону home с помощью следующей команды:

sudo firewall-cmd --zone=home --change-interface=eth0

Результат будет следующим:

success

Чтобы подтвердить успешное выполнение операции, запросите активные зоны:

firewall-cmd --get-active-zones

Шаг 4. Установка правил

Чтобы узнать, какие правила установлены для зоны public, можно вывести конфигурацию зоны по умолчанию. Для этого введите:

sudo firewall-cmd --list-all

Вывод:

public (active)
  target: default
  icmp-block-inversion: no
  interfaces: eth0 eth1
  sources:
  services: cockpit dhcpv6-client ssh
  ports:
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

Что здесь сказано?

  1. Зона public активна, и используется по умолчанию. 
  2. Интерфейсы eth0 и eth1 связаны с этой зоной (что мы уже знали из предыдущих запросов). 
  3. Зона разрешает трафик для DHCP-клиента (для присвоения IP-адресов), SSH (для удаленного администрирования) и HTTP.

Но давайте обсудим все интересующие нас параметры по порядку. 

Настройка портов

Как правило, в поле «ports» указаны порты, через которые разрешены соединения. Давайте рассмотрим процесс настройки на примере изменения прослушиваемого порта для демона OpenSSH с 22-го на 3333-й (в файле /etc/ssh/sshd_config):

Port 3333
#AddressFamily any
#ListenAddress 0.0.0.0
#ListenAddress ::

После внесения изменений перезапустите службу OpenSSH:

sudo systemctl restart sshd

Выведите порты, на которых слушает sshd:

sudo ss -nl4p | grep sshd

Вывод будет следующим:

tcp    LISTEN     0      128       *:3333                  *:*                  users:(("sshd",pid=7602,fd=3))

Вы увидите, что порт 3333 находится в состоянии прослушивания. Текущее соединение не было прервано, но если мы попробуем подключиться заново по стандартному или новому порту, появится ошибка:

ssh user1@37.46.131.83 -p 3333

Вывод:

ssh: connect to host 37.46.131.83 port 3333: No route to host

Чтобы разрешить подключение по новому порту 3333/tcp, необходимо добавить разрешающее правило в firewalld:

sudo firewall-cmd --add-port=3333/tcp

Проверим, какие порты теперь разрешены:

sudo firewall-cmd --list-ports

Вывод:

3333/tcp

Настройка сервисов

Настройка сервисов в firewalld включает в себя использование описаний служб, что облегчает централизованную конфигурацию. 

Запросите текущие сервисы в firewalld и их характеристики:

sudo firewall-cmd --list-services

Вывод:

cockpit dhcpv6-client ssh

Затем запросите информацию о SSH:

sudo firewall-cmd --info-service=ssh

Вывод:

ssh
  ports: 3333/tcp
  protocols: 
  source-ports: 
  modules: 
  destination:

Давайте также попробуем удалить и добавить новую службу. Для этого пропишите команды:

sudo firewall-cmd --remove-service=dhcpv6-client
sudo firewall-cmd --add-service=http
sudo firewall-cmd --runtime-to-permanent

Таким образом, вы удалите dhcpv6-client и добавите новый сервис – http. 

Опция --runtime-to-permanent делает временные настройки постоянными, что позволяет выполнить несколько команд без указания --permanent и применять изменения только после завершения операций. 

Настройка ICMP и протоколов 

  1. Пропишите команду --list-all, чтобы отобразить ключевые параметры, связанные с ICMP и протоколами:

sudo firewall-cmd --list-all | grep -E '(target|icmp|protocols)'

Вывод:

target: default
icmp-block-inversion: no
protocols: 
icmp-blocks:

  1. Firewalld предоставляет возможность не только настраивать сервисы и порты, но и определять разрешенные протоколы. В качестве примера, давайте настроим разрешение протокола OSPF (динамической маршрутизации):

sudo firewall-cmd --add-protocol=ospf
sudo firewall-cmd --list-protocols

На экране отобразится следующий вывод:

ospf

  1. Параметры «icmp-blocks» и «icmp-block-inversion» касаются протокола ICMP, используемого для тестирования сети и обнаружения ошибок. Чтобы обеспечить более детальный контроль за сетью, можно использовать эти параметры и блокировать конкретные типы ICMP-сообщений. 

Например, блокируя ICMP-сообщения, вы можете скрыть информацию о сети, так как некоторые методы сканирования также используют этот протокол. 

Для наглядности давайте запретим все типы ICMP-сообщений (так как в «icmp-block» не указано ничего конкретного, все сообщения автоматически становятся запрещенными):

sudo firewall-cmd --add-icmp-block-inversion

Теперь выполним ping на сервер:

ping -c 3 37.46.131.83

Результат будет следующим:

--- 37.46.131.83 ping statistics ---
3 packets transmitted, 0 received, +3 errors, 100% packet loss, time 2004ms

Таким образом, блокировка ICMP-сообщений приводит к тому, что машина не пингуется. Этот метод часто используется провайдерами для скрытия маршрутизаторов в сети. 

Важно! Блокировка ICMP может привести к потере информации об ошибках. Будьте осторожны, используя этот метод. 

Настройка NAT

NAT (Network Address Translation) – это технология, которая используется в компьютерных сетях для преобразования сетевых адресов. 

Когда устройства в локальной сети подключаются к интернету, они обычно используют частные IP-адреса, которые не могут быть напрямую использованы в глобальной сети. NAT переводит эти частные IP-адреса в один (или несколько) общедоступных IP-адресов. 

Предположим, вам нужно настроить брандмауэр на роутере. Для начала разрешите Source NAT:

sudo firewall-cmd --add-masquerade
sudo firewall-cmd --list-all

После выполнения этих команд вы получите примерно следующий вывод:

public (active)
  target: default
  icmp-block-inversion: no
  interfaces: eth0
  sources:
  services: mysql ssh
  ports:
  protocols:
  masquerade: yes
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

Обратите внимание на параметр «masquerade: yes». Она указывает на то, что Source NAT разрешен.

Далее, если требуется настроить перенаправление портов на устройстве, введите:

sudo firewall-cmd --add-forward-port=port=3333:proto=tcp:toport=22
sudo firewall-cmd --list-all

Результат выполнения этих команд:

public (active)
  target: default
  icmp-block-inversion: no
  interfaces: eth0
  sources:
  services: mysql ssh
  ports:
  protocols:
  masquerade: yes
  forward-ports: port=3333:proto=tcp:toport=22:toaddr=
  source-ports:
  icmp-blocks:
  rich rules:

Теперь у нас появилась запись в разделе «forward-ports», которая указывает на перенаправление порта 3333 на порт 22. 

Дополнительно. В выводе вы также можете заметить опцию «source-ports». В firewalld есть возможность разрешать определенные исходящие порты, но это редко используют на практике, так как обычно в качестве source-портов выступают динамические пятизначные порты.

Заключение

С помощью службы firewalld вы можете создавать и настраивать правила (или наборы правил), учитывая особенности вашей сетевой среды. Она обеспечивает легкий переход между различными политиками брандмауэра с использованием зон и предоставляет администраторам возможность абстрагировать управление портами, используя более интуитивные определения служб.