Закрыть порты в centos

Обновлено: 06.07.2024

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 позволяет создавать правила с условиями. Рассмотрим несколько примеров:

2. Или для конкретного порта:

3. Чтобы заблокировать подсеть можно воспользоваться командой:

Список правил с условиями можно отобразить командой:

Удаление правил

Аналогично созданию, но вместо 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 --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.

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

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

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

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

Таким образом, чтобы разрешить или запретить какой-либо сервис, вам достаточно добавить или удалить его из текущей зоны или сменить зону интерфейса на ту, где он разрешён. Можно провести аналогию с политикой действий по умолчанию для пакетов в 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.

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

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

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

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

sudo systemctl status firewalld


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

sudo systemctl start firewalld
sudo systemctl enable firewalld

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

sudo firewall-cmd --state

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



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

В обоих случаях мы использовали опцию --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

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 действие

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

Давайте рассмотрим несколько примеров. Нам необходимо заблокировать доступ к серверу для пользователя с 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 ещё проще в использовании.

Межсетевой экран в системе CentOS 7 контролируется программой iptables (для ipv4) и ip6tables (для ipv6).

С помощью утилиты iptables мы можем:

  • ограничить все входящие соединения на свой компьютер или сервер;
  • создать белый список IP-адресов, с которых можно подключиться или наоборот заблокировать конкретный IP-адрес;
  • а также открывать и закрывать порты и многое другое.

В данной инструкции рассмотрены самые распространённые способы использования iptables для тех, кто хочет защитить свою систему от взломщиков или просто разобраться в настройке.

2. Установка утилит межсетевого экрана iptables-services.

Отключение встроенного по умолчанию межсетевого экрана firewalld:

Установка iptables-services взамен firewalld:

Активация iptables-services на сервере:

И проверка работы:

Ответ:


Log-файл хранится здесь: /var/log/messages .

Файл настроек хранится здесь: /etc/sysconfig/iptables .

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

Если вы редактировали конфигурационный файл, iptables нужно перезапустить:

3. Показать статус.

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

Вводим команду и смотрим на отключенный межсетевой экран:

Ответ:


Вводим команду и смотрим на включенный межсетевой экран:

Ответ:


4. Отобразить список правил с номерами строк.

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

Ответ:


Вы можете использовать номера строк для того, чтобы добавлять новые правила.

5. Отобразить INPUT или OUTPUT цепочки правил.

Чтобы посмотреть что входит в ваш сервер:

Ответ:


и выходит из вашего сервера:

Ответ:


6. Остановить, запустить, перезапустить межсетевой экран.

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

7. Удалить правила межсетевого экрана.

Чтобы отобразить номер строки с существующими правилами:

Получим список IP-адресов. Просто посмотрим на номер слева и удалим соответствующую строку.

К примеру для номера 3 :

Или найдем IP-адрес источника 202.54.1.1 и удалим из правила:

8. Добавить правило в межсетевой экран.

Чтобы добавить одно или несколько правил в цепочку, для начала отобразим список с использованием номеров строк:

Ответ:


Чтобы вставить правило между 1 и 2 строкой:

Проверим, обновилось ли правило:

Ответ:


9. Сохраняем правила межсетевого экрана.

Сохранить их можно через утилиту iptables-save :

10. Восстанавливаем правила межсетевого экрана.

Восстановить их так же можно через утилиту iptables-restore :

11. Устанавливаем политики по умолчанию.

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

Чтобы сбрасывать весь трафик:

Ответ:


После вышеперечисленных команд ни один пакет не покинет данный хост.

Ответ:


Ответ:


12. Блокировать только входящие соединения.

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

Ответ:


Ответ:


Ответ:


13. Сбрасывать адреса изолированных сетей в публичной сети.

Список IP-адресов для изолированных сетей:

14. Заблокировать входящие запросы порта.

Чтобы заблокировать все входящие запросы порта 80:

Чтобы заблокировать запрос порта 80 с адреса 1.2.3.4 :

15. Заблокировать запросы на исходящий IP адрес.

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

Ответ:


Найдем CIDR для 157.240.205.35 :

Ответ:


Заблокируем доступ на 157.240.205.35/16 :

Также можно использовать домен для блокировки:

Ответ:


Как видно, ресурс заблокирован!

16. Заблокировать соединение.

