Centos 7 firewall открыть порт 80. Изменение зоны интерфейса на постоянной основе
Начиная с CentoOS 7 для настройки правил фильтрации трафика появился новый инструмент firewalld . Именно его рекомендуется использовать для управления правилами iptables. В CentOS 8 вместо стандартного пакета фильтрации iptables теперь используется фреймворк nftables, и при настройке правил файервола через firewalld на самом деле вы настраиваете nftables. В этой статье мы рассмотрим установку, основные концепции и настройку межсетевого экрана firewalld на сервере под управлением CentOS 8 (в CentOS 7 все аналогично).
FirewallD – межсетевой экран для защиты сервера от нежелательного трафика с поддержкой динамического управления правилами (без перезапуска) и реализации постоянных правил файервола. Работает как интерфейс для и nftables. FirewallD можно использовать почти во всех дистрибутивах Linux.
Основные концепции firewalld, зоны и правила
Перед тем как приступить к установке и настройке firewalld , мы познакомимся с понятием зон, которые используются для определения уровня доверия к различным соединениям. Для различных зон firewalld можно применить различные правила фильтрации, указывать активные опции брандмауэра в виде предварительно определенных служб, протоколов и портов, перенаправления портов и rich-rules.
Firewalld фильтрует входящий трафик по зонам в зависимости от примененных к зоне правил. Если IP -адрес отправителя запроса соответствует правилам какой-либо зоны, то пакет будет отправляться через эту зону. Если же адрес не соответствует ни одной из настроенных на сервере зоне, пакет будет обрабатываться зоной используемой по умолчанию. При установке firewalld зона по умолчанию называется public .
В firewalld есть зоны, где уже предварительно настроены разрешения для различных служб. Можно использовать эти настройки или создавать собственные зоны. Список зон по-умолчанию, которые создаются при установке firewalld (хранятся в каталоге /usr/lib/firewalld/zones/):
drop | минимальный уровень доверия. Все входящие соединения блокируются без ответа, допускаются только исходящие соединения; |
block | зона схожа с предыдущей, но при отклонении входящих запросов отправляется сообщение icmp-host-prohibited для Ipv4 или icmp6-adm-prohibited для Ipv6; |
public | представляет общественные, недоверенные сети. Можно разрешать избранные входящие соединения в индивидуальном порядке; |
external | внешние сети при использовании брандмауэра в качестве шлюза. Она настроена для маскирования NAT, поэтому ваша внутренняя сеть остается частной, но доступной; |
internal | антоним зоны external. Хост обладают достаточным уровнем доверия, доступен ряд дополнительных служб; |
dmz | используется для компьютеров, расположенных в DMZ (изолированные компьютеры без доступа к остальной сети). Разрешены только определенные входящие соединения; |
work | зона для рабочих машин (большинство компьютеров в сети доверенные); |
home | зона домашней сети. Можно доверять большинству ПК, но поддерживаются только определенные входящие соединения; |
trusted | доверять всем машинам в сети. Наиболее открытая из всех доступных опций, требует сознательного использования. |
В firewalld используется два набора правил - постоянные и временные. Временные правила работают до перезагрузки сервера. По умолчанию при добавлении правил в firewalld , правила считаются временными (runtime ). Чтобы добавить правило на постоянной основе нужно использовать флаг — permanent . Такие правила будут применяться после перезагрузки сервера.
Установка и включение firewalld в CentOS
В CentOS 7/8 firewalld устанавливается по умолчанию при ОС. Если вы его удалили и хотите установить firewalld, можете воспользоваться стандартным менеджером /dnf:
# yum install firewalld -y — для Centos 7
# dnf install firewalld -y — для Centos 8
Чтобы демон firewalld запускался автоматически со стартом сервера, нужно добавить его в :
# systemctl enable firewalld
И запустить:
# systemctl start firewalld
Проверить статус сервиса:
# 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 Mon 2019-10-14 14:54:40 +06; 22s ago Docs: man:firewalld(1) Main PID: 13646 (firewalld) CGroup: /system.slice/firewalld.service └─13646 /usr/bin/python2 -Es /usr/sbin/firewalld --nofork --nopid Oct 14 14:54:40 server.vpn.ru systemd: Starting firewalld - dynamic firewall daemon... Oct 14 14:54:40 server.vpn.ru systemd: Started firewalld - dynamic firewall daemon.
Либо командой:
# firewall-cmd --state
Команда firewall-cmd является фронтендом firewalld к nftables/iptables.
# firewall-cmd --state
Работа с правилами firewalld
Правила по умолчанию:
Перед настройкой правил firewalld, нужно проверить, какая зона используется по умолчанию:
# firewall-cmd --get-default-zone
Так как firewalld мы только установили и еще не настраивали, у нас зона по-умолчанию public .
Проверим активную зону. Она также одна — public:
# firewall-cmd --get-active-zones
Public interfaces: eth0
Как видим, сетевой интерфейс eth0 управляется зоной public .
Чтобы посмотреть правила активной зоны, введите:
# firewall-cmd --list-all
Public (active) target: default icmp-block-inversion: no interfaces: eth0 sources: services: dhcpv6-client ssh ports: protocols: masquerade: no forward-ports: source-ports: icmp-blocks: rich rules:
Из листинга видно, что в данную зону добавлены обычные операции, связанные с DHCP-клиентом и ssh.
Доступные зоны
Чтобы просмотреть список всех зон, нужно выполнить команду:
# firewall-cmd --get-zones
У меня получился такой список:
Block dmz drop external home internal public trusted work
Чтобы проверить правила конкретной зоны, нужно добавить флаг — zone.
# firewall-cmd --zone=home --list-all
Home target: default icmp-block-inversion: no interfaces: sources: services: dhcpv6-client mdns samba-client ssh ports: protocols: masquerade: no forward-ports: source-ports: icmp-blocks: rich rules:
Правила всех зон, можно просмотреть командой:
# firewall-cmd --list-all-zones
Листинг будет довольно большой, так как зон может быть много.
Изменение зоны по умолчанию.
По умолчанию все сетевые интерфейсы расположены в зоне public , но их можно перенести в любую из зон, командой:
# firewall-cmd --zone=home -change-interface=eth0
После параметра —zone= указать нужную зону.
Чтобы изменить зону по умолчанию, нужно применить команду:
# firewall-cmd --set-default-zone=home
Добавление правил для приложений
Чтобы открыть порт для приложения, можно добавить в исключения сервис. Вывести список доступных сервисов:
Вывод будет содержать большое количество сервисов. Подробная информация о службе содержится в ее xml файле. Эти файлы расположены в директории /usr/lib/firewalld/services.
Например:
# cd /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
Dhcpv6-client http https ssh
Если вы хотите сделать эти правила постоянными, при добавлении нужно добавить параметр —permanent .
Чтобы удалить сервис из зоны:
# firewall-cmd --permanent --zone=public --remove-service=http
Dhcpv6-client https ssh test
Если вы хотите добавить в исключения свой сервис, вы можете создать файл xml самостоятельно и заполнить его. Можно скопировать данные с любого сервиса, изменить название, описание и номер порта.
Скопируем файл smtp.xml в директорию для работы с сервисами пользователей:
# cp /usr/lib/firewalld/services/smtp.xml /etc/firewalld/services
Измените описание сервиса в файле.
Сам файл xml тоже нужно переименовать по имени вашего сервиса. После чего, нужно перезагрузить firewalld и проверить есть ли наш сервис в списке:
Я назвал сервис test и в списке он появился:
Syslog-tls telnet test tftp
Теперь можно добавить созданный сервис в любую зону:
# firewall-cmd --zone=public --add-service=test --permanent
# firewall-cmd --zone=public --permanent --list-services
Dhcpv6-client http https ssh test
Если вы на нашли нужный вам сервис в списке, вы можете открыть нужный порт на 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 :
# firewall-cmd --reload
# firewall-cmd --get-zones
Block dmz drop external home internal our public trusted work
Зона 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:
Public (active) target: default icmp-block-inversion: no interfaces: eth0 sources: services: dhcpv6-client http https ssh test ports: protocols: masquerade: no forward-ports: source-ports: icmp-blocks: rich rules: rule family="ipv4" source address="8.8.8.8" accept
Чтобы заблокировать 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
Public (active) target: default icmp-block-inversion: no interfaces: eth0 sources: services: dhcpv6-client http https ssh test ports: protocols: masquerade: no forward-ports: source-ports: icmp-blocks: rich rules: rule family="ipv4" source address="8.8.8.8" accept rule family="ipv4" source address="8.8.4.4" reject
Можно разрешить определенную службу только для запросов с конкретного IP адреса:
#firewall-cmd --permanent --add-rich-rule "rule family="ipv4" source address="10.10.1.0/24" service name="https" accept"
Если вам нужно срочно заблокировать вообще все запросы к серверу, используйте команду паники:
# firewall-cmd --panic-on
Отключить режим паники можно либо командой:
# firewall-cmd --panic-off
Либо перезагрузив сервер.
Вы можете заблокировать конфигурацию firewalld, чтобы локальные сервисы с правами root не могли изменить созданные вами правила файервола:
# firewall-cmd --lockdown-on
Отключить режим блокировки:
# firewall-cmd --lockdown-off
Перенаправление портов в firewalld
Вы можете создать правило перенаправления портов в 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
F irewallD является инструментом управления брандмауэра, доступный по умолчанию на серверах CentOS 7. В основном, это оболочка вокруг IPTables и поставляется с графическим инструментом конфигурации firewall-config и инструментом командной строки firewall-cmd. С помощью сервиса IPtables, каждое изменение требует удаление старых правил и создание новых правил в файле `/etc/sysconfig/iptables `, а при firewalld применяются только различия.
Зоны FirewallD
FirewallD использует сервисы и зоны вместо правил и цепочек в Iptables. По умолчанию доступны следующие зоны:
- drop – Отбросьте все входящие сетевые пакеты без ответа, только исходящие сетевые соединения доступны.
- block – Отклонить все входящие сетевые пакеты с сообщением icmp-host-prohibited, только исходящие сетевые соединения доступны.
- public – только выбранные входящие соединения принимаются, для использования в общественных местах
- external – Для внешних сетей с masquerading, только выбранные входящие соединения принимаются.
- dmz – демилитаризованной зоны DMZ, публично доступны с ограниченным доступом к внутренней сети, только выбранные входящие соединения принимаются.
- work
- home – Для компьютеров в домашней зоне, только выбранные входящие соединения принимаются.
- internal – Для компьютеров в вашей внутренней сети, только выбранные входящие соединения принимаются.
- trusted – Все сетевые соединения принимаются.
Чтобы получить список всех доступных зон:
# firewall-cmd --get-zones work drop internal external trusted home dmz public block
Для просмотра списка зон по умолчанию:
# firewall-cmd --get-default-zone public
Чтобы изменить зону по умолчанию:
Сервисы FirewallD
Сервисы FirewallD представляют собой файлы конфигурации XML, с информацией о записи службы для firewalld. Чтобы получить список всех доступных услуг:
# firewall-cmd --get-services amanda-client amanda-k5-client bacula bacula-client ceph ceph-mon dhcp dhcpv6 dhcpv6-client dns docker-registry dropbox-lansync freeipa-ldap freeipa-ldaps freeipa-replication ftp high-availability http https imap imaps ipp ipp-client ipsec iscsi-target kadmin kerberos kpasswd ldap ldaps libvirt libvirt-tls mdns mosh mountd ms-wbt mysql nfs ntp openvpn pmcd pmproxy pmwebapi pmwebapis pop3 pop3s postgresql privoxy proxy-dhcp ptp pulseaudio puppetmaster radius rpc-bind rsyncd samba samba-client sane smtp smtps snmp snmptrap 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
Конфигурационные файлы XML хранятся в каталогах /usr/lib/firewalld/services/ и /etc/firewalld/services/ .
Настройка брандмауэра с FirewallD
В качестве примера, вот как вы можете настроить брандмауэр с FirewallD, если вы работаете в веб – сервере, SSH на порту 7022 и почтового сервера.
Сначала мы установим зона по умолчанию для DMZ.
# firewall-cmd --set-default-zone=dmz # firewall-cmd --get-default-zone dmz
Чтобы добавить постоянные правила службы для HTTP и HTTPS в зоне DMZ, выполните следующую команду:
# firewall-cmd --zone=dmz --add-service=http --permanent # firewall-cmd --zone=dmz --add-service=https --permanent
Откройте порт 25 (SMTP) и порт 465 (SMTPS):
Firewall-cmd --zone=dmz --add-service=smtp --permanent firewall-cmd --zone=dmz --add-service=smtps --permanent
Open, IMAP, IMAPS, POP3 и POP3S порты:
Firewall-cmd --zone=dmz --add-service=imap --permanent firewall-cmd --zone=dmz --add-service=imaps --permanent firewall-cmd --zone=dmz --add-service=pop3 --permanent firewall-cmd --zone=dmz --add-service=pop3s --permanent
Поскольку порт SSH изменен на 7022, мы удалим службу SSH (порт 22) и откроем порт 7022
Firewall-cmd --remove-service=ssh --permanent firewall-cmd --add-port=7022/tcp --permanent
Для реализации изменений нам нужно перезагрузить брандмауэр:
Firewall-cmd --reload
И, наконец, вы можете перечислить правила.
F irewallD является инструментом управления брандмауэра, доступный по умолчанию на серверах CentOS 7. В основном, это оболочка вокруг IPTables и поставляется с графическим инструментом конфигурации firewall-config и инструментом командной строки firewall-cmd. С помощью сервиса IPtables, каждое изменение требует удаление старых правил и создание новых правил в файле `/etc/sysconfig/iptables `, а при firewalld применяются только различия.
Зоны FirewallD
FirewallD использует сервисы и зоны вместо правил и цепочек в Iptables. По умолчанию доступны следующие зоны:
- drop – Отбросьте все входящие сетевые пакеты без ответа, только исходящие сетевые соединения доступны.
- block – Отклонить все входящие сетевые пакеты с сообщением icmp-host-prohibited, только исходящие сетевые соединения доступны.
- public – только выбранные входящие соединения принимаются, для использования в общественных местах
- external – Для внешних сетей с masquerading, только выбранные входящие соединения принимаются.
- dmz – демилитаризованной зоны DMZ, публично доступны с ограниченным доступом к внутренней сети, только выбранные входящие соединения принимаются.
- work
- home – Для компьютеров в домашней зоне, только выбранные входящие соединения принимаются.
- internal – Для компьютеров в вашей внутренней сети, только выбранные входящие соединения принимаются.
- trusted – Все сетевые соединения принимаются.
Чтобы получить список всех доступных зон:
# firewall-cmd --get-zones work drop internal external trusted home dmz public block
Для просмотра списка зон по умолчанию:
# firewall-cmd --get-default-zone public
Чтобы изменить зону по умолчанию:
Сервисы FirewallD
Сервисы FirewallD представляют собой файлы конфигурации XML, с информацией о записи службы для firewalld. Чтобы получить список всех доступных услуг:
# firewall-cmd --get-services amanda-client amanda-k5-client bacula bacula-client ceph ceph-mon dhcp dhcpv6 dhcpv6-client dns docker-registry dropbox-lansync freeipa-ldap freeipa-ldaps freeipa-replication ftp high-availability http https imap imaps ipp ipp-client ipsec iscsi-target kadmin kerberos kpasswd ldap ldaps libvirt libvirt-tls mdns mosh mountd ms-wbt mysql nfs ntp openvpn pmcd pmproxy pmwebapi pmwebapis pop3 pop3s postgresql privoxy proxy-dhcp ptp pulseaudio puppetmaster radius rpc-bind rsyncd samba samba-client sane smtp smtps snmp snmptrap 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
Конфигурационные файлы XML хранятся в каталогах /usr/lib/firewalld/services/ и /etc/firewalld/services/ .
Настройка брандмауэра с FirewallD
В качестве примера, вот как вы можете настроить брандмауэр с FirewallD, если вы работаете в веб – сервере, SSH на порту 7022 и почтового сервера.
Сначала мы установим зона по умолчанию для DMZ.
# firewall-cmd --set-default-zone=dmz # firewall-cmd --get-default-zone dmz
Чтобы добавить постоянные правила службы для HTTP и HTTPS в зоне DMZ, выполните следующую команду:
# firewall-cmd --zone=dmz --add-service=http --permanent # firewall-cmd --zone=dmz --add-service=https --permanent
Откройте порт 25 (SMTP) и порт 465 (SMTPS):
Firewall-cmd --zone=dmz --add-service=smtp --permanent firewall-cmd --zone=dmz --add-service=smtps --permanent
Open, IMAP, IMAPS, POP3 и POP3S порты:
Firewall-cmd --zone=dmz --add-service=imap --permanent firewall-cmd --zone=dmz --add-service=imaps --permanent firewall-cmd --zone=dmz --add-service=pop3 --permanent firewall-cmd --zone=dmz --add-service=pop3s --permanent
Поскольку порт SSH изменен на 7022, мы удалим службу SSH (порт 22) и откроем порт 7022
Firewall-cmd --remove-service=ssh --permanent firewall-cmd --add-port=7022/tcp --permanent
Для реализации изменений нам нужно перезагрузить брандмауэр:
Firewall-cmd --reload
И, наконец, вы можете перечислить правила.
Centos 7, в отличие от CentOS 6, в базе идет с новым брандмауэром - firewalld. Его можно отключить и заменить на старый добрый iptables, но если к этому нет прямых предпосылок, то лучше привыкать к чему-то новому, а не упираться в старое. Это не значит, что Windows 10 лучше Windows 7, а Windows XP лучше Windows 7 ;) Хороший пример на эту тему - selinux. Если вначале почти все (и я тоже) его отключали и даже немного ругали, то теперь почти никто это не советует, только если есть уверенность, что так надо. Напротив, многие уже привыкли (или привыкают) пользоваться semanage. Не будем и мы сразу отключать firewalld, а попробуем, как он на вкус.
Firewalld - это не принципиально иной брандмауэр. Это другая надстройка над netfilter, поэтому если вы обладаете опытом работы с iptables, то помучившись немного вы спокойно начнете пользоваться новым инструментом.
Запуск и остановка firewalld
Проверим, запущен ли firewalld:
# systemctl status firewalld
Тут будет расширенная информация. Чтобы коротко, да (работает) или нет можно так:
# firewall-cmd --state
running
Ок, работает.
Остановка firewalld:
# systemctl stop firewalld
Запрет автостарта:
# systemctl disable firewalld
Запуск firewalld:
# systemctl start firewalld
Включение автостарта:
# systemctl enable firewalld
Зоны firewalld
В firewalld широко используется понятие зоны. Список всех допустимых зон по-умолчанию:
# firewall-cmd --get-zones
block dmz drop external home internal public trusted work
Назначение зон (условно, конечно):
- drop - все входящие пакеты отбрасываются (drop) без ответа. Разрешены только исходящие соединения.
- block - входящие соединения отклоняются (rejected) с ответом icmp-host-prohibited (или icmp6-adm-prohibited). Разрешены только инициированные системой соединения.
- public - зона по-умолчанию . Из названия ясно, что эта зона нацелена на работу в общественных сетях. Мы не доверяем этой сети и разрешаем только определенные входящие соединения.
- external - зона для внешнего интерфейса роутера (т.н. маскарадинг). Разрешены только определенные нами входящие соединения.
- dmz - зона DMZ, разрешены только определенные входящие соединения.
- work - зона рабочей сети. Мы все еще не доверяем никому, но уже не так сильно, как раньше:) Разрешены только определенные входящие соединения.
- home - домашняя зона. Мы доверяем окружению, но разрешены только определенные входящие соединения
- internal - внутренняя зона. Мы доверяем окружению, но разрешены только определенные входящие соединения
- trusted - разрешено все.
Список всех активных зон:
# firewall-cmd --get-active-zones
public
interfaces: enp1s0
Ага, зона public, к которой присоединен сетевой интерфейс enp1so. Дальше в зону public добавим новый порт, на котором будет висеть sshd.
Зная имя сетевого интерфейса (например, enp1s0), можно узнать, к какой зоне он принадлежит:
# firewall-cmd --get-zone-of-interface=enp1s0
public
А можно узнать, какие интерфейсы принадлежат конкретной зоне:
# firewall-cmd --zone=public --list-interfaces
enp1s0
Пример: разрешаем ssh на нестандартном порте
Давайте разрешим доступ к серверу по ssh на порте 2234/tcp, а не на 22/tcp, как по-умолчанию. Попутно чуть-чуть коснемся selinux.
Сначала посмотрим, что вообще разрешено постоянно на нашем сервере:
# firewall-cmd --permanent --list-all
public (default)
interfaces:
sources:
services: ssh dhcpv6-client
masquerade: no
forward-ports:
icmp-blocks:
rich rules:
Я не использую пока ipv6, поэтому сразу уберу соотв. правило из firewalld:
# firewall-cmd --permanent --zone=public --remove-service=dhcpv6-client
Разрешим на постоянной основе (чтобы после перезагрузки не потерлось) соединение на порт 2234/tcp (на него повесим sshd):
# firewall-cmd --permanent --zone=public --add-port=2234/tcp
Перезагрузим правила:
# firewall-cmd --reload
Проверим:
# firewall-cmd --zone=public --list-ports
2234/tcp
Ок, порт открыт. Редактируем конфиг sshd:
# nano /etc/ssh/sshd_config
...
port 2234
...
# systemctl restart sshd.service
Но SELinux, которую вы, надеюсь, не отключали, не даст подключиться к ssh на нестандартном порте (порт 2234/tcp для sshd - нестандартный). Вы можете этот шаг пропустить и проверить, как сработатет защита SELinux, а можете сразу все настроить:
# yum provides semanage
# yum install policycoreutils-python
# semanage port -a -t ssh_port_t -p tcp 2234
Вот теперь все ок. Проверяем подключение по ssh на новом порте. Если все ок, закрываем доступ к порту 22:
# firewall-cmd --permanent --zone=public --remove-service=ssh
# firewall-cmd --reload
Смотрим, что получилось:
# firewall-cmd --list-all
public (default, active)
interfaces:
sources:
services:
ports: 2234/tcp
masquerade: no
forward-ports:
icmp-blocks:
rich rules:
Вот и все.
Разные полезные команды:
Включить режим блокировки всех исходящих и входящих пакетов:
# firewall-cmd --panic-on
Выключить режим блокировки всех исходящих и входящих пакетов:
# firewall-cmd --panic-off
Узнать, включен ли режим блокировки всех исходящих и входящих пакетов:
# firewall-cmd --query-panic
Перезагрузить правила firewalld без потери текущих соединений:
# firewall-cmd --reload
Перезагрузить правила firewalld и сбросить текущие соединения (рекомендуется только в случае проблем):
# firewall-cmd --complete-reload
Добавить к зоне сетевой интерфейс:
# firewall-cmd --zone=public --add-interface=em1
Добавить к зоне сетевой интерфейс (сохранится после перезагрузки firewall):
# firewall-cmd --zone=public --permanent --add-interface=em1
Можно в конфиге ifcfg-enp1s0 указать, какой зоне принадлежит этот интерфейс. Для этого добавим ZONE=work в файл /etc/sysconfig/network-scripts/ifcfg-enp1s0. Если параметр ZONE не указан, будет назначена зона по-умолчанию (параметр DefaultZone в файле /etc/firewalld/firewalld.conf.
Разрешить диапазон портов:
# firewall-cmd --zone=public --add-port=5059-5061/udp
Маскарад (masquerade, он же nat, он же...):
Проверить статус:
# firewall-cmd --zone=external --query-masquerade
Включить:
# firewall-cmd --zone=external --add-masquerade
Здесь надо отметить, что вы можете включить masquerade и для зоны public, например.
Перенаправить входящие на 22 порт на другой хост:
# firewall-cmd --zone=external --add-forward-port=port=22:proto=tcp:toaddr=192.168.1.23
Перенаправить входящие на 22 порт на другой хост с изменением порта назначения (с 22 на 192.168.1.23:2055):
# firewall-cmd --zone=external /
--add-forward-port=port=22:proto=tcp:toport=2055:toaddr=192.168.1.23
На этом закончу, т.к. примеров может быть бесконечно много. Добавлю только, что лично я не составил окончательно свое мнение по поводу нововведения firewalld, т.к. к синтаксису привыкаешь долго и если в вашем зоопарке встречаются разные OS Linux, то по первости могут быть проблемы именно с привычкой. Но освоив firewalld, вы расширите кругозор - чаще всего, это стоит затраченных усилий.
Преимущества firewalld
Основное преимущество - вы немного абстрагируетесь от цепочек iptables.Для включения перенаправления портов не придется думать про PREROUTING или POSTROUTING в дополнение к FORWARD. Вам дается "API от iptables от производителя", что-то в этом роде. Если вы включили nat, то неважно, где конкретно (под каким порядковым номером текущих правил) размещено правило. Вы просто указываете - включи nat на eth0. И без глупостей;) Это может быть удобно, если надо организовать web интерфейс управления брандмауэром.
Есть возможность проверить статус (например, включен nat или нет!). И также использовать это в своих скриптах, в логике вашего приложения, например. Я не знаю, как в iptables создать именно запрос статуса (вкл/выкл). Можно, конечно, что-то в роде iptables -L -t nat | grep "...", но согласитесь, это немного не то же самое, что выполнить "firewall-cmd --zone=external --query-masquerade". Есть, к примеру, сотни VM с CentOS, в которых могут немного отличаться названия wan интерфейсов или еще что-то в этом роде. А так вы имеете универсальный командлет, который даст ожидаемый результат на разных машинах.
Недостатки firewalld
Основной недостаток, на мой взгляд, это то, что при привыкании начнется отвыкание от "чистого" iptables, который и в Debian, и в Ubuntu, и в CentOS и, вообще, везде. Даже, кстати, в микротик синтаксис и цепочки похожи по типу на iptables. Это на любителя, конечно. И профессионалу все равно, с чем работать, если есть конкретные условия, он будет работать с тем, что есть. Но... я ретроград и отчаянно сопротивляюсь (при отсутсвии явных преимуществ) новинкам, которые каждый крупный игрок реализует под себя. RedHat выгодно, если все больше новых специалистов будут асами в firewalld.
И если вы перешли на firewalld, то уже чистый синтаксис iptables вам только помешает - будет каша или просто сломается работа брандмауэра, если вы начнете изменять/дополнять правила не с помощью стандартного синтаксиса firewalld.
Не хочу firewalld! Верните мне старый iptables!
Если все же вы хотите вернуть прошлое и заменить firewalld на iptables, то сделать это совсем не трудно:
Новичкам тут не место:
# systemctl disable firewalld
# systemctl stop firewalld
Ставим старый добрый iptables:
# yum install iptables-services
Запускаем брандмауэр:
# systemctl start iptables
# systemctl start ip6tables
Автозапуск при включении:
# systemctl enable iptables
# systemctl enable ip6tables
Для сохранения правил iptables после перезагрузки:
# /sbin/iptables-save > /etc/sysconfig/iptables
# /sbin/ip6tables-save > /etc/sysconfig/ip6tables
Или по-старинке:
# service iptables save
Текущие правила находятся в файлах:
/etc/sysconfig/iptables
/etc/sysconfig/ip6tables
Перезапуск iptables (например, после совершения каких-либо изменений):
# systemctl restart iptables.service
Зоны
Демон firewalld управляет группами правил при помощи так называемых зон.
Зоны – это, по сути, наборы правил, которые управляют трафиком на основе уровня доверия к той или иной сети. Зоны присваиваются сетевым интерфейсам и управляют поведением брандмауэра.
Компьютеры, которые часто подключаются к разным сетям (например, ноутбуки) могут использовать зоны, чтобы изменять наборы правил в зависимости от среды. К примеру, при подключении к общественной сети WiFi брандмауэр может применять более строгие правила, а в домашней сети ослаблять ограничения.
В firewalld существуют следующие зоны:
- drop: самый низкий уровень доверия сети. Весь входящий трафик сбрасывается без ответа, поддерживаются только исходящие соединения.
- block: эта зона похожа на предыдущую, но при этом входящие запросы сбрасываются с сообщением icmp-host-prohibited или icmp6-adm-prohibited.
- public: эта зона представляет публичную сеть, которой нельзя доверять, однако поддерживает входящие соединения в индивидуальном порядке.
- external: зона внешних сетей. Поддерживает маскировку NAT, благодаря чему внутренняя сеть остается закрытой, но с возможностью получения доступа.
- internal: обратная сторона зоны external, внутренние сети. Компьютерам в этой зоне можно доверять. Доступны дополнительные сервисы.
- dmz: используется для компьютеров, расположенных в DMZ (изолированных компьютеров, которые не будут иметь доступа к остальной части сети); поддерживает только некоторые входящие соединения.
- work: зона рабочей сети. Большинству машин в сети можно доверять. Доступны дополнительные сервисы.
- home: зона домашней сети. Окружению можно доверять, но поддерживаются только определённые пользователем входящие соединения.
- trusted: всем машинам в сети можно доверять.
Сохранение правил
Правила firewalld бывают постоянными и временными. Если в наборе появляется или изменяется какое-либо правило, текущее поведение брандмауэра изменяется сразу. Однако после перезагрузки все изменения будут утрачены, если их не сохранить.
Большинство команд firewall-cmd может использовать флаг —permanent, который сохранит правило, после чего оно будет использоваться на постоянной основе.
Включение брандмауэра firewalld
Для начала нужно включить демон. Unit-файл systemd называется firewalld.service. Чтобы запустить демон, введите.
sudo systemctl start firewalld.service
Убедитесь, что сервис запущен:
firewall-cmd --state
running
Теперь брандмауэр запущен и работает согласно конфигурации по умолчанию.
На данный момент сервис включен, но не будет запускаться автоматически вместе с сервером. Чтобы случайно не заблокировать себя на собственном сервере, сначала создайте набор правил, а затем настройте автозапуск.
Правила брандмауэра по умолчанию
Просмотр правил по умолчанию
Чтобы узнать, какая зона используется по умолчанию, введите:
firewall-cmd --get-default-zone
public
На данный момент firewalld не получал никаких инструкций относительно других зон, кроме того, к другим зонам не привязан ни один интерфейс, поэтому сейчас зона public является зоной по умолчанию, а также единственной активной зоной.
Чтобы получить список активных зон, введите:
public
interfaces: eth0 eth1
К зоне public привязаны два сетевых интерфейса: eth0 и eth1. Интерфейсы, привязанные к зоне, работают согласно правилам этой зоны.
Чтобы узнать, какие правила использует зона по умолчанию, введите:
firewall-cmd --list-all
public (default, active)
interfaces: eth0 eth1
sources:
services: dhcpv6-client ssh
ports:
masquerade: no
forward-ports:
icmp-blocks:
rich rules:
Итак, теперь вы знаете, что:
- public является зоной по умолчанию и единственной активной зоной.
- К ней привязаны интерфейсы eth0 и eth1.
- Она поддерживает трафик DHCP (присваивание IP-адресов) и SSH (удаленное администрирование).
Другие зоны брандмауэра
Теперь следует ознакомиться с другими зонами.
Чтобы получить список всех доступных зон, введите:
firewall-cmd --get-zones
Чтобы получить параметры конкретной зоны, добавьте в команду флаг —zone=.
firewall-cmd --zone=home --list-all
home
interfaces:
sources:
services: dhcpv6-client ipp-client mdns samba-client ssh
ports:
masquerade: no
forward-ports:
icmp-blocks:
rich rules:
Чтобы вывести определения всех доступных зон, добавьте опцию —list-all-zones. Для более удобного просмотра вывод можно передать в пейджер:
firewall-cmd --list-all-zones | less
Настройка зон интерфейсов
Изначально все сетевые интерфейсы привязаны к зоне по умолчанию.
Изменение зоны интерфейса на одну сессию
Чтобы перевести интерфейс в другую зону на одну сессию, используйте опции —zone= и —change-interface=.
Например, чтобы перевести eth0 в зону home, нужно ввести:
sudo firewall-cmd --zone=home --change-interface=eth0
success
Примечание : При переводе интерфейса в другую зону нужно учитывать, что это может повлиять на работу некоторых сервисов. К примеру, зона home поддерживает SSH, поэтому соединения этого сервиса не будут сброшены. Но некоторые зоны сбрасывают все соединения, включая SSH, и тогда вы можете случайно заблокировать себе доступ к собственному серверу.
Чтобы убедиться, что интерфейс привязан к новой зоне, введите:
firewall-cmd --get-active-zones
home
interfaces: eth0
public
interfaces: eth1
После перезагрузки брандмауэра интерфейс будет снова привязан к зоне по умолчанию.
sudo systemctl restart firewalld.service
firewall-cmd --get-active-zones
public
interfaces: eth0 eth1
Изменение зоны интерфейса на постоянной основе
Если в настройках интерфейса не указана никакая другая зона, после перезапуска брандмауэра интерфейс будет снова привязан к зоне по умолчанию. В CentOS такие конфигурации хранятся в каталоге /etc/sysconfig/network-scripts, в файлах формата ifcfg-interface.
Чтобы определить зону интерфейса, откройте конфигурационный файл этого интерфейса, например:
В конец файла добавьте переменную ZONE= и в качестве значения укажите другую зону, например, home:
. . .
DNS1=2001:4860:4860::8844
DNS2=2001:4860:4860::8888
DNS3=8.8.8.8
ZONE=home
Сохраните и закройте файл.
Чтобы обновить настройки, перезапустите сетевой сервис и брандмауэр:
sudo systemctl restart network.service
sudo systemctl restart firewalld.service
После перезапуска интерфейс eth0 будет привязан к зоне home.
firewall-cmd --get-active-zones
home
interfaces: eth0
public
interfaces: eth1
Настройка зоны по умолчанию
Также вы можете выбрать другую зону по умолчанию.
Для этого используется параметр —set-default-zone=. После этого все интерфейсы будут привязаны к другой зоне:
sudo firewall-cmd --set-default-zone=home
home
interfaces: eth0 eth1
Создание правил для приложений
Добавление сервиса в зону
Проще всего добавить сервис или порт в зону, которую использует брандмауэр. Просмотрите доступные сервисы:
firewall-cmd --get-services
RH-Satellite-6 amanda-client bacula bacula-client dhcp dhcpv6 dhcpv6-client dns ftp high-availability http https imaps ipp ipp-client ipsec kerberos kpasswd ldap ldaps libvirt libvirt-tls mdns mountd ms-wbt mysql nfs ntp openvpn pmcd pmproxy pmwebapi pmwebapis pop3s postgresql proxy-dhcp radius rpc-bind samba samba-client smtp ssh telnet tftp tftp-client transmission-client vnc-server wbem-https
Примечание : Больше информации о каждом конкретном сервисе можно найти в файлах.xml в каталоге /usr/lib/firewalld/services. К пример, сведения о сервисе SSH хранятся в /usr/lib/firewalld/services/ssh.xml и выглядят так:
Чтобы включить поддержку сервиса в той или иной зоне, используйте опцию —add-service=. Указать целевую зону можно с помощью опции —zone=. По умолчанию эти изменения будут работать в течение одной сессии. Чтобы сохранить изменения и использовать их на постоянной основе, добавьте флаг —permanent.
Например, чтобы запустить веб-сервер для обслуживания трафика HTTP, для начала нужно включить поддержку этого трафика в зоне public на одну сессию:
sudo firewall-cmd --zone=public --add-service=http
Если сервис нужно добавить в зону по умолчанию, флаг —zone= можно опустить.
Убедитесь, что операция выполнена успешно:
firewall-cmd --zone=public --list-services
dhcpv6-client http ssh
Протестируйте работу сервиса и брандмауэра. Если все работает правильно, можно изменить постоянный набор правил и добавить в него правило для поддержки этого сервиса.
sudo firewall-cmd --zone=public --permanent --add-service=http
Чтобы просмотреть список постоянных правил, введите:
sudo firewall-cmd --zone=public --permanent --list-services
dhcpv6-client http ssh
Теперь зона public поддерживает HTTP и порт 80 на постоянной основе. Если веб-сервер может обслуживать трафик SSL/TLS, вы также можете добавить сервис https (для одной сессии или в набор постоянных правил):
sudo firewall-cmd --zone=public --add-service=https
sudo firewall-cmd --zone=public --permanent --add-service=https
Что делать, если нужный сервис недоступен?
Брандмауэр firewalld по умолчанию включает в себя многие наиболее распространённые сервисы. Однако некоторым приложениям необходимы сервисы, поддержка которых отсутствует в firewalld. В таком случае вы можете поступить двумя способами.
Способ 1: Настройка порта
Проще всего в такой ситуации открыть порт приложения в необходимой зоне брандмауэра. Нужно просто указать порт или диапазон портов и протокол.
Например, приложение, которое использует порт 5000 и протокол TCP, нужно добавить в зону public. Чтобы включить поддержку приложения на дну сессию, используйте параметр —add-port= и укажите протокол tcp или udp.
sudo firewall-cmd --zone=public --add-port=5000/tcp
Убедитесь, что операция прошла успешно:
firewall-cmd --list-ports
5000/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
success
success
4990-4999/udp 5000/tcp
Способ 2: Определение сервиса
Добавлять порты в зоны просто, но если у вас много таких приложений, в результате будет сложно отследить, для чего предназначен тот или иной порт. Чтобы избежать такой ситуации, можно вместо портов определить сервисы.
Сервисы – это просто наборы портов с определенным именем и описанием. С помощью сервисов проще управлять настройками, но сами по себе они сложнее, чем порты.
Для начала нужно скопировать существующий сценарий из каталога /usr/lib/firewalld/services в каталог /etc/firewalld/services (здесь брандмауэр ищет нестандартные настройки).
Например, можно скопировать определение сервиса SSH и использовать его для определения условного сервиса example. Имя сценария должно совпадать с именем сервиса и иметь расширение.xml.
sudo cp /usr/lib/firewalld/services/service.xml /etc/firewalld/services/example.xml
Откорректируйте скопированный файл.
sudo nano /etc/firewalld/services/example.xml
В файле находится определение SSH:
Большую часть определения сервиса составляют метаданные. Изменить краткое имя сервиса можно в тегах
Вернёмся к сервису example; допустим, он требует открыть TCP- порт 7777 и UDP- порт 8888. Определение будет выглядеть так:
Сохраните и закройте файл.
Перезапустите брандмауэр:
sudo firewall-cmd --reload
Теперь сервис появится в списке доступных сервисов:
firewall-cmd --get-services
RH-Satellite-6 amanda-client bacula bacula-client dhcp dhcpv6 dhcpv6-client dns example ftp high-availability http https imaps ipp ipp-client ipsec kerberos kpasswd ldap ldaps libvirt libvirt-tls mdns mountd ms-wbt mysql nfs ntp openvpn pmcd pmproxy pmwebapi pmwebapis pop3s postgresql proxy-dhcp radius rpc-bind samba samba-client smtp ssh telnet tftp tftp-client transmission-client vnc-server wbem-https
Создание зон
Брандмауэр предоставляет много предопределенных зон, которых в большинстве случаев достаточно для работы. Но в некоторых ситуациях возникает необходимость создать пользовательскую зону.
Например, для веб-сервера можно создать зону publicweb, а для DNS-сервиса – зону privateDNS.
Создавая зону, нужно добавить её в постоянные настройки брандмауэра.
Попробуйте создать зоны publicweb и privateDNS:
sudo firewall-cmd --permanent --new-zone=publicweb
sudo firewall-cmd --permanent --new-zone=privateDNS
Убедитесь, что зоны существуют:
sudo firewall-cmd --permanent --get-zones
В текущей сессии новые зоны не будут доступны:
firewall-cmd --get-zones
block dmz drop external home internal public trusted work
Чтобы получить доступ к новым зонам, нужно перезапустить брандмауэр:
sudo firewall-cmd --reload
firewall-cmd --get-zones
block 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
firewall-cmd --zone=publicweb --list-all
publicweb
interfaces:
sources:
services: http https ssh
ports:
masquerade: no
forward-ports:
icmp-blocks:
rich rules:
В зону privateDNS можно добавить DNS:
sudo firewall-cmd --zone=privateDNS --add-service=dns
firewall-cmd --zone=privateDNS --list-all
privateDNS
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
Теперь можно протестировать настройку. Если всё работает правильно, вы можете добавить эти правила в постоянные настройки.
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
После этого можно настроить сетевые интерфейсы для автоматического подключения к правильной зоне.
К примеру, eth0 будет привязан к publicweb:
sudo nano /etc/sysconfig/network-scripts/ifcfg-eth0
. . .
IPV6_AUTOCONF=no
DNS1=2001:4860:4860::8844
DNS2=2001:4860:4860::8888
DNS3=8.8.8.8
ZONE=publicweb
А интерфейс eth1 будет привязан к privateDNS:
sudo nano /etc/sysconfig/network-scripts/ifcfg-eth1
. . .
NETMASK=255.255.0.0
DEFROUTE="no"
NM_CONTROLLED="yes"
ZONE=privateDNS
Перезапустите сетевые сервисы и брандмауэр:
sudo systemctl restart network
sudo systemctl restart firewalld
Проверьте зоны:
firewall-cmd --get-active-zones
privateDNS
interfaces: eth1
publicweb
interfaces: eth0
Убедитесь, что в зонах работают нужные сервисы:
firewall-cmd --zone=publicweb --list-services
http htpps ssh
firewall-cmd --zone=privateDNS --list-services
dns
Пользовательские зоны полностью готовы к работе. Вы можете сделать любую из них зоной по умолчанию. Например:
sudo firewall-cmd --set-default-zone=publicweb
Автоматический запуск брандмауэра
Теперь, когда вы проверили все настройки и убедились, что все правила работают должным образом, вы можете настроить автозапуск брандмауэра.
Для этого введите:
sudo systemctl enable firewalld
Теперь брандмауэр будет запускаться вместе с сервером.
Заключение
Брандмауэр firewalld — очень гибкий инструмент. Зоны позволяют быстро изменять политику брандмауэра.
Теперь вы знаете, как работает firewalld, знакомы с основными понятиями брандмауэра, умеете создавать пользовательские зоны и добавлять сервисы.
Tags: ,- Японские телефоны Новый японский смартфон
- Lenovo G500S: характеристики, основные особенности
- Определяем серию продукта видеокарт Nvidia Характеристики карты nvidia 9800 gt
- А конкуренты у смартфона есть
- Что такое расширение файла TRZ?
- Не работает динамик в "айфоне"
- В чем разница внешнего вида защитных стекол для смартфона?