Firewall для linux centos

Настройка 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

Читайте также:  Папка пользователя windows 10 как найти

Вот теперь все ок. Проверяем подключение по 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

Читайте также:  Renaming extensions in windows

Перезапуск iptables (например, после совершения каких-либо изменений):

Источник

Настройка Firewall CentOS 7

Основной брандмауэр в операционных системах Linux — это iptables. Но команды iptables сложны, и многим пользователям тяжело запомнить все опции и случаи, в которых их надо использовать. Поэтому разработчики дистрибутивов создают свои надстройки над iptables, которые помогают упростить управление фаерволом. У CentOS надстройка для управления iptables называется Firewalld.

У Firewalld есть несколько важных отличий, по сравнению с iptables. Здесь управление доступом к сети выполняется на уровне зон и сервисов, а не цепочек и правил. А также правила обновляются динамически, не прерывая запущенных сессий. В этой статье будет рассмотрена настройка Firewall CentOS 7 на примере Firewalld.

Основы использования Firewalld

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

  • drop — блокировать все входящие пакеты, разрешить только исходящие
  • block — в отличие от предыдущего варианта отправителю пакета будет отправлено сообщение по блокировке его пакета;
  • public — поддерживаются входящие соединения только для ssh и dhclient;
  • external — поддерживает NAT для скрытия внутренней сети;
  • internal — разрешены сервисы ssh, samba, mdns и dhcp;
  • dmz — используется для изолированных сервров, у которых нет доступа к сети. Разрешено только подключение по SSH;
  • work — разрешенны сервисы ssh и dhcp;
  • home — аналогично internal;
  • trusted — всё разрешено.

Таким образом, чтобы разрешить или запретить какой-либо сервис, вам достаточно добавить или удалить его из текущей зоны или сменить зону интерфейса на ту, где он разрешён. Можно провести аналогию с политикой действий по умолчанию для пакетов в iptables. Зона trusted имеет политику ACCEPT и разрешает все подключения, зона block имеет политику DENY, которая запрещает все подключения, а все остальные зоны можно считать наследниками зоны block, плюс в них уже предопределены правила разрешения сетевых подключений для некоторых сервисов.

Также у Firewalld есть два вида конфигурации:

  • runtime — действительна только до перезагрузки, все изменения, в которых явно не указано другое, применяются к этой конфигурации;
  • permanent — постоянные настройки, которые будут работать и после перезагрузки.

Теперь вы знаете всё необходимое, поэтому перейдём к утилите firewalld-cmd.

Синтаксис и опции firewall-cmd

Управлять настройками Firewalld можно как с помощью консольной утилиты firewall-cmd, так и в графическом интерфейсе. CentOS чаще всего используется на серверах, поэтому вам придётся работать в терминале. Давайте рассмотрим синтаксис утилиты:

firewall-cmd опции

Для управления зонами используется такой синтаксис:

firewall-cmd —конфигурация —zone=зона опции

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

  • —state — вывести состояние брандмауэра;
  • —reload — перезагрузить правила из постоянной конфигурации;
  • —complete-reload — жёсткая перезагрузка правил с разрывом всех соединений;
  • —runtime-to-permanent — перенести настройки конфигурации runtime в постоянную конфигурацию;
  • —permanent — использовать постоянную конфигурацию;
  • —get-default-zone — отобразить зону, используемую по умолчанию;
  • —set-default-zone — установить зону по умолчанию;
  • —get-active-zones — отобразить активные зоны;
  • —get-zones — отобразить все доступные зоны;
  • —get-services — вывести предопределенные сервисы;
  • —list-all-zones — вывести конфигурацию всех зон;
  • —new-zone — создать новую зону;
  • —delete-zone — удалить зону;
  • —list-all — вывести всё, что добавлено, из выбранной зоны;
  • —list-services — вывести все сервисы, добавленные к зоне;
  • —add-service — добавить сервис к зоне;
  • —remove-service — удалить сервис из зоны;
  • —list-ports — отобразить порты, добавленные к зоне;
  • —add-port — добавить порт к зоне;
  • —remove-port — удалить порт из зоны;
  • —query-port — показать, добавлен ли порт к зоне;
  • —list-protocols — вывести протоколы, добавленные к зоне;
  • —add-protocol — добавить протокол к зоне;
  • —remove-protocol — удалить протокол из зоны;
  • —list-source-ports — вывести порты источника, добавленные к зоне;
  • —add-source-port — добавить порт-источник к зоне;
  • —remove-source-port — удалить порт-источник из зоны;
  • —list-icmp-blocks — вывести список блокировок icmp;
  • —add-icmp-block — добавить блокировку icmp;
  • —add-icmp-block — удалить блокировку icmp;
  • —add-forward-port — добавить порт для перенаправления в NAT;
  • —remove-forward-port — удалить порт для перенаправления в NAT;
  • —add-masquerade — включить NAT;
  • —remove-masquerade — удалить NAT.