16.1. Как заблокировать IP-адрес?

Посмотрим какие сетевые интерфейсы у нас имеются на сервере:

Ответ:


Запрограммируем межсетевой экран не принимать от 192.168.0.39 соединения на сетевом интерфейсе eth0 .

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

Если вы редактировали конфигурационный файл, iptables нужно перезапустить:

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

Ответ:


Ответ:


Как видно 192.168.0.15 категорически отказывается принимать какие-либо сигналы с 192.168.0.39 .

16.2. Как заблокировать подсеть?

Используйте следующий синтаксис для блокирования 192.168.0.0/24 :

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

Если вы редактировали конфигурационный файл, iptables нужно перезапустить:

Действие настроек аналогично примеру выше, но уже для всего диапазона IP-адресов.

17. Разрешить или запретить ICMP Ping запросы.

17.1. Чтобы запретить ping :

17.2. Разрешить для определенных сетей / хостов:

17.3. Разрешить только часть ICMP запросов:

Примечание! Предполагается, что политики по умолчанию для входящих установлены в DROP .

Примечание! Разрешим отвечать на запрос.

18. Открыть диапазон портов.

19. Открыть диапазон адресов.

19.1. Разрешить подключение к порту 80 , если адрес в диапазоне от 192.168.1.100 до 192.168.1.200 .

19.2. Пример для nat .

20. Закрыть или открыть стандартные порты.

Заменить ACCEPT на DROP , чтобы заблокировать порт.

20.1. Ssh tcp port 22.

20.2. Cups (printing service) udp/tcp port 631 для локальной сети.

20.3. Time sync via NTP для локальной сети (udp port 123).

20.4. Tcp port 25 (smtp).

20.5. DNS server ports.

20.7. Tcp port 110 (pop3).

20.8. Tcp port 143 (imap).

20.9. Samba file server для локальной сети.

20.10. Proxy server для локальной сети.

20.11. Mysql server для локальной сети.

20.12. Основные настройки iptables для web-сервера.

Запретим все входящие соединения:

Разрешим все исходящие соединения:

Разрешить входящие соединения с localhost:

Разрешить входящие соединения, которые уже были установлены:

Блокировать все нулевые пакеты:

Блокировать все пакеты XMAS:

Защищаемся от syn-flood:

Откроем порт 22, чтобы была возможность подключаться к серверу по SSH

20.13. Почта, порты для служб.

Открываем порты 25 и 465 для smtp-трафика:

Открываем порты 110 и 995 для pop-трафика:

Открываем порты 143 и 993 для imap-трафика:

21. Ограничить количество параллельных соединений к серверу для одного адреса.

Для ограничений используется connlimit модуль.

Чтобы разрешить только 3 ssh соединения на одного клиента:

22. Помощь по iptables.

Для поиска помощи по iptables, воспользуемся man :

Чтобы посмотреть помощь по определенным командам и целям:

23. Проверка правила iptables.

Проверяем открытость / закрытость портов:

Ответ:


Проверяем открытость / закрытость определенного порта:

Ответ:


Проверим, что iptables разрешает соединение с 80 портом:

Ответ:


Если всё закрыто, то никакого ответа не будет.

В противном случае откроем его для всех:

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

Если вы редактировали конфигурационный файл, iptables нужно перезапустить:

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

Тут будет расширенная информация. Чтобы коротко, да (работает) или нет можно так:

Зоны firewalld

В firewalld широко используется понятие зоны. Список всех допустимых зон по-умолчанию:

Назначение зон (условно, конечно):

  • drop - все входящие пакеты отбрасываются (drop) без ответа. Разрешены только исходящие соединения.
  • block - входящие соединения отклоняются (rejected) с ответом icmp-host-prohibited (или icmp6-adm-prohibited). Разрешены только инициированные системой соединения.
  • public - зона по-умолчанию. Из названия ясно, что эта зона нацелена на работу в общественных сетях. Мы не доверяем этой сети и разрешаем только определенные входящие соединения.
  • external - зона для внешнего интерфейса роутера (т.н. маскарадинг). Разрешены только определенные нами входящие соединения.
  • dmz - зона DMZ, разрешены только определенные входящие соединения.
  • work - зона рабочей сети. Мы все еще не доверяем никому, но уже не так сильно, как раньше :) Разрешены только определенные входящие соединения.
  • home - домашняя зона. Мы доверяем окружению, но разрешены только определенные входящие соединения
  • internal - внутренняя зона. Мы доверяем окружению, но разрешены только определенные входящие соединения
  • trusted - разрешено все.

