- Настройка firewalld CentOS 7 с примерами команд
- Запуск и остановка firewalld
- Зоны firewalld
- Пример: разрешаем ssh на нестандартном порте
- Разные полезные команды:
- Маскарад (masquerade, он же nat, он же. ):
- Преимущества firewalld
- Недостатки firewalld
- Не хочу firewalld! Верните мне старый iptables!
- Настройка firewalld в CentOS
- Установка и запуск
- Общие команды для управления firewalld
- Управление правилами
- Синтаксис
- Добавление портов
- Добавление сервиса
- Rich-Rule
- Удаление правил
- Управление зонами
- Пример настройки NAT (шлюза)
- Проброс портов
- Запретить или разрешить трафик между интерфейсами
- Запретить
- Разрешить
- Разрешить трафик в одном направлении
- Возможные проблемы при работе с firewalld
Настройка firewalld CentOS 7 с примерами команд
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
# systemctl stop firewalld
# systemctl disable 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 —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:
Разные полезные команды:
Включить режим блокировки всех исходящих и входящих пакетов:
Выключить режим блокировки всех исходящих и входящих пакетов:
Узнать, включен ли режим блокировки всех исходящих и входящих пакетов:
Перезагрузить правила firewalld без потери текущих соединений:
Перезагрузить правила firewalld и сбросить текущие соединения (рекомендуется только в случае проблем):
Добавить к зоне сетевой интерфейс:
# 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 (например, после совершения каких-либо изменений):
Источник
Настройка 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.
Источник