Читайте также:  Обычная загрузка windows или запуск средства восстановления при загрузке

Это далеко не все опции утилиты, но для этой статьи нам будет их достаточно.

Настройка Firewall в CentOS 7

1. Статус брандмауэра

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

sudo systemctl status firewalld

Если служба Firewalld отключена, то необходимо её включить:

sudo systemctl start firewalld
sudo systemctl enable firewalld

Теперь нужно посмотреть, запущен ли Firewalld, с помощью команды firewall-cmd:

sudo firewall-cmd —state

Если программа запущена и всё хорошо, то вы получите сообщение «running».

2. Управление зонами

Как вы уже поняли, зоны — это основной инструмент для управления сетевыми подключениями. Чтобы посмотреть зону по умолчанию, выполните:

sudo firewall-cmd —get-default-zone

В моем случае это зона public. Вы можете изменить текущую зону с помощью опции —set-default-zone:

sudo firewall-cmd —set-default-zone=public

Чтобы посмотреть, какие зоны используются для всех сетевых интерфейсов, выполните:

sudo firewall-cmd —get-active-zones

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

sudo firewall-cmd —zone=public —list-all

3. Настройка сервисов

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

sudo firewall-cmd —get-services

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

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

А чтобы удалить этот сервис, выполните:

sudo firewall-cmd —zone=public —remove-service=http —permanent

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

sudo firewall-cmd —reload

Затем, если вы посмотрите конфигурацию зоны, то там появится добавленный сервис:

sudo firewall-cmd —zone=public —list-all

4. Как открыть порт в Firewalld

Если для нужной вам программы нет сервиса, вы можете открыть её порт вручную. Для этого просто добавьте нужный порт к зоне. Например порт 8083:

sudo firewall-cmd —zone=public —add-port=8083/tcp —permanent

Чтобы удалить этот порт из зоны, выполните:

sudo firewall-cmd —zone=public —remove-port=8083/tcp —permanent

Аналогично сервисам, чтобы открыть порт в firewall centos 7 надо перезагрузить брандмауэр.

sudo firewall-cmd —reload

5. Проброс портов Firewalld

Проборс портов в Firewalld настраивается намного проще, чем в iptables. Если вам нужно, например, перенаправить трафик с порта 2223 на порт 22, достаточно добавить к зоне перенаправление:

sudo firewall-cmd —zone=public —add-forward-port=port=2223:proto=tcp:toport=22

Здесь перенаправление выполняется только на текущей машине. Если вы хотите настроить сеть NAT и пробрасывать порт на другую машину, то вам нужно сначала включить поддержку masquerade:

sudo firewall-cmd —zone=public —add-masquerade

Затем уже можно добавить порт:

sudo firewall-cmd —zone=publiс —add-forward-port=port=2223:proto=tcp:toport=22:toaddr=192.168.56.4

6. Расширенные правила

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

rule family = «семейтво» source значение destination значение log audit действие

Вот значение основных параметров:

  • В качестве семейства протоколов можно указать ipv4 или ipv6 или ничего не указывать, тогда правило будет применяться к обоим протоколам;
  • source и destination — это отправитель и получатель пакета. В качестве этих параметров может быть использован IP-адрес (address), сервис (service name), порт (port), протокол (protocol) и так далее;
  • log — позволяет логгировать прохождение пакетов, например в syslog. В этой настройке вы можете указать префикс строчки лога и уровень подробности логгирования;
  • audit — это альтернативный способ логгирования, когда сообщения будут отправляться в службу auditd.
  • Действие — это действие, которое необходимо выполнить с совпавшим пакетом. Доступны: accept, drop, reject, mark.

Давайте рассмотрим несколько примеров. Нам необходимо заблокировать доступ к серверу для пользователя с IP 135.152.53.5:

sudo firewall-cmd —zone=public —add-rich-rule ‘rule family=»ipv4″ source address=135.152.53.5 reject’

Или нам нужно запретить для этого же пользователя только доступ к порту 22:

sudo firewall-cmd —zone=public —add-rich-rule ‘rule family=»ipv4″ source address=135.152.53.5 port port=22 protocol=tcp reject’

Посмотреть все расширенные правила можно командой:

sudo firewall-cmd —list-rich-rules

Выводы

В этой статье мы разобрали, как выполняется настройка firewall в CentOS 7 и какие задачи можно с помощью него выполнить. Программой намного проще пользоваться, чем iptables, но по моему мнению надстройка фаервола от Ubuntu — ufw ещё проще в использовании.

Источник

Оцените статью