Как настроить брандмауэр с помощью FirewallD в CentOS 7

Вступление

Firewalld - это решение для управления межсетевым экраном, доступное для многих дистрибутивов Linux, которое выступает в качестве интерфейса для системы фильтрации пакетов iptables, предоставляемой ядром Linux. В этом руководстве мы расскажем, как настроить брандмауэр для вашего сервера, и покажем вам основы управления брандмауэром с помощью инструмента администрированияfirewall-cmd (если вы предпочитаете использоватьiptables с CentOS, следуйте this guide).

[.note] #Note: Есть вероятность, что вы работаете с более новой версией firewalld, чем была доступна на момент написания этой статьи, или что ваш сервер был настроен несколько иначе, чем сервер в качестве примера, использованный повсюду это руководство. Таким образом, поведение некоторых команд, описанных в этом руководстве, может отличаться в зависимости от вашей конкретной конфигурации.
#

Основные понятия в Firewalld

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

зон

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

Для компьютеров, которые могут часто перемещаться между сетями (например, ноутбуки), такая гибкость обеспечивает хороший способ изменения ваших правил в зависимости от вашей среды. У вас могут быть строгие правила, запрещающие большую часть трафика при работе в общедоступной сети Wi-Fi, а также более мягкие ограничения при подключении к домашней сети. Для сервера эти зоны не так важны, поскольку сетевое окружение редко, если вообще меняется.

Независимо от того, насколько динамичной может быть ваша сетевая среда, все же полезно ознакомиться с общей идеей каждой из предопределенных зон дляfirewalld. В порядке отleast trusted доmost trusted предопределенные зоны в пределахfirewalld:

  • drop: самый низкий уровень доверия. Все входящие соединения сбрасываются без ответа, и возможны только исходящие соединения.

  • block: аналогично предыдущему, но вместо того, чтобы просто отбрасывать соединения, входящие запросы отклоняются с сообщениемicmp-host-prohibited илиicmp6-adm-prohibited.

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

  • external: Внешние сети в случае, если вы используете брандмауэр в качестве шлюза. Он настроен на маскировку NAT, поэтому ваша внутренняя сеть остается частной, но доступной.

  • internal: другая сторона внешней зоны, используемая для внутренней части шлюза. Компьютеры достаточно надежны и доступны некоторые дополнительные услуги.

  • dmz: используется для компьютеров, находящихся в DMZ (изолированные компьютеры, которые не будут иметь доступа к остальной части вашей сети). Разрешены только определенные входящие соединения.

  • work: Используется для рабочих машин. Доверяйте большинству компьютеров в сети. Еще несколько услуг могут быть разрешены.

  • home: домашняя среда. Обычно это означает, что вы доверяете большинству других компьютеров и что будут приняты еще несколько сервисов.

  • trusted: доверять всем машинам в сети. Наиболее открытый из доступных вариантов и должен использоваться экономно.

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

Правило Постоянство

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

Большинство операцийfirewall-cmd могут принимать флаг--permanent, чтобы указать, что целевой брандмауэр не является временным. Это повлияет на набор правил, который перезагружается при загрузке. Это разделение означает, что вы можете проверить правила в своем активном экземпляре брандмауэра, а затем перезагрузить его, если возникнут проблемы. Вы также можете использовать флаг--permanent для построения всего набора правил с течением времени, которые будут применяться сразу после выполнения команды перезагрузки.

Установите и включите брандмауэр для запуска при загрузке

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

sudo yum install firewalld

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

sudo systemctl enable firewalld
sudo reboot

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

Мы можем проверить, что сервис работает и доступен, набрав:

sudo firewall-cmd --state
outputrunning

Это указывает на то, что наш брандмауэр работает с настройками по умолчанию.

Знакомство с текущими правилами брандмауэра

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

Изучение значений по умолчанию

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

firewall-cmd --get-default-zone
outputpublic

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

firewall-cmd --get-active-zones
outputpublic
  interfaces: eth0 eth1

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

Как мы узнаем, какие правила связаны с публичной зоной? Мы можем распечатать конфигурацию зоны по умолчанию, набрав:

sudo firewall-cmd --list-all
outputpublic (default, active)
  target: default
  icmp-block-inversion: no
  interfaces: eth0 eth1
  sources:
  services: ssh dhcpv6-client
  ports:
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

По выходным данным мы можем сказать, что эта зона является как активной по умолчанию, так и активной, и что интерфейсыeth0 иeth1 связаны с этой зоной (мы уже знали все это из наших предыдущих запросов). Однако мы также видим, что эта зона позволяет выполнять обычные операции, связанные с DHCP-клиентом (для назначения IP-адресов) и SSH (для удаленного администрирования).

Изучение альтернативных зон

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

Чтобы получить список доступных зон, введите:

firewall-cmd --get-zones
outputblock dmz drop external home internal public trusted work

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

sudo firewall-cmd --zone=home --list-all
outputhome
  interfaces:
  sources:
  services: dhcpv6-client ipp-client mdns samba-client ssh
  ports:
  masquerade: no
  forward-ports:
  icmp-blocks:
  rich rules:

Вы можете вывести все определения зон, используя опцию--list-all-zones. Возможно, вы захотите направить вывод в пейджер для более удобного просмотра:

sudo firewall-cmd --list-all-zones | less

Выбор зон для ваших интерфейсов

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

Изменение зоны интерфейса

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

Например, мы можем перевести наш интерфейсeth0 в «домашнюю» зону, набрав это:

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

Note

[.note] # Каждый раз, когда вы переводите интерфейс в новую зону, имейте в виду, что вы, вероятно, изменяете службы, которые будут работать. Например, здесь мы переходим в «домашнюю» зону, в которой доступен SSH. Это означает, что наше соединение не должно прерываться. В некоторых других зонах SSH не включен по умолчанию, и если ваше соединение будет разорвано при использовании одной из этих зон, вы можете оказаться не в состоянии снова войти в систему.
#

Мы можем проверить, что это было успешно, снова запросив активные зоны:

firewall-cmd --get-active-zones
outputhome
  interfaces: eth0
public
  interfaces: eth1

Регулировка зоны по умолчанию

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

Вы можете изменить зону по умолчанию с помощью параметра--set-default-zone=. Это немедленно изменит любой интерфейс, который по умолчанию вернулся к новой зоне:

sudo firewall-cmd --set-default-zone=home
outputsuccess

Настройка правил для ваших приложений

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

Добавление сервиса в ваши зоны

Самый простой способ - добавить нужные вам сервисы или порты в зоны, которые вы используете. Опять же, вы можете получить список доступных сервисов с опцией--get-services:

firewall-cmd --get-services
outputRH-Satellite-6 amanda-client amanda-k5-client bacula bacula-client bitcoin bitcoin-rpc bitcoin-testnet bitcoin-testnet-rpc ceph ceph-mon cfengine condor-collector ctdb dhcp dhcpv6 dhcpv6-client dns docker-registry dropbox-lansync elasticsearch freeipa-ldap freeipa-ldaps freeipa-replication freeipa-trust ftp ganglia-client ganglia-master high-availability http https imap imaps ipp ipp-client ipsec iscsi-target kadmin kerberos kibana klogin kpasswd kshell ldap ldaps libvirt libvirt-tls managesieve mdns mosh mountd ms-wbt mssql mysql nfs nrpe ntp openvpn ovirt-imageio ovirt-storageconsole ovirt-vmconsole pmcd pmproxy pmwebapi pmwebapis pop3 pop3s postgresql privoxy proxy-dhcp ptp pulseaudio puppetmaster quassel radius rpc-bind rsh rsyncd samba samba-client sane sip sips smtp smtp-submission smtps snmp snmptrap spideroak-lansync squid ssh synergy syslog syslog-tls telnet tftp tftp-client tinc tor-socks transmission-client vdsm vnc-server wbem-https xmpp-bosh xmpp-client xmpp-local xmpp-server

Note

[.Примечание]##

Вы можете получить более подробную информацию о каждой из этих служб, просмотрев связанный с ними файл.xml в каталоге/usr/lib/firewalld/services. Например, служба SSH определяется следующим образом:

/usr/lib/firewalld/services/ssh.xml



  SSH
  Secure 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.
  
 +
You can enable a service for a zone using the `+--add-service=+` parameter. The operation will target the default zone or whatever zone is specified by the `+--zone=+` parameter. By default, this will only adjust the current firewall session. You can adjust the permanent firewall configuration by including the `+--permanent+` flag.

Например, если мы запускаем веб-сервер, обслуживающий обычный HTTP-трафик, мы можем разрешить этот трафик для интерфейсов в нашей «публичной» зоне для этого сеанса, набрав:

sudo firewall-cmd --zone=public --add-service=http

Вы можете не указывать--zone=, если хотите изменить зону по умолчанию. Мы можем проверить, что операция прошла успешно, используя операции--list-all или--list-services:

sudo firewall-cmd --zone=public --list-services
outputdhcpv6-client http ssh

После того, как вы проверили, что все работает должным образом, вы, вероятно, захотите изменить правила постоянного брандмауэра, чтобы ваша служба все еще была доступна после перезагрузки. Мы можем сделать изменение нашей «публичной» зоны постоянным, набрав:

sudo firewall-cmd --zone=public --permanent --add-service=http
outputsuccess

Вы можете убедиться, что это было успешно, добавив флаг--permanent к операции--list-services. Вам нужно использоватьsudo для любых операций--permanent:

sudo firewall-cmd --zone=public --permanent --list-services
outputdhcpv6-client http ssh

Ваша «публичная» зона теперь будет разрешать HTTP-трафик через порт 80. Если ваш веб-сервер настроен на использование SSL / TLS, вы также захотите добавить службуhttps. Мы можем добавить это к текущему сеансу и постоянному набору правил, набрав:

sudo firewall-cmd --zone=public --add-service=https
sudo firewall-cmd --zone=public --permanent --add-service=https

Что делать, если соответствующая услуга недоступна?

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

В этой ситуации у вас есть два варианта.

Открытие порта для ваших зон

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

Например, если наше приложение работает на порту 5000 и использует TCP, мы могли бы добавить его в «общедоступную» зону для этого сеанса с помощью параметра--add-port=. Протоколы могут бытьtcp илиudp:

sudo firewall-cmd --zone=public --add-port=5000/tcp
outputsuccess

Мы можем проверить, что это было успешно, используя операцию--list-ports:

sudo firewall-cmd --zone=public --list-ports
output5000/tcp

Также можно указать последовательный диапазон портов, разделив начальный и конечный порт в диапазоне с помощью тире. Например, если наше приложение использует UDP-порты с 4990 по 4999, мы можем открыть их в «public», набрав:

sudo firewall-cmd --zone=public --add-port=4990-4999/udp

После тестирования мы, вероятно, захотим добавить их в постоянный брандмауэр. Вы можете сделать это, набрав:

sudo firewall-cmd --zone=public --permanent --add-port=5000/tcp
sudo firewall-cmd --zone=public --permanent --add-port=4990-4999/udp
sudo firewall-cmd --zone=public --permanent --list-ports
outputsuccess
success
5000/tcp 4990-4999/udp

Определение сервиса

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

Сервисы - это просто наборы портов со связанным именем и описанием. Использование сервисов проще в администрировании, чем портов, но требует некоторой предварительной работы. Самый простой способ начать - скопировать существующий сценарий (находящийся в/usr/lib/firewalld/services) в каталог/etc/firewalld/services, где брандмауэр ищет нестандартные определения.

Например, мы могли бы скопировать определение службы SSH, чтобы использовать его для нашего «примера» определения службы следующим образом. Имя файла без суффикса.xml будет определять имя службы в списке служб брандмауэра:

sudo cp /usr/lib/firewalld/services/ssh.xml /etc/firewalld/services/example.xml

Теперь вы можете настроить определение, найденное в файле, который вы скопировали:

sudo vi /etc/firewalld/services/example.xml

Для начала файл будет содержать определение SSH, которое вы скопировали:

/etc/firewalld/services/example.xml



  SSH
  Secure 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.
  

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

Для нашего «примера» службы представьте, что нам нужно открыть порт 7777 для TCP и 8888 для UDP. Войдя в режим INSERT, нажавi, мы можем изменить существующее определение примерно так:

/etc/firewalld/services/example.xml



  Example Service
  This is just an example service.  It probably shouldn't be used on a real system.
  
  

НажмитеESC, затем введите:x, чтобы сохранить и закрыть файл.

Перезагрузите брандмауэр, чтобы получить доступ к вашему новому сервису:

sudo firewall-cmd --reload

Вы можете видеть, что теперь он входит в список доступных услуг:

firewall-cmd --get-services
outputRH-Satellite-6 amanda-client amanda-k5-client bacula bacula-client bitcoin bitcoin-rpc bitcoin-testnet bitcoin-testnet-rpc ceph ceph-mon cfengine condor-collector ctdb dhcp dhcpv6 dhcpv6-client dns docker-registry dropbox-lansync elasticsearch example freeipa-ldap freeipa-ldaps freeipa-replication freeipa-trust ftp ganglia-client ganglia-master high-availability http https imap imaps ipp ipp-client ipsec iscsi-target kadmin kerberos kibana klogin kpasswd kshell ldap ldaps libvirt libvirt-tls managesieve mdns mosh mountd ms-wbt mssql mysql nfs nrpe ntp openvpn ovirt-imageio ovirt-storageconsole ovirt-vmconsole pmcd pmproxy pmwebapi pmwebapis pop3 pop3s postgresql privoxy proxy-dhcp ptp pulseaudio puppetmaster quassel radius rpc-bind rsh rsyncd samba samba-client sane sip sips smtp smtp-submission smtps snmp snmptrap spideroak-lansync squid ssh synergy syslog syslog-tls telnet tftp tftp-client tinc tor-socks transmission-client vdsm vnc-server wbem-https xmpp-bosh xmpp-client xmpp-local xmpp-server

Теперь вы можете использовать эту услугу в своих зонах, как обычно.

Создание ваших собственных зон

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

Например, вы можете создать зону для вашего веб-сервера, которая называется publicweb. Однако вам может потребоваться настроить другую зону для службы DNS, которую вы предоставляете в своей частной сети. Для этого вам может потребоваться зона под названием «privateDNS».

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

sudo firewall-cmd --permanent --new-zone=publicweb
sudo firewall-cmd --permanent --new-zone=privateDNS

Вы можете убедиться, что они присутствуют в вашей постоянной конфигурации, набрав:

sudo firewall-cmd --permanent --get-zones
outputblock dmz drop external home internal privateDNS public publicweb trusted work

Как указывалось ранее, они не будут доступны в текущем экземпляре брандмауэра:

firewall-cmd --get-zones
outputblock dmz drop external home internal public trusted work

Перезагрузите брандмауэр, чтобы привести эти новые зоны в активную конфигурацию:

sudo firewall-cmd --reload
firewall-cmd --get-zones
outputblock dmz drop external home internal privateDNS public publicweb trusted work

Теперь вы можете начать назначать соответствующие сервисы и порты для ваших зон. Обычно рекомендуется настроить активный экземпляр, а затем перенести эти изменения в постоянную конфигурацию после тестирования. Например, для зоны publicweb вы можете добавить службы SSH, HTTP и HTTPS:

sudo firewall-cmd --zone=publicweb --add-service=ssh
sudo firewall-cmd --zone=publicweb --add-service=http
sudo firewall-cmd --zone=publicweb --add-service=https
sudo firewall-cmd --zone=publicweb --list-all
outputpublicweb
  target: default
  icmp-block-inversion: no
  interfaces:
  sources:
  services: ssh http https
  ports:
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

Аналогично, мы можем добавить службу DNS в нашу зону «privateDNS»:

sudo firewall-cmd --zone=privateDNS --add-service=dns
sudo firewall-cmd --zone=privateDNS --list-all
outputprivateDNS
  interfaces:
  sources:
  services: dns
  ports:
  masquerade: no
  forward-ports:
  icmp-blocks:
  rich rules:

Затем мы можем изменить наши интерфейсы на эти новые зоны, чтобы проверить их:

sudo firewall-cmd --zone=publicweb --change-interface=eth0
sudo firewall-cmd --zone=privateDNS --change-interface=eth1

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

sudo firewall-cmd --zone=publicweb --permanent --add-service=ssh
sudo firewall-cmd --zone=publicweb --permanent --add-service=http
sudo firewall-cmd --zone=publicweb --permanent --add-service=https
sudo firewall-cmd --zone=privateDNS --permanent --add-service=dns

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

sudo systemctl restart network
sudo systemctl reload firewalld

Убедитесь, что были назначены правильные зоны:

firewall-cmd --get-active-zones
outputprivateDNS
  interfaces: eth1
publicweb
  interfaces: eth0

И проверьте, что соответствующие сервисы доступны для обеих зон:

sudo firewall-cmd --zone=publicweb --list-services
outputhttp https ssh
sudo firewall-cmd --zone=privateDNS --list-services
outputdns

Вы успешно создали свои собственные зоны! Если вы хотите сделать одну из этих зон по умолчанию для других интерфейсов, не забудьте настроить это поведение с помощью параметра--set-default-zone=:

sudo firewall-cmd --set-default-zone=publicweb

Заключение

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

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

Related