Список всех активных зон:

Ага, зона public, к которой присоединен сетевой интерфейс enp1so. Дальше в зону public добавим новый порт, на котором будет висеть sshd.

Зная имя сетевого интерфейса (например, enp1s0), можно узнать, к какой зоне он принадлежит:

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

Пример: разрешаем ssh на нестандартном порте

Давайте разрешим доступ к серверу по ssh на порте 2234/tcp, а не на 22/tcp, как по-умолчанию. Попутно чуть-чуть коснемся selinux.

Сначала посмотрим, что вообще разрешено постоянно на нашем сервере:

Я не использую пока ipv6, поэтому сразу уберу соотв. правило из firewalld:

Разрешим на постоянной основе (чтобы после перезагрузки не потерлось) соединение на порт 2234/tcp (на него повесим sshd):

Ок, порт открыт. Редактируем конфиг sshd:

Но SELinux, которую вы, надеюсь, не отключали, не даст подключиться к ssh на нестандартном порте (порт 2234/tcp для sshd - нестандартный). Вы можете этот шаг пропустить и проверить, как сработатет защита SELinux, а можете сразу все настроить:

Вот теперь все ок. Проверяем подключение по ssh на новом порте. Если все ок, закрываем доступ к порту 22:

Смотрим, что получилось:

Разные полезные команды:

Включить режим блокировки всех исходящих и входящих пакетов:

Выключить режим блокировки всех исходящих и входящих пакетов:

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

Перезагрузить правила firewalld без потери текущих соединений:

Перезагрузить правила firewalld и сбросить текущие соединения (рекомендуется только в случае проблем):

Добавить к зоне сетевой интерфейс:

Добавить к зоне сетевой интерфейс (сохранится после перезагрузки firewall):

Можно в конфиге ifcfg-enp1s0 указать, какой зоне принадлежит этот интерфейс. Для этого добавим ZONE=work в файл /etc/sysconfig/network-scripts/ifcfg-enp1s0. Если параметр ZONE не указан, будет назначена зона по-умолчанию (параметр DefaultZone в файле /etc/firewalld/firewalld.conf.

Разрешить диапазон портов:

Маскарад (masquerade, он же nat, он же. ):

Здесь надо отметить, что вы можете включить masquerade и для зоны public, например.

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

Преимущества firewalld

Основное преимущество - вы немного абстрагируетесь от цепочек iptables.Для включения перенаправления портов не придется думать про PREROUTING или POSTROUTING в дополнение к FORWARD. Вам дается "API от iptables от производителя", что-то в этом роде. Если вы включили nat, то неважно, где конкретно (под каким порядковым номером текущих правил) размещено правило. Вы просто указываете - включи nat на eth0. И без глупостей ;) Это может быть удобно, если надо организовать web интерфейс управления брандмауэром.

Недостатки firewalld

Основной недостаток, на мой взгляд, это то, что при привыкании начнется отвыкание от "чистого" iptables, который и в Debian, и в Ubuntu, и в CentOS и, вообще, везде. Даже, кстати, в микротик синтаксис и цепочки похожи по типу на iptables. Это на любителя, конечно. И профессионалу все равно, с чем работать, если есть конкретные условия, он будет работать с тем, что есть. Но. я ретроград и отчаянно сопротивляюсь (при отсутсвии явных преимуществ) новинкам, которые каждый крупный игрок реализует под себя. RedHat выгодно, если все больше новых специалистов будут асами в firewalld.

И если вы перешли на firewalld, то уже чистый синтаксис iptables вам только помешает - будет каша или просто сломается работа брандмауэра, если вы начнете изменять/дополнять правила не с помощью стандартного синтаксиса firewalld.

Не хочу firewalld! Верните мне старый iptables!

Если все же вы хотите вернуть прошлое и заменить firewalld на iptables, то сделать это совсем не трудно:

Новичкам тут не место:

Ставим старый добрый iptables:

Автозапуск при включении:

Для сохранения правил iptables после перезагрузки:

Текущие правила находятся в файлах:
/etc/sysconfig/iptables
/etc/sysconfig/ip6tables

Читайте также: