Настройка firewalld

 

Ко мне Firewalld пришел вместе с первой установкой Centos 7, хотя наверное многие уже давно его используют. Строго говоря firewalld это не какой то разработанный с нуля фаервол, а всего лишь надстройка над iptables (точнее он как и iptables использует для работы iptables tool и управляет тем же сетевым фильтром ядра), однако с ней мы получили некоторые новые возможности и потеряли некоторые старые.

Начнём с того что из привычного нам теперь недоступно:

  1.  Нет /etc/sysconfig/iptables. Настроек iptables в обычном ранее для них месте нет, firewalld хранит свои настройки в XML файлах раскидав их по /usr/lib/firewalld/ и /etc/firewalld/
  2.  Добавлять правила привычными командами вроде iptables -A INPUT -p ICMP -j ACCEPT у нас уже не получится и вообще на попытку обратиться к iptables мы получим отказ. Собственно просто придется настраивать его другими командами.

И что же мы имеем полезного или не очень отказавшись от привычных способов управления:

  1.  Возможность изменения правил без перезагрузки службы: Firewalld запускается как служба и при конфигурации учитывает и применяет только различия в правилах. Отсюда вытекает (или не вытекает, но по факту есть) важное свойство, а именно можно менять правила не разрывая существующие соединения. Это однако достойное нововведение. (Поступило замечание, о том, что iptables тоже не разрывает соединения при перезагрузке таблиц, так что возможность эта не такое и новшество. Однако так как на сайте красногорячих этот пунк подан как нововведение, пока осавлю его без изменений, при случае потестирую и опишу результат)
  2.  Концепция зон: Fierwalld оперирует понятиями сетевой зоны. Сетевая зона как сказано в описании определяет уровень доверия сетевому подключению. По русски это можно понять как предустановленный набор правил который можно назначить подключению (по крайней мере я так понял). Очевидно что, во избежании конфликтов правил, одно подключение может находиться только в одной зон, а вот в зону можно добавлять сколько угодно подключений.

Авторы создали набор предопределенных зон :

  • drop – как и следовало ожидать входящие сетевые пакеты сбрасываются, без ответа, допускаются только исходящие соединения
  • block – входящие сетевые соединения отклоняются с сообщением icmp-host-prohibited для Ipv4 и icmp6-adm-prohibited для IPv6, допускаются только сетевые соединения инициированные внутри нашей системы.
  • public – для использования в сети с не доверенными компьютерами (в парке наверное, вы ведь часто выводите свои сервера в парк на прогулку), разрешается устанавливать только конкретные входящие соединения.
  • external – для использования во внешних сетях с разрешенным маскарадингом, особенно для роутеров, разрешается устанавливать только конкретные входящие соединения
  • dmz – для компьютеров собственной демилитаризованной зоне с ограниченным доступом к вашей внутренней сети, разрешается устанавливать только конкретные входящие соединения.
  • work/home/internal – Для всех трёх зон в описании примерно та же вода, плюс: максимальное доверие к компьютерам, уверенность в том, что они не причинят вреда нашему компьютеру, разрешается устанавливать только конкретные входящие соединения
  • trusted – Специальная зона для тёщи, все сетевые соединения разрешены.

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

Для того чтобы управлять всем этим богатством возможностей существует два основных инструмента:

  1.  firewall-config с графическим интерфейсом, которой я никогда не видел, так как у меня нет ни одной машины с firewalld и графическим интерфейсом. Так что поверив опсанию сообщаю что она очень удобна и умеет много всего.
  2.  firewall-cmd утилита командной строки которая не менее полезна и тоже умеет много всего, но об это поподробнее:

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

Итак:

#firewall-cmd --zone=[нужная_зона] --add-port=5280/tcp --permanent
#firewall-cmd --reload

В нашем случае нужная_зона это public мы ведь открываем порт параметр --permanent добавлен для того чтобы изменения хранились постоянно, если его опустить, то сделанные настройки пропадут после перезагрузки.

Первой командой мы открыли порт вэб-интерфейса ejabberd (у вас соответственно будет свой порт), второй перезагрузили правила. Firewolld конечно сервис динамический, но как подсказали внимательные комментаторы настройка сделанные с параметром --permanent хранятся постоянно, но для их применения требуется reload. Настройки сделанные в runtime применяются сразу, но для их сохранения нужно запустить firewall-cmd с ключом --runtime-to-permanent, иначе после перезагрузки они исчезнут.

И конечно на всякий случай:

#firewall-cmd [--zone=нужная_зона] --list-ports

Если мы указываем вместо нужная_зона public то получим список открытых портов. Если написать --list-services то можно посмотреть список сервисов порты для которых открыты (сервисы добавлены в зону public). В зону можно добавлять как порт так и сервис (и не только) и если вы добавили в зону public сервис, то порт на котором он работает не отображается в списке портов.

Вообще насколько я понял все параметры программы firewall-cmd пришутся с двумя тире -- впереди. Вот список основных полезных нарытый на просторах интернета:
firewall-cmd

[--zone=нужная_зона] --list-services Просмотреть список сервисов в зоне
[--zone=нужная_зона] --list-ports Просмотреть список портов в зоне
--permanent объявить вносимые изменеия постоянными
--state   узнать состояние FirewallD
 --reload  перезагрузить FirewallD
 --get-zones  вывести список всех заданных зон
 --get-services  список всех поддерживаемых служб
--get-active-zones список всех активных зон
[--zone=нужная_зона] --add-interface=интерфейс добавить интерфейс к зоне
[--zone=нужная_зона] --change-interface= интерфейс изменить интерфейс
[--zone=нужная_зона] --remove-interface= интерфейс удалить интерфейс из зоны
--panic-on режим паники, блокирующий все сетевые соединения
--panic-off  отмена режима паники
[--zone=нужная_зона] --add-service=нужный_сервис [--timeout=] добавить службу к зоне
[--zone=нужная_зона] --remove-service= нужный_сервис [--timeout=] - удалить службу из зоны
[--zone=нужная_зона] --add-port=[-]/ [--timeout=]       добавить порт к зоне
[--zone=нужная_зона] --remove-port=[-]/ [--timeout=]  удалить порт из зоны
[--zone=нужная_зона] --add-masquerade добавить маскарадинг к зоне
[--zone=нужная_зона] --remove-masquerade   удалить маскарадинг
[--zone=нужная_зона] --add-forward-port=port=[-]:proto= { :toport=[-] | :toaddr=| :toport=[-]:toaddr=} добавить проброс портов к зоне
[--zone=нужная_зона] --remove-forward-port=port=[-]:proto= { :toport=[-] | :toaddr=| :toport=[-]:toaddr=} удалить проброс портов из зоны
Более полный список параметров firewall-cmd то можно найти тут.

Комментарии  

#1 Sergey 02.07.2016 10:20
Добрый день!
Некоторая критика:
Возможность изменения правил без перезагрузки службы: Firewalld запускается как служба и при конфигурации учитывает и применяет только различия в правилах. Отсюда вытекает (или не вытекает, но по факту есть) важное свойство, а именно можно менять правила не разрывая существующие соединения.

При reload iptables соединения также не разрываются, просто перечитываются правила. systemctl reload iptables.service или service iptables reload. Так что этот функционал возможен как в firewalld, так и в старых добрых iptables. Проверял лично на CentOS 6 и 7.
Цитировать
#2 Евгений 24.07.2016 06:11
Цитирую Sergey:

При reload iptables соединения также не разрываются, просто перечитываются правила. systemctl reload iptables.service или service iptables reload. Так что этот функционал возможен как в firewalld, так и в старых добрых iptables. Проверял лично на CentOS 6 и 7.


Добавил в статью поправку, при наличии свободного времени непременно попробую и перепишу абзац :) Большое спасибо.
Цитировать
#3 Aleq Qery 21.05.2017 12:34
Цитата:
Firewolld конечно сервис динамический, но без – reload порт не открывался :)
Reload потребовался потому, что в команде вы указали ключ --permanent. У firewalld два, так сказать, места, где хранится конфигурация -- это runtime и permanent (примерно как в аппаратных маршрутизатораз Cisco, например). --permanent -- это сохранить в конфиг. Если правило задавать без этого ключа, то оно применится сразу. Но не будет отражено в конфиге :-) Чтобы текущую runtime-конфигурацию перенести в конфиг, нужно выполнить команду:

firewall-cmd --runtime-to-permanent
Цитировать
#4 Евгений 21.05.2017 12:57
Цитирую Aleq Qery:
Цитата:
Firewolld конечно сервис динамический, но без – reload порт не открывался :)

firewall-cmd --runtime-to-permanent
Спасибо большое :) Я тут когда-то man переводил ( http://kyrych.ru/linux/32-linuxfirewall/56-shpargalka-po-parametram-fierwalld-cmd), там такой параметр не был описан.
Цитировать