Брандмауэр на основе зон
Firewalld – это брандмауэр на основе зоны: каждая зона может быть настроена так, чтобы принимать или отклонять некоторые службы или порты и, следовательно, с другим уровнем безопасности.
Зоны могут быть связаны с одним или несколькими сетевыми интерфейсами.
Обычно firewalld поставляется с набором предварительно сконфигурированных зон: чтобы перечислять эти зоны и, в общем, взаимодействовать с брандмауэром, мы будем использовать утилиту firewall-cmd.
Я работаю в системе Fedora 27, давайте посмотрим, какие существуют доступные зоны:
Основные понятия межсетевого экрана
Существует несколько зон — наборов правил для управления трафиком на основе доверия к сетям. Всем им задаются собственные политики, совокупность которых и образует конфигурацию брандмауэра. Каждой зоне присваивается один или несколько сетевых интерфейсов, что также позволяет регулировать фильтрацию.
От используемого интерфейса напрямую зависят применяемые правила. Например, при подключении к общедоступному Wi-Fi сетевой экран повысит уровень контроля, а в домашней сети откроет дополнительный доступ для участников цепи. В рассматриваемом фаерволе присутствуют такие зоны:
Сами же политики бывают временные и постоянные. При появлении или редактировании параметров действие фаервола сразу меняется без надобности перезагрузки. Если же были применены временные правила, после рестарта FirewallD они будут сброшены. Перманентное правило на то так и называются — оно будет сохранено на постоянной основе при применении аргумента —permanent.
Введение
Начиная с версии 7 Rhel и CentOS и версии 18 Fedora, firewalld является системой брандмауэра по умолчанию.
Одной из его отличительных черт является его модульность: он работает над концепцией зон – zones
В этом уроке мы узнаем больше об этом и о том, как с ним работать, используя утилиту firewall-cmd.
Что делать, если нужный сервис недоступен?
Брандмауэр firewalld по умолчанию включает в себя многие наиболее распространённые сервисы. Однако некоторым приложениям необходимы сервисы, поддержка которых отсутствует в firewalld. В таком случае у вас есть два выхода.
Firewalld: блокировка ip-адресов, создание исключений
Вы можете добавлять в исключения firewalld доверенные адреса IP адреса или блокировать нежелательные.
Чтобы добавить в исключения конкретный IP- адрес (например 8.8.8.8) на вашем сервере через firewalld, используйте команду:
# firewall-cmd –zone=public –add-rich-rule=’rule family=”ipv4″ source address=”8.8.8.8″ accept’
Проверьте зону, и убедитесь что IP добавлен в исключения в правиле rich rules:
# firewall-cmd –zone=public –list-all
Panic mode
Panice mode- это режим, который следует использовать только в ситуациях, когда есть серьезные проблемы с сетевой средой.
Когда этот режим активен, все существующие соединения отбрасываются, и все входящие и исходящие пакеты удаляются.
Он может быть включен таким образом:
# firewall-cmd --panic-on
Чтобы выйти из этого режима:
# firewall-cmd --panic-off
Можно даже запросить его статус, выполнив:
# firewall-cmd --query-panic
Базовые понятия firewalld
Прежде чем начать работу с утилитой firewall-cmd, давайте ознакомимся с основными понятиями брандмауэра.
Включение брандмауэра firewalld
Для начала нужно запустить FirewallD или убедиться в том, что он находится в активном состоянии. Только функционирующий демон (программа, работающая в фоновом режиме) будет применять правила для межсетевого экрана. Активация производится буквально в несколько кликов:
- Запустите классический «Терминал» любым удобным методом, к примеру, через меню «Приложения».
- Введите команду
sudo systemctl start firewalld.service
и нажмите на клавишу Enter. - Управление утилитой осуществляется от имени суперпользователя, поэтому придется подтвердить подлинность, указав пароль.
- Чтобы убедиться в функционировании сервиса, укажите
firewall-cmd --state
. - В открывшемся графическом окне повторно подтвердите подлинность.
- Отобразится новая строка. Значение «running» говорит о том, что фаервол работает.
Если же вам однажды потребуется временно или перманентно отключить брандмауэр, советуем воспользоваться инструкцией, представленной в другой нашей статье по следующей ссылке.
Подробнее: Отключение Firewall в CentOS 7
Выключение и включение
Выключение брандмауэра:
netsh advfirewall set allprofiles state off
Включение брандмауэра:
netsh advfirewall set allprofiles state on
Выключение сетевых профилей:
netsh advfirewall set domainprofile state off
netsh advfirewall set privateprofile state off
netsh advfirewall set publicprofile state off
Включение сетевых профилей:
netsh advfirewall set domainprofile state on
netsh advfirewall set privateprofile state on
netsh advfirewall set publicprofile state on
Запрет всех входящих соединений и разрешение исходящих:
Добавление правил для приложений
Чтобы открыть порт для приложения, можно добавить в исключения сервис. Вывести список доступных сервисов:
# firewall-cmd –get-services
Вывод будет содержать большое количество сервисов. Подробная информация о службе содержится в ее xml файле. Эти файлы расположены в директории /usr/lib/firewalld/services.
Например:
# cd /usr/lib/firewalld/services
# cat smtp.xml
Добавление собственных зон
Вы можете создать собственную зону (назову ее our):
# firewall-cmd –permanent –new-zone=our
После создания новой зоны, как и после создания сервиса, нужна перезагрузка firewalld:
# firewall-cmd –reload
success
# firewall-cmd –get-zones
Доступные зоны
Чтобы просмотреть список всех зон, нужно выполнить команду:
# firewall-cmd –get-zones
У меня получился такой список:
Закрытие и открытие портов
Разрешение входящих протоколов TCP и UDP на 80 порт:
netsh advfirewall firewall add rule name="Open Port 80" dir=in action=allow protocol=TCP localport=80
netsh advfirewall firewall add rule name="Open Port 80" dir=in action=allow protocol=UDP localport=80
Запрет входящих протоколов на 80 порт:
Комбинирования параметров
Можно использовать длинные выражения путем комбинирования сразу нескольких параметров:
netsh advfirewall firewall add rule name="My Application" dir=in action=allow program="C:MyAppMyApp.exe" enable=yes remoteip=157.60.0.1,172.16.0.0/16,LocalSubnet profile=domain
Мы создали правило, которое разрешает входящие соединения к приложению MyApp из сетей с ip-адресами 157.60.0.1,172.16.0.0/16 и доменным профилем сетевого подключения.
На официальном сайте Microsoft можно ознакомится с примерами сравнения старого контекста Windows XP и нового, который начал использоваться в Windows 7.
Конвертируем правила iptables в firewalld
Многих пугает переход с Iptables на Firewalld из-за того, что нет привычного вида правил и это заблуждение.
Преобразуем, для примера, следующие правила Iptables
В файле /etc/firewalld/zones/public.xml добавляем строчки:
Создаем файл /etc/firewalld/services/custom_ports.xml:
Либо всю процедуру можно выполнить следующим образом:
Перезагружаем Firewalld и проверяем:
Маскарадинг
Данная команда включает маскарадинг для зоны. Адреса частной сети спрятаны за доступным извне IP адресом и привязаны к нему. Это разновидность трансляции адресов, обычно используется в роутерах. Маскарадинг доступен только для IPv4 из-за ограничений ядра.
Проверяем статус работы:
Перенаправим запросы входящие на настроенный ранее SSH порт на нужный хост:
Также мы можем перенаправить запросы с изменением порта назначения, например:
Настройка зон интерфейсов
Как вы знаете из информации выше, для каждого интерфейса определяется своя зона по умолчанию. Он будет находиться в ней до тех пор, пока настройки не изменятся пользователем или программно. Возможен ручной перенос интерфейса в зону на одну сессию, и осуществляется он активацией команды sudo firewall-cmd –zone=home –change-interface=eth0.
При подобном изменении параметров следует учитывать, что работа сервисов может быть сброшена. Некоторые из них не поддерживают функционирование в определенных зонах, допустим, SSH хоть и доступен в «home», но в пользовательских или особенных сервис работать откажется.
Если вы захотите сбросить произведенные ранее настройки, просто выполните рестарт брандмауэра: sudo systemctl restart firewalld.service.
Порой не всегда удобно изменять зону интерфейса всего на одну сессию. В таком случае потребуется редактировать конфигурационный файл, чтобы все настройки ввелись на перманентной основе. Для этого мы советуем использовать текстовый редактор nano, который устанавливается с официального хранилища sudo yum install nano. Далее остается произвести такие действия:
- Откройте конфигурационный файл через редактор, введя
sudo nano /etc/sysconfig/network-scripts/ifcfg-eth0
, где eth0 — название необходимого интерфейса. - Подтвердите подлинность учетной записи для выполнения дальнейших действий.
- Отыщите параметр «ZONE» и поменяйте его значение на нужное, например,
public
илиhome
. - Зажмите клавиши Ctrl O, чтобы сохранить изменения.
- Не изменяйте имя файла, а просто нажмите на Enter.
- Выйдите из текстового редактора через Ctrl X.
Теперь зона интерфейса будет такой, какой вы ее указали, до момента следующего редактирования конфигурационного файла. Чтобы обновленные параметры вступили в действие, выполните sudo systemctl restart network.service и sudo systemctl restart firewalld.service.
Настройка зоны по умолчанию
Все ваши интерфейсы могут находиться в одной зоне, но проще все же выбрать удобную зону по умолчанию и использовать ее в конфигурации.
Для этого существует параметр –set-default-zone=. После этого все интерфейсы будут привязаны к этой зоне:
sudo firewall-cmd –set-default-zone=homesuccess
Настройка правил
Настройка правил может выполняться “на лету” либо через XML.Предлагаю начать с настройки правила для нестандартного порта, например для SSH.
Проверяем, что разрешено на нашем сервере:
Если в конфигурации сервера не используется IPv6 протокол, то лучше его убрать:
Выбираем новый порт для SSH, но запоминаем его в уме.Не надо рваться его сразу поменять в настройках SSH, добавим сразу правило для него на постоянной основе (–permanent):
Перезагрузим правила:
Проверяем:
Отлично. Теперь можно смело изменять настройки SSH и удалять правило на сервис с 22 портом.
Проверяем результат:
Второй вариант настройки – через XML.Рассмотрим на примере настройки SNMP.
Создаем файл /etc/firewalld/services/snmp.xml
Перезагружаем Firewalld:
Добавляем правило на постоянной основе:
И снова перезагружаем Firewalld:
Ограничения по ip адресам
правило ограничивающие подключение одно ip-адреса
Определение сервиса
Как видите, добавление портов не вызывает никаких трудностей, но процедура усложняется в том случае, когда приложений используется большое количество. Отследить все использующиеся порты становится трудно, ввиду чего более правильным вариантом станет определение сервиса:
Перенаправление портов в firewalld
Вы можете создать правило перенаправления портов (port forwarding) в firewalld. Чтобы перенаправить 443 порт на 9090:
# firewall-cmd –zone=public –add-forward-port=port=443:proto=tcp:toport=9090 –permanent
Чтобы удалить правило перенаправления порта:
# firewall-cmd –zone=public –remove-forward-port=port=443:proto=tcp:toport=9090
Полезные команды при работе в firewalld
Включить режим блокировки всех исходящих и входящих пакетов:
Выключить режим блокировки всех исходящих и входящих пакетов:
Проверить режим “паника”:
Перезагрузить правила firewalld без потери текущих соединений:
Перезагрузить правила firewalld и сбросить текущие соединения:
Добавить к зоне сетевой интерфейс:
В конфигурации интерфейса ens3 можно указать, какой зоне принадлежит этот интерфейс. Для этого добавим ZONE=work.Если параметр ZONE не указан, будет назначена зона по-умолчанию.
Разрешить диапазон портов:
Открыть порт MySQL
Более подробную информацию, а также описание всех возможностей можно найти на сайте FedoraProject
Помогла ли вам эта статья?
ДАНЕТ
Правила брандмауэра по умолчанию
Прежде ем начать менять правила, давайте ознакомимся со стандартным набором правил firewalld.
Правила для приложений
Разрешить соединения для программы MyApp.exe
netsh advfirewall firewall add rule name="My Application" dir=in action=allow program="C:MyAppMyApp.exe" enable=yes
Просмотр правил по умолчанию и доступных зон
Даже работающий в штатном режиме фаервол имеет свои определенные правила и доступные зоны. Перед началом редактирования политик советуем ознакомиться с текущей конфигурацией. Делается это при помощи простых команд:
- Определить функционирующую по умолчанию зону поможет команда
firewall-cmd --get-default-zone
. - После ее активации вы увидите новую строку, где отобразится необходимый параметр. Например, на скриншоте ниже активной считается зона «public».
- Однако активными могут быть сразу несколько зон, к тому же они привязываются к отдельному интерфейсу. Узнайте эту информацию через
firewall-cmd --get-active-zones
. - Команда
firewall-cmd --list-all
выведет на экран правила, заданные для зоны по умолчанию. Обратите внимание на скриншот ниже. Вы видите, что активной зоне «public» присвоено правило «default» — функционирование по умолчанию, интерфейс «enp0s3» и добавлено два сервиса. - Если появилась надобность узнать все доступные зоны брандмауэра, введите
firewall-cmd --get-zones
. - Параметры же конкретной зоны определяются через
firewall-cmd --zone=name --list-all
, где name — название зоны.
После определения необходимых параметров можно переходить к их изменению и добавлению. Давайте детально разберем несколько самых популярных конфигураций.
Разрешение протоколов
Следующее правило принимает входящий трафик по ICMP-протоколу, проще говоря разрешает ping:
Свяжите зону с интерфейсом
Создание зоны – это только первый шаг: теперь мы должны связать ее с сетевым интерфейсом.
Предположим, мы хотим использовать нашу новую созданную зону, связывая ее с интерфейсом ethernet через ens5f5: вот команда, которая позволяет нам выполнить задачу:
# firewall-cmd --permanent --zone=linuxconfig --add-interface=ens5f5
если мы запрашиваем зону на назначенные ей интерфейсы, мы должны увидеть:
# firewall-cmd --zone=linuxconfig --list-interfaces ens5f5
Удаление интерфейса из зоны так же просто:
# firewall-cmd --remove-interface=ens5f5 --zone=linuxconfig
Создание пользовательской зоны
До сих пор мы посмотрели, как изменять существующие зоны.
Также можно создать несколько новых, и это так же просто.
Предположим, мы хотим создать пользовательскую зону под названием linuxconfig:
# firewall-cmd --permanent --new-zone=linuxconfig
Создана новая пустая зона: по умолчанию в ней не разрешены службы или порты.
Также можно создать зону, загрузив файл конфигурации:
# firewall-cmd --permanent --new-zone-from-file=file --name=linuxconfig
Где file – это путь к файлу, содержащему определение зоны.
Обратите внимание, что при создании или удалении зоны параметр -permanent является обязательным: ошибка будет отображена, если он не указан.
Создание правил для приложений
Теперь давайте посмотрим, как делать исключения для сервисов, которые должно поддерживать ваше приложение.
Создание правил для программ и утилит
В самом начале статьи мы рассказали о действии каждой зоны. Определение сервисов, утилит и программ в такие ветви позволит применить для каждой из них индивидуальные параметры под запросы каждого пользователя. Для начала советуем ознакомиться с полным списком доступных на данный момент сервисов: firewall-cmd –get-services.
Результат отобразится прямо в консоли. Каждый сервер разделен пробелом, и в списке вы сможете с легкостью отыскать интересующий вас инструмент. Если же нужный сервис отсутствует, его следует дополнительно установить. О правилах инсталляции читайте в официальной документации программного обеспечения.
Указанная выше команда демонстрирует только названия сервисов. Детальная информация по каждому из них получается через индивидуальный файл, находящийся по пути /usr/lib/firewalld/services. Такие документы имеют формат XML, путь, например, к SSH выглядит так: /usr/lib/firewalld/services/ssh.xml, а документ имеет следующее содержимое:
SSHSecure Shell (SSH) is a protocol for logging into and executing commands on remote machines. It provides secure encrypted communications. If you plan on accessing your machine remotely via SSH over a firewalled interface, enable this option. You need the openssh-server package installed for this option to be useful.
Способ 1: настройка порта
Проще всего в такой ситуации открыть порт приложения в необходимой зоне брандмауэра. Нужно просто указать порт или диапазон портов и протокол (TCP или UDP).
Допустим, приложение, которое использует порт 5000 и протокол TCP, нужно добавить в зону public. Чтобы включить временную поддержку приложения, используйте параметр –add-port= и укажите протокол tcp или udp.
sudo firewall-cmd –zone=public –add-port=5000/tcpsuccess
Убедитесь, что операция прошла успешно:
sudo firewall-cmd –zone=public –list-ports5000/tcp
Также можно указать последовательный диапазон портов, отделив первый и последний порт диапазона с помощью тире. Например, если приложение использует UDP-порты 4990-4999, чтобы добавить их в зону public, нужно ввести:
sudo firewall-cmd –zone=public –add-port=4990-4999/udp
После тестирования можно добавить эти правила в постоянный набор правил брандмауэра.
sudo firewall-cmd –zone=public –permanent –add-port=5000/tcpsudo firewall-cmd –zone=public –permanent –add-port=4990-4999/udpsudo firewall-cmd –zone=public –permanent –list-portssuccesssuccess5000/tcp 4990-4999/udp
Способ 2: определение сервиса
Добавлять порты в зоны просто, но если вам нужно добавить много приложений, в результате будет сложно отследить, для чего предназначен тот или иной порт. Чтобы избежать такой ситуации, можно вместо портов определить сервисы.
Сервисы – это наборы портов с определенным именем и описанием. С помощью сервисов проще управлять настройками, но сами по себе они устроены сложнее, чем порты.
Для начала нужно скопировать существующий сценарий из каталога /usr/lib/firewalld/services в каталог /etc/firewalld/services (здесь брандмауэр ищет нестандартные настройки).
Например, можно скопировать определение сервиса SSH и использовать его для определения условного сервиса example. Имя сценария должно совпадать с именем сервиса и иметь расширение .xml.
sudo cp /usr/lib/firewalld/services/ssh.xml /etc/firewalld/services/example.xml
Откорректируйте скопированный файл.
sudo vi /etc/firewalld/services/example.xml
В файле находится определение SSH:
Большую часть определения сервиса составляют метаданные. Изменить краткое имя сервиса можно в тегах <short> – это человекочитаемое имя сервиса. Также нужно добавить описание сервиса. Единственное изменение, которое повлияет на работу сервиса – это изменение номера порта и протокола. Вы можете использовать несколько тегов <port/>.
Вернёмся к сервису example; допустим, он требует открыть TCP-порт 7777 и UDP-порт 8888. Определение будет выглядеть так:
Сохраните и закройте файл.
Перезапустите брандмауэр:
sudo firewall-cmd –reload
Теперь он появится в списке доступных сервисов:
Требования
Для работы вам понадобится сервер CentOS 8, настроенный по этому мануалу. Войдите в систему как пользователь sudo и приступайте к работе.
Углубленные правила | rich rules
В определенных ситуациях нам может потребоваться создать более сложное правило, а не просто разрешить некоторые порты или службы в зоне.
Например, мы можем создать правило для блокировки трафика определенного типа с определенного компьютера.
Для этого нужны – Rich rules.
Правило в основном состоит из двух частей: в первом мы указываем условия, которые должны выполняться для применяемого правила, а во втором – действие, которое должно выполняться: принимать, сбрасывать или отклонять – accept, drop, ,reject.
Предположим, мы хотим заблокировать трафик с компьютера с ip 192.168.0.37 в локальной сети: вот как мы будем составлять наше правило:
# firewall-cmd --zone=linuxconfig --add-rich-rule="rule family="ipv4" source address=192.168.0.37 service name=ssh reject
Чтобы добавить правило, мы использовали опцию -add-rich-rule, описывающую правило в качестве аргумента.
Правило начинается с ключевого слова правила. В family мы указали, что правило применяется только к ipv4-пакетам: если это ключевое слово не указано, правило применяется как к ipv4, так и к ipv6.
Затем мы предоставили исходный адрес, который получает пакеты для запуска правила с адресом источника.
С помощью service мы указали тип сервиса для правила, в данном случае ssh.
Наконец, мы предоставили действие, которое должно быть выполнено, если пакет соответствует правилу, в этом случае reject.
Если мы попытаемся установить соединение ssh с машиной с 192.168.0.37 ip, мы получим:
ssh 192.168.0.35 ssh: connect to host 192.168.0.35 port 22: Connection refused
Вы можете посмотреть документацию по firewalld, чтобы увидеть весь диапазон доступных параметров и опций.
Установка и включение firewalld в centos
В CentOS 7/8 firewalld устанавливается по умолчанию при установке ОС. Если вы его удалили и хотите установить firewalld, можете воспользоваться стандартным менеджером yum/dnf:
# yum install firewalld -y — для Centos 7# dnf install firewalld -y — для Centos 8
Чтобы демон firewalld запускался автоматически со стартом сервера, нужно добавить его в автозагрузку:
# systemctl enable firewalld
И запустить:
# systemctl start firewalld
Проверить статус сервиса:
# systemctl status firewalld
Заключение
Теперь вы знаете, как работает firewalld, знакомы с основными понятиями брандмауэра, умеете создавать пользовательские зоны и добавлять сервисы.
Брандмауэр firewalld позволяет настраивать гибкие наборы правил, которые учитывают вашу сетевую среду. Благодаря этому вы можете беспрепятственно переходить между различными политиками брандмауэра посредством использования зон. Практические навыки работы с этой системой позволят вам воспользоваться гибкостью и мощью этого инструмента.
Много полезного вы найдете в официальной документации firewalld.
Tags: