Как настроить межсетевой экран с FirewallD на CentOS 7
Как настроить межсетевой экран с FirewallD на CentOS 7
How to Set Up a Firewall with FirewallD on CentOS 7
В этом руководстве мы покажем вам, как настроить брандмауэр с FirewallD в вашей системе CentOS 7, и объясним вам основные концепции FirewallD.
Правильно настроенный межсетевой экран является одним из наиболее важных аспектов общей безопасности системы.
FirewallD — это законченное решение брандмауэра, которое управляет системными правилами iptables и предоставляет интерфейс D-Bus для их работы. Начиная с CentOS 7, FirewallD заменяет iptables как инструмент управления брандмауэром по умолчанию.
Перед началом работы с этим учебным курсом убедитесь, что вы вошли на свой сервер с учетной записью пользователя с привилегиями sudo или с пользователем root. Лучше всего запускать административные команды как пользователь sudo вместо root. Если у вас нет пользователя sudo в вашей системе CentOS, вы можете создать его, следуя этим инструкциям .
Основные концепции Firewalld
FirewallD использует понятия зон и сервисов вместо цепочки и правил iptables. На основе зон и служб, которые вы настраиваете, вы можете контролировать, какой трафик разрешен или запрещен в систему и из нее.
FirewallD можно настроить и управлять с помощью firewall-cmd утилиты командной строки.
Firewalld Zones
Зоны — это предопределенные наборы правил, определяющие, какой трафик должен быть разрешен в зависимости от уровня доверия в сетях, к которым подключен ваш компьютер. Вы можете назначить сетевые интерфейсы и источники для зоны.
Ниже приведены зоны, предоставленные FirewallD, упорядоченные в соответствии с уровнем доверия зоны от ненадежного до доверенного:
- drop: все входящие соединения сбрасываются без какого-либо уведомления. Разрешены только исходящие соединения.
- block: все входящие соединения отклоняются с icmp-host-prohibited сообщением для IPv4 и icmp6-adm-prohibited для IPv6n. Разрешены только исходящие соединения.
- public: для использования в ненадежных общественных местах. Вы не доверяете другим компьютерам в сети, но можете разрешить выбранные входящие подключения.
- external: для использования во внешних сетях с включенным маскированием NAT, когда ваша система выступает в качестве шлюза или маршрутизатора. Разрешены только выбранные входящие соединения.
- internal: для использования во внутренних сетях, когда ваша система выступает в качестве шлюза или маршрутизатора. Другие системы в сети, как правило, доверяют. Разрешены только выбранные входящие соединения.
- dmz : используется для компьютеров, расположенных в демилитаризованной зоне, которые имеют ограниченный доступ к остальной части вашей сети. Разрешены только выбранные входящие соединения.
- work: Используется для работы машин. Другие компьютеры в сети, как правило, являются доверенными. Разрешены только выбранные входящие соединения.
- home : Используется для домашних машин. Другие компьютеры в сети, как правило, являются доверенными. Разрешены только выбранные входящие соединения.
- trusted: все сетевые подключения принимаются. Доверяйте всем компьютерам в сети.
Услуги брандмауэра
Службы Firewalld — это предопределенные правила, которые применяются внутри зоны и определяют необходимые параметры, чтобы разрешить входящий трафик для определенной службы.
Firewalld Runtime и постоянные настройки
Firewalld использует два отдельных набора конфигурации, среду выполнения и постоянную конфигурацию.
Конфигурация времени выполнения является фактической рабочей конфигурацией, и она не является постоянной при перезагрузке. Когда служба Firewalld запускается, она загружает постоянную конфигурацию, которая становится конфигурацией времени выполнения.
По умолчанию при внесении изменений в конфигурацию Firewalld с помощью firewall-cmd утилиты эти изменения применяются к конфигурации времени выполнения. Чтобы сделать изменения постоянными, вам нужно использовать —permanent опцию.
Установка и включение FirewallD
Firewalld по умолчанию устанавливается в CentOS 7, но если он не установлен в вашей системе, вы можете установить пакет, набрав:
Сервис Firewalld по умолчанию отключен. Вы можете проверить состояние брандмауэра с помощью:
Если вы только что установили или никогда не активировали ранее, команда напечатает not running . В противном случае вы увидите running .
Чтобы запустить службу FirewallD и включить ее при загрузке, введите:
Работа с Firewalld Zones
После первого включения службы FirewallD public зона становится зоной по умолчанию. Вы можете просмотреть зону по умолчанию, набрав:
Чтобы получить список всех доступных зон, введите:
По умолчанию всем сетевым интерфейсам назначена зона по умолчанию. Чтобы проверить, какие зоны используются вашим сетевым интерфейсом (ами), наберите:
Вывод выше говорит нам, что оба интерфейса eth0 и eth1 назначены для публичной зоны.
Вы можете распечатать настройки конфигурации зоны с помощью:
Из приведенного выше вывода, мы можем видеть , что публика зона активна и набор по умолчанию, используемый как eth0 и eth1 интерфейсов. Также разрешены подключения, связанные с DHCP-клиентом и SSH.
Если вы хотите проверить настройки всех доступных зон, введите:
Команда выводит огромный список с настройками всех доступных зон.
Изменение зоны интерфейса
Вы можете легко изменить интерфейсную зону, используя —zone опцию using в сочетании с —change-interface опцией. Следующая команда назначит eth1 интерфейс рабочей зоне:
Проверьте изменения, набрав:
Изменение зоны по умолчанию
Чтобы изменить зону по умолчанию, используйте —set-default-zone параметр, за которым следует имя зоны, которую вы хотите установить по умолчанию.
Например, чтобы изменить зону по умолчанию на домашнюю, вы должны выполнить следующую команду:
Проверьте изменения с помощью:
Открытие порта или службы
С FirewallD вы можете разрешить трафик для определенных портов на основе предопределенных правил, называемых сервисами.
Чтобы получить список всех доступных по умолчанию сервисов, наберите:
Вы можете найти больше информации о каждой службе, открыв соответствующий XML-файл в /usr/lib/firewalld/services каталоге. Например, служба HTTP определяется следующим образом:
Чтобы разрешить входящий трафик HTTP (порт 80) для интерфейсов в публичной зоне, только для текущего сеанса (конфигурация времени выполнения) введите:
Чтобы убедиться, что служба была добавлена успешно, используйте —list-services параметр:
Если вы хотите оставить порт 80 открытым после перезагрузки, вам нужно будет набрать ту же команду еще раз, но на этот раз с —permanent опцией:
Используйте —list-services вместе с —permanent опцией, чтобы проверить ваши изменения:
Синтаксис для удаления службы такой же, как и при добавлении службы. Просто используйте —remove-service вместо —add-service опции:
Приведенная выше команда удаляет службу http из постоянной конфигурации публичной зоны.
Что если вы используете приложение, такое как Plex Media Server, для которого нет подходящей службы?
В подобных ситуациях у вас есть два варианта. Вы можете открыть соответствующие порты или определить новую службу FirewallD.
Например, Plex Server прослушивает порт 32400 и использует TCP, чтобы открыть порт в публичной зоне для текущего сеанса, используйте —add-port= параметр:
Чтобы убедиться, что порт был успешно добавлен, используйте —list-ports параметр:
Чтобы оставить порт 32400 открытым после перезагрузки, добавьте правило к постоянным настройкам, выполнив ту же команду с помощью —permanent параметра.
Синтаксис для удаления порта такой же, как и при добавлении порта. Просто используйте —remove-port вместо —add-port опции.
Создание новой службы FirewallD
Как мы уже упоминали, службы по умолчанию хранятся в /usr/lib/firewalld/services каталоге. Самый простой способ создать новую службу — скопировать существующий файл службы в /etc/firewalld/services каталог, в котором находятся созданные пользователем службы, и изменить параметры файла.
Например, чтобы создать определение сервиса для Plex Media Server, мы можем использовать файл сервиса SSH:
Откройте вновь созданный plexmediaserver.xml файл и изменить краткое имя и описание службы в пределах <short> и <description> тегов. Самый важный тег, который вам нужно изменить, — это port тег, который определяет номер порта и протокол, который вы хотите открыть.
В следующем примере мы открываем порты 1900 UDP и 32400 TCP.
Сохраните файл и перезагрузите службу FirewallD:
Теперь вы можете использовать plexmediaserver сервис в своих зонах так же, как и любой другой сервис.
Порт переадресации с Firewalld
Для пересылки трафика с одного порта на другой порт или адрес сначала включите маскирование для нужной зоны с помощью —add-masquerade коммутатора. Например, чтобы включить маскировку для external типа зоны:
- Переадресация трафика с одного порта на другой на том же сервере
В следующем примере мы перенаправляем трафик от порта 80 к порту 8080 на одном сервере:
- Переадресация трафика на другой сервер
В следующем примере мы перенаправляем трафик от порта 80 к порту 80 на сервере с IP 10.10.10.2 :
- Переадресация трафика на другой сервер через другой порт
В следующем примере мы перенаправляем трафик от порта 80 к порту 8080 на сервере с IP 10.10.10.2 :
Если вы хотите сделать перманент перманентом, просто добавьте —permanent опцию.
Создание набора правил с помощью FirewallD
В следующем примере мы покажем, как настроить брандмауэр, если вы используете веб-сервер. Мы предполагаем, что ваш сервер имеет только один интерфейс eth0 , и вы хотите разрешить входящий трафик только через порты SSH, HTTP и HTTPS.
Измените зону по умолчанию на dmz
Мы будем использовать зону dmz (demilitarized), потому что по умолчанию она разрешает только SSH-трафик. Чтобы изменить зону по умолчанию на dmz и назначить ее eth0 интерфейсу, выполните следующие команды:
Откройте порты HTTP и HTTPS:
Чтобы открыть порты HTTP и HTTPS, добавьте правила постоянного обслуживания в зону dmz:
Чтобы изменения вступили в силу немедленно, перезагрузите брандмауэр:
Чтобы проверить параметры конфигурации зоны dmz, введите:
Вывод выше говорит нам, что dmz является зоной по умолчанию, применяется к eth0 интерфейсу и порты ssh (22) http (80) и https (443) открыты.
Вывод
Вы узнали, как настроить и управлять службой FirewallD в вашей системе CentOS.
Обязательно разрешите все входящие соединения, которые необходимы для правильного функционирования вашей системы, одновременно ограничивая все ненужные соединения.
CentOS 7: настройка firewall-cmd
Для начала посмотрим стату демона:
systemctl status firewalld
● firewalld.service — firewalld — dynamic firewall daemon
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled)
Active: active (running) since Thu 2019-01-24 04:22:44 EST; 2 weeks 4 days ago
Docs: man:firewalld(1)
Main PID: 683 (firewalld)
Tasks: 2
Memory: 908.0K
CGroup: /system.slice/firewalld.service
└─683 /usr/bin/python -Es /usr/sbin/firewalld —nofork —nopid
Просто проверить статус можно так:
firewall-cmd —state
running
Добавлениеудаление из автозагрузки:
systemctl disable firewalld
systemctl enable firewalld
Остановказапуск сервиса:
systemctl stop firewalld
systemctl start firewalld
Выведем зону по умолчанию:
firewall-cmd —get-default-zone
public
Кстати изменить ее можно например так:
firewall-cmd —set-default-zone=home
Так-же в файрволле есть понятие "зоны", выведем их список:
firewall-cmd —get-zones
block dmz drop external home internal public trusted work
Выведем список активных зон:
firewall-cmd —get-active-zones
public
interfaces: enp0s3
Что означают зоны:
block — входящие соединения отклоняются (reject) с ответом icmp-host-prohibited icmp6-adm-prohibited, разрешены соединения инициированные системой
dmz — демилитаризованная зона, разрешены указанные входящие соединения
drop — все входящие пакеты отклоняются (drop) без ответа, разрешены исходящие соединения
external — зона внешнего интерфейса, разрешены указанные входящие соединения
home — домашняя (доверенная) зона, разрешены указанные входящие соединения
internal — зона внутреннего интерфейса, разрешены указанные входящие соединения
public — по умолчанию, разрешаем указанные входящие соединения
trusted — разрешено все
work — зона рабочей сети, разрешены указанные входящие соединения
Из вывода мы видим, что интерфейс enp0s3 принадлежит зоне public
Добавить интейрфес в зону можно так:
firewall-cmd —get-zone-of-interface=enp0s3
Посмотрим файл сетевого интерфейса:
cat /etc/sysconfig/network-scripts/ifcfg-enp0s3 | grep ZONE
ZONE=public
Какие интерфейсы принадлежат зоне public:
firewall-cmd —zone=public —list-interfaces
enp0s3
Что вообще разрешено:
firewall-cmd —permanent —list-all
public
target: default
icmp-block-inversion: no
interfaces:
sources:
services: ssh dhcpv6-client
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
Задача: убрать неиспользуемый сервис dhcpv6-client, добавить ssh на нестандартном порту:
firewall-cmd —permanent —zone=public —remove-service=dhcpv6-client
firewall-cmd —permanent —zone=public —add-port=2222/tcp
Заметьте, permanent говорит о том, что правила сохранятся после перезагрузки
Перечитаем правила (без потери текущих соединений):
firewall-cmd —reload
Перечитаем правила (с потерей текущих соединений):
firewall-cmd —complete-reload
Проверим открытость порта:
firewall-cmd —zone=public —list-ports
Заставим ssh работать по этому порту:
vi /etc/ssh/sshd_config
Port 22
Port 2222
Рестартуем сервис:
systemctl restart sshd.service
Теперь нужно либо отключить selinux, т.к. он не даст работать ssh на нестандартном порту:
Отключить SELINUX
vim /etc/sysconfig/selinux
SELINUX=disabled
reboot
Либо решить задачу с помощью policycoreutils-python:
yum provides semanage
yum install policycoreutils-python
semanage port -a -t ssh_port_t -p tcp 2222
Проверяем, если есть подключение — уберем стандартный порт:
firewall-cmd —permanent —zone=public —remove-service=ssh
firewall-cmd —reload
Заметьте, permanent говорит о том, что правила сохранятся после перезагрузки
Несколько примеров возможных правил
Добавить диапазон портов:
firewall-cmd —zone=public —add-port=1025-1125/udp
Маскарадинг (masquerade, nat):
Проверить статус (возможно указать другую зону):
firewall-cmd —zone=external —query-masquerade
Включить:
firewall-cmd —zone=external —add-masquerade
Перенаправление входящие подключений с 22 порта на удаленный хост без изменения порта назначения:
firewall-cmd —zone=external —add-forward-port=port=22:proto=tcp:toaddr=10.0.2.30
Перенаправление входящие подключений с 22 порта на удаленный хост с изменением порта назначения:
firewall-cmd —zone=external —add-forward-port=port=22:proto=tcp:toport=2222:toaddr=10.0.2.30
Вывести список сервисов так:
firewall-cmd —get-services
RH-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 nfs3 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
Информацию о сервисах можно найти тут:
ls -l /usr/lib/firewalld/services/
-rw-r—r—. 1 root root 412 Apr 11 2018 amanda-client.xml
-rw-r—r—. 1 root root 447 Apr 11 2018 amanda-k5-client.xml
-rw-r—r—. 1 root root 320 Apr 11 2018 bacula-client.xml
-rw-r—r—. 1 root root 346 Apr 11 2018 bacula.xml
-rw-r—r—. 1 root root 275 Apr 11 2018 bitcoin-rpc.xml
-rw-r—r—. 1 root root 307 Apr 11 2018 bitcoin-testnet-rpc.xml
-rw-r—r—. 1 root root 281 Apr 11 2018 bitcoin-testnet.xml
-rw-r—r—. 1 root root 244 Apr 11 2018 bitcoin.xml
-rw-r—r—. 1 root root 294 Apr 11 2018 ceph-mon.xml
Вывод обрезан
.
Добавить http сервис в зону public (временно и постоянно):
firewall-cmd —zone=public —add-service=http
firewall-cmd —zone=public —permanent —add-service=http
Вывести список временных и постоянных правил из зоны public:
firewall-cmd —zone=public —list-services
firewall-cmd —zone=public —permanent —list-services
Если не нашли нужного сервиса, делаем так:
Способ 1, открытие портов:
Открываем порт 1025 протокола tcp в зоне public (временно или перманентно):
firewall-cmd —zone=public —add-port=1025/tcp
firewall-cmd —zone=public —permanent —add-port=1025/tcp
И проверяем:
firewall-cmd —list-ports
1025/tcp
Способ 2, оперделение сервисов:
Скопируем например конфиг ssh
cp /usr/lib/firewalld/services/ssh.xml /etc/firewalld/services/newssh.xml
vi /etc/firewalld/services/newssh.xml
<?xml version="1.0" encoding="utf-8"?>
<service>
<short>NEWSSH</short>
<description>Secure Shell (SSH) is a protocol on non standard ports</description>
<port protocol="tcp" port="2223"/>
<port protocol="tcp" port="2224"/>
</service>
Перечитаем правила:
firewall-cmd —reload
Сервис появился в списке:
firewall-cmd —get-services
. newssh .
Создание зон
Создадим зону с названием newsshzone:
firewall-cmd —permanent —new-zone=newsshzone
firewall-cmd —permanent —get-zones
. newsshzone .
Перечитаем конфиг, чтоб получить к ним доступ:
firewall-cmd —reload
Теперь можно работать с зоной (временно и перманентно):
firewall-cmd —zone=newsshzone —add-service=ssh
firewall-cmd —zone=newsshzone —permanent —add-service=ssh
И привязывать ее к интерфейсам:
firewall-cmd —zone=newsshzone —change-interface=enp0s3
Для постоянного связывания интерфейса с зоной прописываем его в конфиге:
vi /etc/sysconfig/network-scripts/ifcfg-enp0s3
ZONE=newsshzone
И перезагружаем сервисы:
sudo systemctl restart network
sudo systemctl restart firewalld
Проверяем:
firewall-cmd —get-active-zones
newsshzone
interfaces: enp0s3
firewall-cmd —zone=newsshzone —list-services
ssh
Назначить зону по умолчанию:
firewall-cmd —set-default-zone=newsshzone
Настройка firewalld в CentOS
Firewalld — утилита для управления встроенным в ядро Linux брандмауэром Netfilter. Несмотря на собственный синтаксис, имеет такой же принцип работы, как Iptables. Дополнительно про управление Netfilter при помощи последнего.
Установка и запуск
В некоторых системах CentOS может не оказаться firewalld. Для его установки вводим:
yum install firewalld
Для автоматического зауска вводим:
systemctl enable firewalld
И для запуска службы:
systemctl start firewalld
Общие команды для управления firewalld
Мягко перечитать правила (применить настройки):
Перечитать правила и сбросить текущие подключения:
* в официальной документации сказано, что данную команду стоит применять только в случаях проблем с firewalld.
Посмотреть созданные правила:
systemctl stop firewalld
systemctl start firewalld
systemctl disable firewalld
systemctl enable firewalld
Сохранить текущие правила, сделав их постоянными (permanent):
Управление правилами
Синтаксис
Общий синтаксис для работы с правилами:
firewall-cmd [опции] [зона] <правило>
* порядок следования параметров не важен.
- [опции] — дополнительные параметры для создаваемого правила, например —permanent — постоянное правило, то есть будет действовать после перезагрузки. Не обязательный.
- [зона] — по умолчанию, правила создаются для зоны public. Для работы с конкретной зоной ее необходимо указать, например, —zone=dmz. Не обязательный.
- <правило> — само правило. Обязательный.
Чтобы правила применялись, не забываем их перечитывать:
Добавление портов
Открыть порт 80:
firewall-cmd —permanent —add-port=80/tcp
* где ключ —permanent — добавить постоянное правило (будет действовать после перезагрузки).
Добавить правило для определенной зоны:
firewall-cmd —permanent —zone=external —add-port=80/tcp
Добавить диапазон портов:
firewall-cmd —permanent —add-port=6500-6700/udp
Добавить несколько правил одной командой:
firewall-cmd —permanent —add-port=80/tcp —add-port=443/tcp
Добавление сервиса
Использование служб, вместо портов, может повысить удобство управления правилами за счет объединения нескольких портов в одну службу.
Посмотреть список доступных служб:
Разрешить порт, например, для сервиса ntp:
firewall-cmd —permanent —add-service=ntp
Создать собственную службу:
firewall-cmd —permanent —new-service=name-service
* где name-service — произвольное имя создаваемой службы.
Добавить порт, например TCP 2200 к службе:
firewall-cmd —permanent —service=name-service —add-port=2200/tcp
Задать описание для удобства:
firewall-cmd —permanent —service=name-service —set-short="Service With This Name"
firewall-cmd —permanent —service=name-service —set-description="Long Description For Service With This Name"
Информацию о созданном сервисе можно получить командой:
Теперь созданную службу можно использовать для создания правил, например:
firewall-cmd —permanent —add-service=name-service
Rich-Rule
rich-rule позволяет создавать правила с условиями. Рассмотрим несколько примеров:
1. Разрешаем службу http с условием, что запросы будут с определенных IP-адресов (подсети 192.168.0):
firewall-cmd —permanent —add-rich-rule 'rule family="ipv4" source address="192.168.0.0/24" service name="http" accept'
2. Или для конкретного порта:
firewall-cmd —permanent —add-rich-rule 'rule family="ipv4" source address="192.168.0.0/24" port port="5038" protocol="tcp" accept'
3. Чтобы заблокировать подсеть можно воспользоваться командой:
firewall-cmd —permanent —add-rich-rule="rule family='ipv4' source address='192.168.1.0/24' reject"
Список правил с условиями можно отобразить командой:
Удаление правил
Аналогично созданию, но вместо add вводим remove, например —remove-port (удалит порт) или —remove-service (службу).
Удалим правило для открытия 80-о порта:
firewall-cmd —permanent —remove-port=80/tcp
Управление зонами
Все правила в firewalld могут быть разбиты по зонам. Для каждой свой набор правил и свои сетевые интерфейсы. Это нужно использовать, если мы захотим для разных сетевых адаптеров сделать разные по строгости правила.
Посмотреть список всех имеющихся зон:
Посмотреть список используемых зон:
Информация о конкретной зоне:
firewall-cmd —list-all —zone=public
Создать правило для зоны public:
firewall-cmd —permanent —zone=public —add-port=80/tcp
Добавить сетевой интерфейс в зону:
firewall-cmd —permanent —zone=public —remove-interface=ens34
firewall-cmd —permanent —zone=internal —add-interface=ens34
* сначала нужно удалить адаптер из текущей зоны.
Задать действие по умолчанию для зоны:
firewall-cmd —permanent —zone=public —set-target=DROP
Создать новую зону:
firewall-cmd —permanent —new-zone=custom_zone
* чтобы система увидела новую зону custom_zone, команда reload обязательная.
Пример настройки NAT (шлюза)
firewall-cmd —permanent —zone=dmz —add-masquerade
* без указания зон, будет включен для public и external.
Для примера берем два ethernet интерфейса — ens32 (внутренний) и ens33 (внешний). Для настройки nat последовательно вводим следующие 4 команды:
firewall-cmd —permanent —direct —add-rule ipv4 nat POSTROUTING 0 -o ens33 -j MASQUERADE
* правило включает маскарадинг на внешнем интерфейсе ens33. Где опция —direct требуется перед всеми пользовательскими правилами (—passthrough, —add-chain, —remove-chain, —query-chain, —get-chains, —add-rule, —remove-rule, —query-rule, —get-rules); nat — таблица, в которую стоит добавить правило; POSTROUTING 0 — цепочка в таблице nat; опция MASQUERADE указывает сетевому экрану менять внутренний IP-адрес на внешний.
firewall-cmd —direct —permanent —add-rule ipv4 filter FORWARD 0 -i ens32 -o ens33 -j ACCEPT
* добавляет в таблицу filter (цепочку FORWARD) правило, позволяющее хождение трафика с ens32 на ens33.
firewall-cmd —direct —permanent —add-rule ipv4 filter FORWARD 0 -i ens33 -o ens32 -m state —state RELATED,ESTABLISHED -j ACCEPT
* добавляет правило в таблицу filter (цепочку FORWARD), позволяющее хождение трафика с ens33 на ens32 для пакетов, открывающих новый сеанс, который связан с уже открытым другим сеансом (RELATED) и пакетов, которые уже являются частью существующего сеанса (ESTABLISHED).
systemctl restart firewalld
* для того, чтобы сервер CentOS заработал в качестве шлюза, также необходимо настроить ядро. Подробнее в статье Настройка Интернет шлюза на CentOS 7.
Для просмотра созданных данным способом правил используем команду:
firewall-cmd —direct —get-all-rules
Проброс портов
Проброс настраивается со следующим синтаксисом:
firewall-cmd —add-forward-port=port=<порт прослушивания>:proto=tcp|udp|sctp|dccp:toport=<порт назначения>:toaddr=<куда перенаправить>
firewall-cmd —zone=external —permanent —add-forward-port=port=25:proto=tcp:toport=8025:toaddr=192.168.0.15
* в данном примере мы будем слушать запросы на порту 25 и передодить их на узел 192.168.0.15 и порт 8025.
Запретить или разрешить трафик между интерфейсами
Предположим, у нас есть два внутренних сетевых интерфейса ens35 и ens36. Мы хотим контролировать трафик между ними.
Запретить
Применяется в случаях, когда на сервере включен FORWARD, но необходимо блокировать трафик между определенными сегменами сети.
Вводим следующие команды:
firewall-cmd —direct —permanent —add-rule ipv4 filter FORWARD 0 -i ens35 -o ens36 -j DROP
firewall-cmd —direct —permanent —add-rule ipv4 filter FORWARD 0 -i ens36 -o ens35 -j DROP
Разрешить
Применяется в случаях, когда интерфейсы находятся в зонах, где по умолчанию, трафик блокируется.
Для разрешения команды, практически, аналогичные:
firewall-cmd —direct —permanent —add-rule ipv4 filter FORWARD 0 -i ens35 -o ens36 -j ACCEPT
firewall-cmd —direct —permanent —add-rule ipv4 filter FORWARD 0 -i ens36 -o ens35 -j ACCEPT
Разрешить трафик в одном направлении
В предыдущих примерах мы разрешали трафик в обоих направлениях. Если необходимо сделать так, чтобы только сеть ens35 видела сеть ens36, вводим одну команду:
firewall-cmd —direct —permanent —add-rule ipv4 filter FORWARD 0 -i ens35 -o ens36 -j ACCEPT
Возможные проблемы при работе с firewalld
1. Ошибка command not found (команда не найдена).
Возможные причины: не установлен пакет или не запущена служба.
Выполняем установку пакета firewalld:
yum install firewalld firewall-config
systemctl start firewalld
2. Не применяются правила.
Причина: не введена команда перезапуска правил.
Если это не помогло, делаем перезапуск со сбросом подключений:
В некоторых случаях, необходимо перезапустить сетевые службы:
systemctl restart network
В исключительных случаях, перезагружаем компьютер:
3. The interface is under control of NetworkManager and already bound to the default zone.
Ошибка появляется при попытке удалить интерфейс из зоны, настройками которого управляет NetworkManager.
Для решения открываем конфигурационный файл для настройки сетевого интерфейса, например:
И дописываем следующее:
* в данном примере сетевой интерфейс ens34 будет добавлен в зону external.
Настройка FirewallD на сервере с CentOS 8 и 7
26.02.2021
VyacheslavK
CentOS, Linux
Один комментарий
Начиная с CentoOS 7 для настройки правил фильтрации трафика появился новый инструмент firewalld. Именно его рекомендуется использовать для управления правилами iptables. В CentOS 8 вместо стандартного пакета фильтрации iptables теперь используется фреймворк nftables, и при настройке правил файервола через firewalld на самом деле вы настраиваете nftables. В этой статье мы рассмотрим установку, основные концепции и настройку межсетевого экрана firewalld на сервере под управлением CentOS 8 (в CentOS 7 все аналогично).
Основные концепции firewalld, зоны и правила
Перед тем как приступить к установке и настройке firewalld, мы познакомимся с понятием зон, которые используются для определения уровня доверия к различным соединениям. Для различных зон firewalld можно применить различные правила фильтрации, указывать активные опции брандмауэра в виде предварительно определенных служб, протоколов и портов, перенаправления портов и rich-rules.
Firewalld фильтрует входящий трафик по зонам в зависимости от примененных к зоне правил. Если IP-адрес отправителя запроса соответствует правилам какой-либо зоны, то пакет будет отправляться через эту зону. Если же адрес не соответствует ни одной из настроенных на сервере зоне, пакет будет обрабатываться зоной используемой по умолчанию. При установке firewalld зона по умолчанию называется public.
В firewalld есть зоны, где уже предварительно настроены разрешения для различных служб. Можно использовать эти настройки или создавать собственные зоны. Список зон по-умолчанию, которые создаются при установке firewalld (хранятся в каталоге /usr/lib/firewalld/zones/):
В firewalld используется два набора правил — постоянные и временные. Временные правила работают до перезагрузки сервера. По умолчанию при добавлении правил в firewalld, правила считаются временными (runtime). Чтобы добавить правило на постоянной основе нужно использовать флаг — permanent. Такие правила будут применяться после перезагрузки сервера.
Установка и включение 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 мы только установили и еще не настраивали, у нас зона по-умолчанию public.
Проверим активную зону. Она также одна — public:
Как видим, сетевой интерфейс eth0 управляется зоной public.
# ip link show
Или
# nmcli device status
Чтобы посмотреть правила активной зоны, введите:
Из листинга видно, что в данную зону добавлены обычные операции, связанные с DHCP-клиентом и ssh.
Доступные зоны
Чтобы просмотреть список всех зон, нужно выполнить команду:
У меня получился такой список:
Чтобы проверить правила конкретной зоны, нужно добавить флаг — zone.
# firewall-cmd —zone=home —list-all
Правила всех зон, можно просмотреть командой:
Листинг будет довольно большой, так как зон может быть много.
Изменение зоны по умолчанию.
По умолчанию все сетевые интерфейсы расположены в зоне public, но их можно перенести в любую из зон, командой:
# firewall-cmd —zone=home —change-interface=eth0
После параметра —zone= указать нужную зону.
Чтобы изменить зону по умолчанию, нужно применить команду:
Добавление правил для приложений
Чтобы открыть порт для приложения, можно добавить в исключения сервис. Вывести список доступных сервисов:
Вывод будет содержать большое количество сервисов. Подробная информация о службе содержится в ее xml файле. Эти файлы расположены в директории /usr/lib/firewalld/services.
В XML файле есть описание сервиса, протокол и номер порта, который будет открыт в firewalld.
При добавлении правил, вы можете использовать параметр —add-service, чтобы открыть доступ определенному сервису:
# firewall-cmd —zone=public —add-service=http
# firewall-cmd —zone=public —add-service=https
После добавления правил, можно проверить, добавлены ли сервисы в указанную зону:
# firewall-cmd —zone=public —list-services
Если вы хотите сделать эти правила постоянными, при добавлении нужно добавить параметр —permanent.
Чтобы удалить сервис из зоны:
# firewall-cmd —permanent —zone=public —remove-service=http
# firewall-cmd —zone=public —permanent —list-services
Если вы хотите добавить в исключения свой сервис, вы можете создать файл xml самостоятельно и заполнить его. Можно скопировать данные с любого сервиса, изменить название, описание и номер порта.
Скопируем файл smtp.xml в директорию для работы с сервисами пользователей:
# cp /usr/lib/firewalld/services/smtp.xml /etc/firewalld/services
Измените описание сервиса в файле.
Сам файл xml тоже нужно переименовать по имени вашего сервиса. После чего, нужно перезагрузить firewalld и проверить есть ли наш сервис в списке:
Я назвал сервис test и в списке он появился:
Теперь можно добавить созданный сервис в любую зону:
# firewall-cmd —zone=public —add-service=test —permanent
# firewall-cmd —zone=public —permanent —list-services
Если вы на нашли нужный вам сервис в списке, вы можете открыть нужный порт на firewalld командой:
# firewall-cmd —zone=public —add-port=77/tcp — открыть 77 порт tcp
# firewall-cmd —zone=public —add-port=77/udp — открыть 77 порт udp
# firewall-cmd —zone=public —add-port=77-88/udp — открыть диапазон портов 77-88 udp
# firewall-cmd —zone=public —list-ports — проверить список разрешенных портов
Заблокировать/разрешить ICMP ответы:
# firewall-cmd —zone=public —add-icmp-block=echo-reply
# firewall-cmd —zone= public —remove-icmp-block=echo-reply
Удалить добавленный порт:
# firewall-cmd —zone=public —remove-port=77/udp — удалить временное правило 77 udp
# firewall-cmd —permanent —zone=public —remove-port=77/udp — удалить постоянное правило
Добавление собственных зон
Вы можете создать собственную зону (назову ее our):
# firewall-cmd —permanent —new-zone=our
После создания новой зоны, как и после создания сервиса, нужна перезагрузка firewalld:
Зона our доступна. Вы можете добавлять в нее сервисы или открывать определенные порты.
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
Чтобы заблокировать IP, нужно заменить accept на reject:
# firewall-cmd —zone=public —add-rich-rule=’rule family=»ipv4″ source address=»8.8.4.4″ reject’
# firewall-cmd —zone=public —list-all
Можно разрешить определенную службу только для запросов с конкретного IP адреса:
#firewall-cmd —permanent —add-rich-rule ‘rule family=»ipv4″ source address=»10.10.1.0/24″ service name=»https» accept’
Если вам нужно срочно заблокировать вообще все запросы к серверу, используйте команду паники:
Отключить режим паники можно либо командой:
Либо перезагрузив сервер.
Вы можете заблокировать конфигурацию firewalld, чтобы локальные сервисы с правами root не могли изменить созданные вами правила файервола:
Отключить режим блокировки:
Перенаправление портов в 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
Предыдущая статья Следующая статья
alt=»информация об оборудовании компьютеров и серверов в glpi» width=»58″ height=»56″ /> Установка и настройка GLPI и FusionInventory, инвентаризация ИТ инфраструктуры
alt=»mdadm — faulty — сбойный диск» width=»58″ height=»56″ /> Программный RAID в Linux с помощью mdadm
alt=»подключение openvpn клиента к серверу» width=»58″ height=»56″ />Установка и настройка сервера OpenVPN на CentOS 7