Установленный в операционной системе Firewall используется для предотвращения несанкционированного прохождения трафика между компьютерными сетями. Вручную или автоматически создаются специальные правила для межсетевого экрана, которые и отвечают за управление доступом. В ОС, разработанной на ядре Linux, CentOS 7 имеется встроенный фаервол, а управление им осуществляется с помощью брандмауэра. По умолчанию задействован FirewallD, и о его настройке мы бы хотели поговорить сегодня.

Как уже было сказано выше, стандартным брандмауэром в CentOS 7 назначена утилита FirewallD. Именно поэтому настройка фаервола будет рассмотрена на примере этого инструмента. Задать правила фильтрации можно и с помощью той же iptables, но это выполняется немного другим образом. С конфигурацией упомянутой утилиты рекомендуем ознакомиться, перейдя по следующей ссылке, а мы же начнем разбор FirewallD.

Основные понятия межсетевого экрана

Существует несколько зон — наборов правил для управления трафиком на основе доверия к сетям. Всем им задаются собственные политики, совокупность которых и образует конфигурацию брандмауэра. Каждой зоне присваивается один или несколько сетевых интерфейсов, что также позволяет регулировать фильтрацию. От используемого интерфейса напрямую зависят применяемые правила. Например, при подключении к общедоступному Wi-Fi сетевой экран повысит уровень контроля, а в домашней сети откроет дополнительный доступ для участников цепи. В рассматриваемом фаерволе присутствуют такие зоны:

  • trusted — максимальный уровень доверия ко всем устройствам сети;
  • home — группа локальной сети. Существует доверие к окружению, но при этом входящие соединения доступны только для определенных машин;
  • work — рабочая зона. Присутствует доверие к большинству устройств, а также активируются дополнительные сервисы;
  • dmz — зона для изолированных компьютеров. Такие устройства отсоединены от остальной сети и пропускают только определенный входящий трафик;
  • internal — зона внутренних сетей. Доверие применяется ко всем машинам, открываются дополнительные сервисы;
  • external — обратная к предыдущей зона. Во внешних сетях активна маскировка NAT, закрывая внутреннюю сеть, но не блокируя возможность получения доступа;
  • public — зона общедоступных сетей с недоверием ко всем устройствам и индивидуальным приемом входящего трафика;
  • block — все входящие запросы сбрасываются с отправлением ошибки icmp-host-prohibited или icmp6-adm-prohibited ;
  • drop — минимальный уровень доверия. Входящие соединения сбрасываются без каких-либо уведомлений.

Сами же политики бывают временные и постоянные. При появлении или редактировании параметров действие фаервола сразу меняется без надобности перезагрузки. Если же были применены временные правила, после рестарта FirewallD они будут сброшены. Перманентное правило на то так и называются — оно будет сохранено на постоянной основе при применении аргумента -permanent .

Включение брандмауэра FirewallD

Для начала нужно запустить FirewallD или убедиться в том, что он находится в активном состоянии. Только функционирующий демон (программа, работающая в фоновом режиме) будет применять правила для межсетевого экрана. Активация производится буквально в несколько кликов:

  1. Запустите классический «Терминал» любым удобным методом, к примеру, через меню «Приложения» .
  2. Введите команду sudo systemctl start firewalld.service и нажмите на клавишу Enter .
  3. Управление утилитой осуществляется от имени суперпользователя, поэтому придется подтвердить подлинность, указав пароль.
  4. Чтобы убедиться в функционировании сервиса, укажите firewall-cmd --state .
  5. В открывшемся графическом окне повторно подтвердите подлинность.
  6. Отобразится новая строка. Значение «running» говорит о том, что фаервол работает.

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

Просмотр правил по умолчанию и доступных зон

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

  1. Определить функционирующую по умолчанию зону поможет команда firewall-cmd --get-default-zone .
  2. После ее активации вы увидите новую строку, где отобразится необходимый параметр. Например, на скриншоте ниже активной считается зона «public» .
  3. Однако активными могут быть сразу несколько зон, к тому же они привязываются к отдельному интерфейсу. Узнайте эту информацию через firewall-cmd --get-active-zones .
  4. Команда firewall-cmd --list-all выведет на экран правила, заданные для зоны по умолчанию. Обратите внимание на скриншот ниже. Вы видите, что активной зоне «public» присвоено правило «default» — функционирование по умолчанию, интерфейс «enp0s3» и добавлено два сервиса.
  5. Если появилась надобность узнать все доступные зоны брандмауэра, введите firewall-cmd --get-zones .
  6. Параметры же конкретной зоны определяются через firewall-cmd --zone=name --list-all , где name — название зоны.

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

Настройка зон интерфейсов

Как вы знаете из информации выше, для каждого интерфейса определяется своя зона по умолчанию. Он будет находиться в ней до тех пор, пока настройки не изменятся пользователем или программно. Возможен ручной перенос интерфейса в зону на одну сессию, и осуществляется он активацией команды sudo firewall-cmd --zone=home --change-interface=eth0 . Результат «success» свидетельствует о том, что перенос прошел успешно. Напомним, что такие настройки сбрасываются сразу после перезагрузки фаервола.

При подобном изменении параметров следует учитывать, что работа сервисов может быть сброшена. Некоторые из них не поддерживают функционирование в определенных зонах, допустим, SSH хоть и доступен в «home» , но в пользовательских или особенных сервис работать откажется. Убедиться в том, что интерфейс был успешно привязан к новой ветви можно, введя firewall-cmd --get-active-zones .

Если вы захотите сбросить произведенные ранее настройки, просто выполните рестарт брандмауэра: sudo systemctl restart firewalld.service .

Порой не всегда удобно изменять зону интерфейса всего на одну сессию. В таком случае потребуется редактировать конфигурационный файл, чтобы все настройки ввелись на перманентной основе. Для этого мы советуем использовать текстовый редактор nano , который устанавливается с официального хранилища sudo yum install nano . Далее остается произвести такие действия:

  1. Откройте конфигурационный файл через редактор, введя sudo nano /etc/sysconfig/network-scripts/ifcfg-eth0 , где eth0 — название необходимого интерфейса.
  2. Подтвердите подлинность учетной записи для выполнения дальнейших действий.
  3. Отыщите параметр «ZONE» и поменяйте его значение на нужное, например, public или home .
  4. Зажмите клавиши Ctrl + O , чтобы сохранить изменения.
  5. Не изменяйте имя файла, а просто нажмите на Enter .
  6. Выйдите из текстового редактора через Ctrl + X .

Теперь зона интерфейса будет такой, какой вы ее указали, до момента следующего редактирования конфигурационного файла. Чтобы обновленные параметры вступили в действие, выполните sudo systemctl restart network.service и sudo systemctl restart firewalld.service .

Установка зоны по умолчанию

Выше мы уже демонстрировали команду, которая позволяла узнать установленную по умолчанию зону. Ее также можно изменить, установив параметр на свой выбор. Для этого в консоли достаточно прописать sudo firewall-cmd --set-default-zone=name , где name — имя необходимой зоны.

Об успешности выполнения команды будет свидетельствовать надпись «success» в отдельной строке. После этого все текущие интерфейсы привяжутся к указанной зоне, если другого не задано в конфигурационных файлах.

Создание правил для программ и утилит

В самом начале статьи мы рассказали о действии каждой зоны. Определение сервисов, утилит и программ в такие ветви позволит применить для каждой из них индивидуальные параметры под запросы каждого пользователя. Для начала советуем ознакомиться с полным списком доступных на данный момент сервисов: firewall-cmd --get-services .

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

Указанная выше команда демонстрирует только названия сервисов. Детальная информация по каждому из них получается через индивидуальный файл, находящийся по пути /usr/lib/firewalld/services . Такие документы имеют формат XML, путь, например, к SSH выглядит так: /usr/lib/firewalld/services/ssh.xml , а документ имеет следующее содержимое:

SSH
Secure Shell (SSH) is a protocol for logging into and executing commands on remote machines. It provides secure encrypted communications. If you plan on accessing your machine remotely via SSH over a firewalled interface, enable this option. You need the openssh-server package installed for this option to be useful.

Активируется поддержка сервиса в определенной зоне вручную. В «Терминале» следует задать команду sudo firewall-cmd --zone=public --add-service=http , где --zone=public — зона для активации, а --add-service=http — название сервиса. Учтите, что такое изменение будет действовать только в пределах одной сессии.

Перманентное добавление осуществляется через sudo firewall-cmd --zone=public --permanent --add-service=http , а результат «success» свидетельствует об успешном завершении операции.

Просмотреть полный список постоянных правил для определенной зоны можно, отобразив список в отдельной строке консоли: sudo firewall-cmd --zone=public --permanent --list-services .

Решение неполадки с отсутствием доступа к сервису

Стандартно в правилах брандмауэра указаны самые популярные и безопасные сервисы как разрешенные, однако некоторые стандартные или сторонние приложения он блокирует. В таком случае пользователю вручную потребуется изменить настройки, чтобы решить проблему с доступом. Сделать это можно двумя разными методами.

Проброс порта

Как известно, все сетевые сервисы используют определенный порт. Он запросто обнаруживается межсетевым экраном, и по нему могут выполняться блокировки. Чтобы избежать таких действий со стороны фаервола, нужно открыть необходимый порт командой sudo firewall-cmd --zone=public --add-port=0000/tcp , где --zone=public — зона для порта, --add-port=0000/tcp — номер и протокол порта. Опция firewall-cmd --list-ports отобразит список открытых портов.

Если же вам необходимо открыть порты, входящие в диапазон, воспользуйтесь строкой sudo firewall-cmd --zone=public --add-port=0000-9999/udp , где --add-port=0000-9999/udp — диапазон портов и их протокол.

Приведенные выше команды лишь позволят протестировать применение подобных параметров. Если оно прошло успешно, следует добавить эти же порты в постоянные настройки, а делается это путем ввода sudo firewall-cmd --zone=public --permanent --add-port=0000/tcp или sudo firewall-cmd --zone=public --permanent --add-port=0000-9999/udp . Список открытых постоянных портов просматривается так: sudo firewall-cmd --zone=public --permanent --list-ports .

Определение сервиса

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


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

Создание пользовательских зон

Вы уже знаете, что изначально в FirewallD создано большое количество разнообразных зон с определенными правилами. Однако случаются ситуации, когда системному администратору требуется создать пользовательскую зону, как, например, «publicweb» для установленного веб-сервера или «privateDNS» — для DNS-сервера. На этих двух примерах мы и разберем добавление ветвей:


Из этой статьи вы узнали, как создавать пользовательские зоны и добавлять в них сервисы. Об установке их по умолчанию и присвоении интерфейсов мы уже рассказали выше, вам остается лишь указать правильные названия. Не забывайте перезагружать межсетевой экран после внесения любых перманентных изменений.

Как видите, брандмауэр FirewallD — достаточно объемный инструмент, позволяющий произвести максимально гибкую конфигурацию межсетевого экрана. Осталось только убедиться в том, что утилита запускается вместе с системой и указанные правила сразу же начинают свою работу. Сделайте это командой sudo systemctl enable firewalld .

Сегодня я познакомлю вас со своим видением начальной конфигурации универсального сервера на популярной ОС. Я расскажу о том, как сделать базовую настройку сервера centos сразу после установки для использования его в любом качестве на ваше усмотрение. Приведенные практические советы повышают безопасность и удобство работы с сервером. Статья будет актуальна для двух последних релизов Centos — 7 и 8.

  1. Перечислить начальные настройки centos, которые я выполняю на свежеустановленном сервере.
  2. Показать примеры конфигураций, которые я использую в типовой настройке.
  3. Дать советы по настройке centos на основе своего опыта работы с системой.
  4. Привести список типовых программ и утилит, которые помогают администрировать сервер.

Данная статья является частью единого цикла статьей про сервер .

Введение

После выхода нового релиза Centos 8, стало тяжело в единой статье описывать начальную настройку обоих серверов, но мне не захотелось разделять статью, так как на нее идет много входящих ссылок из разных мест. Удобнее поддерживать общий материал по обоим релизам, чем я и займусь. Заодно наглядно будут видны отличия двух версий, которые пару лет после выхода centos 8 будут актуальны обе и использовать придется и ту, и другую версию, в зависимости от ситуации.

В Centos 7 используется пакетный менеджер yum , а в Centos 8 — dnf . При этом оставили символьную ссылку с yum на dnf, так что можно писать как первое название, так и второе. Для единообразия я везде буду использовать yum, а вас предупреждаю, просто чтобы вы понимали, почему я делаю именно так. Реально в CentOS 8 используется dnf, это другой, более современный пакетный менеджер, которые позволяет работать с разными версиями одного и того же софта. Для этого используются отдельные репозитории, которые появились для centos 8.

Начальная настройка CentOS

Лично я любую настройку системы, будь то centos или другая, после установки начинаю с того, что полностью обновляю систему. Если установочный образ был свежий, либо установка велась по сети, то скорее всего обновлений никаких не будет. Чаще всего они есть, так как установочные образы не всегда регулярно обновляются.

Обновляем систему

# yum update

Для удобства администрирования, я всегда устанавливаю Midnight Commander, или просто mc:

# yum install mc

И сразу же для него включаю подсветку синтаксиса всех файлов, которые не обозначены явно в файле /usr/share/mc/syntax/Syntax синтаксисом для sh и bash скриптов. Этот универсальный синтаксис нормально подходит для конфигурационных файлов, с которыми чаще всего приходится работать на сервере. Перезаписываем файл unknown.syntax . Именно этот шаблон будет применяться к.conf и.cf файлам, так как к ним явно не привязано никакого синтаксиса.

# cp /usr/share/mc/syntax/sh.syntax /usr/share/mc/syntax/unknown.syntax

Дальше нам пригодятся сетевые утилиты. В зависимости от набора начальных пакетов, которые вы выбираете при установке системы, у вас будет тот или иной набор сетевых утилит. Вот список тех, к которым привык лично я — ifconfig, netstat, nslookup и некоторые другие. Если она вам нужны, так же как и мне, то предлагаю их установить отдельно, если они еще не стоят. Если вам они особо не нужны и вы ими не пользуетесь, то можете пропустить их установку. Проверим, что у нас имеется в системе на текущий момент

# ifconfig

Если увидите ответ:

Bash: ifconfig: command not found

Значит утилита не установлена. Вместо ifconfig в CentOS теперь утилита ip . Это относится не только к центос. Такая картина почти во всех популярных современных дистрибутивах Linux. Я с давних времен привык к ifconfig, хотя последнее время практически не пользуюсь. Мне всегда нравилось, что в различных дистрибутивах линукс все примерно одинаковое. С помощью ifconfig можно настроить сеть не только в linux, но и в freebsd. Это удобно. А когда в каждом дистрибутиве свой инструмент это не удобно. Хотя сейчас это уже не очень актуально, так как с Freebsd больше не работаю, а утилита ip есть во всех дистрибутивах linux. Тем не менее, если вам нужен ifconfig, то можете установить пакет net-tools , в который она входит:

# yum install net-tools

Чтобы у нас работали команды nslookup или, к примеру, host необходимо установить пакет bind-utils . Если этого не сделать, то на команду:

# nslookup

Будет вывод:

Bash: nslookup: command not found

Так что устанавливаем bind-utils:

# yum install bind-utils

Отключить SELinux

Отключаем SELinux. Его использование и настройка отдельный разговор. Сейчас я не буду этим заниматься. Так что отключаем:

# mcedit /etc/sysconfig/selinux

меняем значение

SELINUX=disabled

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

# reboot

А если хотите без перезагрузки применить отключение SELinux, то выполните команду:

# setenforce 0

Постоянно получаю очень много критики на тему отключения SELinux. Я знаю, как он работает, умею его настраивать. Это реально не очень сложно и освоить не трудно. Это мой осознанный выбор, хотя иногда я его настраиваю. Мой формат работы с системой таков, что SELinux мне чаще всего не нужен, поэтому я не трачу на него время и в базовой настройке centos отключаю. Безопасность системы — комплексная работа, особенно в современном мире web разработки, где правят бал микросервисы и контейнеры. SELinux нишевый инструмент, которые нужен не всегда и не везде. Поэтому в данном статье ему не место. Кому нужно, будет отдельно включать SELinux и настраивать.

Указываем сетевые параметры

Продолжаем базовую настройку centos после установки. Теперь произведем , если по какой-то причине не сделали это во время установки, либо если вам надо их изменить. В общем случае, сеть в Centos настраивается с помощью NetworkManager и его консольной утилиты nmtui . Она идет в базовой устновке системы. Там простой и понятный графический интерфейс, так что рассказывать нечего. Я больше привык настраивать сеть через конфигурационные файлы network-scripts. В centos 7-й версии они есть из коробки, в 8-й версии их убрали. Чтобы воспользоваться ими для настройки сети, надо отдельно установить пакет network-scripts .

# yum install network-scripts

Теперь можно выполнить настройку сети. Для этого открываем файл /etc/sysconfig/network-scripts/ifcfg-eth0

# mcedit /etc/sysconfig/network-scripts/ifcfg-eth0

Если вы получаете сетевые настройки по dhcp, то минимальный набор настроек в конфигурационном файле будет такой.

TYPE="Ethernet" BOOTPROTO="dhcp" DEFROUTE="yes" IPV4_FAILURE_FATAL="no" NAME="eth0" DEVICE="eth0" ONBOOT="yes"

Для настройки статического ip адреса настройки будут следующие.

TYPE="Ethernet" BOOTPROTO="none" DEFROUTE="yes" IPV4_FAILURE_FATAL="no" NAME="eth0" DEVICE="eth0" ONBOOT="yes" IPADDR=192.168.167.117 DNS1=192.168.167.113 PREFIX=28 GATEWAY=192.168.167.113

В поле IPADDR вводим свой адрес, в PREFIX маску сети, в GATEWAY шлюз, DNS адрес днс сервера. Сохраняем файл и перезапускаем сеть для применения настроек:

# systemctl restart network

Настраиваем firewall

Добавление репозиториев

При настройке centos частенько нужен софт, которого нет в стандартной репе. Для инсталляции дополнительных пакетов необходимо . Наиболее популярный это EPEL. Раньше был rpmforge, но уже как несколько лет закрыт. Про него все позабыли. Подключаем репозиторий EPEL. С ним все просто, он добавляется из стандартной репы:

# yum install epel-release

Так же для CentOS 7 крайне полезен репозиторий REMI, который позволяет установить больее свежие версии php, в отличие от тех, что есть в стандартном репозитории. Напомню, что это версия php 5.4, которая уже никуда не годится и снята с поддержки.

# rpm -Uhv http://rpms.remirepo.net/enterprise/remi-release-7.rpm

Для Centos 8 remi пока не актуален, но думаю, что это временно. В принципе, мне этих двух репозиториев в centos обычно хватает в общем случае. Другие подключаются уже под конкретные нужды для установки различного софта.

Настройка хранения истории в bash_history

Двигаемся дальше по настройке системы centos на сервере. Полезным будет внести некоторые изменения в стандартный механизм сохранения истории команд. Он часто выручает, когда надо вспомнить одну из ранее введенных команд. Стандартные настройки имеют некоторые ограничения, которые неудобны. Вот их список:

  1. По-умолчанию, сохраняются только последние 1000 команд. Если их будет больше, то более старые будут удаляться и заменяться новыми.
  2. Не указаны даты выполнения команд, только их список в порядке выполнения.
  3. Файл со списком команд обновляется после завершения сессии. При параллельных сессиях часть команд может быть утеряна.
  4. Сохраняются абсолютно все команды, хотя в хранении некоторых нет никакого смысла.

Список последних выполненных команд хранится в домашней директории пользователя в файле .bash_history (в начале точка). Его можно открыть любым редактором и посмотреть. Для более удобного вывода списка, можно в консоли ввести команду:

# history

и увидеть пронумерованный список. Быстро найти конкретную команду, можно с помощью фильтрации только нужных строк, например вот так:

# history | grep yum

Так мы увидим все варианты запуска команды yum, которые хранятся в истории. Исправим перечисленные недостатки стандартных настроек хранения истории команд в CentOS. Для этого нужно отредактировать файл .bashrc , который находится в том же каталоге, что и файл с историей. Добавляем в него следующие строки:

Export HISTSIZE=10000 export HISTTIMEFORMAT="%h %d %H:%M:%S " PROMPT_COMMAND="history -a" export HISTIGNORE="ls:ll:history:w:htop"

Первый параметр увеличивает размер файла до 10000 строк. Можно сделать и больше, хотя обычно хватает такого размера. Второй параметр указывает, что необходимо сохранять дату и время выполнения команды. Третья строка вынуждает сразу же после выполнения команды сохранять ее в историю. В последней строке мы создаем список исключений для тех команд, запись которых в историю не требуется. Я привел пример самого простого списка. Можете дополнить его на свое усмотрение.

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

# source ~/.bashrc

По настройке хранения истории команд все. В файле .bashrc можно много чего настроить интересного. Я одно время увлекался и экспериментировал, но потом все забросил, так как не имеет смысла. Работая с серверами заказчиков я чаще всего вижу дефолтный bash, поэтому лучше привыкать и работать именно в нем. А отдельные настройки и украшательства это удел личных компьютеров и серверов. Не рабочих. Так что больше я ничего не настраивать по стандарту в centos сервере в этом плане.

Автоматическое обновление системы

Для поддержания безопасности сервера на должном уровне необходимо как минимум своевременно его обновлять — как само ядро с системными утилитами, так и остальные пакеты. Можно делать это вручную, но для более эффективной работы лучше настроить автоматическое выполнение. Не обязательно именно устанавливать обновления автоматически, но как минимум проверять их появление. Я обычно придерживаюсь такой стратегии.

Yum-cron

Для автоматической проверки обновлений в Centos 7 нам поможет утилита yum-cron . Ставится она традиционно через yum из стандартного репозитория.

# yum install yum-cron

После установки yum-cron создается автоматическое задание на выполнение утилиты в /etc/cron.daily и /etc/cron.hourly . По-умолчанию, утилита скачивает найденные обновления, но не применяет их. Вместо этого, администратору на локальный почтовый ящик root отправляется уведомление об обновлениях. Дальше вы уже в ручном режиме заходите и решаете, устанавливать обновления или нет в удобное для вас время. Мне такой режим работы видится наиболее удобным, поэтому я не меняю эти настройки.

Настраивать yum-cron можно через, конфигурационные файлы, которые находятся по адресу /etc/yum/yum-cron.conf и yum-cron-hourly.conf . Они неплохо прокомментированы, так что в подробных разъяснениях не нуждаются. Обращаю внимание на раздел , где можно указать параметры отправки сообщений. По-умолчанию стоит отправка почты через локальный хост. Можно тут изменить параметры и отправлять сообщения через сторонний почтовый сервер. Но вместо этого лично я предпочитаю глобально для всего сервера настроить пересылку локальной почты root на внешний почтовый ящик через авторизацию на другом smtp сервере.

Dnf-automatic

Как я уже говорил ранее, в Centos 8 используется другой пакетный менеджер — dnf. Настройка обновления пакетов там выполняется через утилиту dnf-automatic . Поставим ее и настроим.

# yum install dnf-automatic

Управлением запуском по расписанию занимается уже не cron, а systemd своим встроенным планировщиком. Посмотреть таймеры автоматического запуска можно командой:

# systemctl list-timers *dnf-*

Если там нет ни одного задания, то добавить таймер можно вручную:

# systemctl enable --now dnf-automatic.timer

Дефолтный таймер настроен на запуск dnf-automatic через час после загрузки сервера и ежедневное повторение. Конфиг таймера живет тут — /etc/systemd/system/multi-user.target.wants/dnf-automatic.timer .

Конфиг для dnf-automatic живет в /etc/dnf/automatic.conf . По-умолчанию он только скачивает обновления, но не применят их. Конфиг хорошо прокомментирован, так что можете его настроить так, как пожелаете. Отдельных пояснений не требуется. Настраивайте обновление пакетов системы на свое усмотрение. Как я уже сказал, автоматически только качаю их. Установку всегда держу под контролем с ручным управлением.

Отключаем флуд сообщений в /var/log/messages

Продолжая настройку centos, исправим одно небольшое неудобство. В дефолтной установке системы 7-й версии, весь ваш системный лог /var/log/messages через некоторое время работы сервера будет забит следующими записями.

Oct 16 14:01:01 xs-files systemd: Created slice user-0.slice. Oct 16 14:01:01 xs-files systemd: Starting user-0.slice. Oct 16 14:01:01 xs-files systemd: Started Session 14440 of user root. Oct 16 14:01:01 xs-files systemd: Starting Session 14440 of user root. Oct 16 14:01:01 xs-files systemd: Removed slice user-0.slice. Oct 16 14:01:01 xs-files systemd: Stopping user-0.slice. Oct 16 15:01:01 xs-files systemd: Created slice user-0.slice. Oct 16 15:01:01 xs-files systemd: Starting user-0.slice. Oct 16 15:01:01 xs-files systemd: Started Session 14441 of user root. Oct 16 15:01:01 xs-files systemd: Starting Session 14441 of user root. Oct 16 15:01:01 xs-files systemd: Started Session 14442 of user root. Oct 16 15:01:01 xs-files systemd: Starting Session 14442 of user root. Oct 16 15:01:01 xs-files systemd: Removed slice user-0.slice. Oct 16 15:01:01 xs-files systemd: Stopping user-0.slice. Oct 16 16:01:01 xs-files systemd: Created slice user-0.slice. Oct 16 16:01:01 xs-files systemd: Starting user-0.slice. Oct 16 16:01:01 xs-files systemd: Started Session 14443 of user root. Oct 16 16:01:01 xs-files systemd: Starting Session 14443 of user root. Oct 16 16:01:01 xs-files systemd: Removed slice user-0.slice.

В Centos 8 я их не заметил, поэтому там ничего делать не надо. Никакой практической пользы сообщения не несут, поэтому отключим их. Для этого создадим отдельное правило для rsyslog, где перечислим все шаблоны сообщений, которые будем вырезать. Разместим это правило в отдельном файле /etc/rsyslog.d/ignore-systemd-session-slice.conf .

# cd /etc/rsyslog.d && mcedit ignore-systemd-session-slice.conf if $programname == "systemd" and ($msg contains "Starting Session" or $msg contains "Started Session" or $msg contains "Created slice" or $msg contains "Starting user-" or $msg contains "Starting User Slice of" or $msg contains "Removed session" or $msg contains "Removed slice User Slice of" or $msg contains "Stopping User Slice of") then stop

Сохраняем файл и перезапускаем rsyslog для применения настроек.

# systemctl restart rsyslog

Необходимо понимать, что в данном случае мы отключаем флуд в лог файл только на локальном сервере. Если вы храните логи на , то данное правило нужно будет настраивать именно на нем.

Установка iftop, atop, htop, lsof на CentOS

И напоследок в завершении настройки добавим несколько полезных утилит, которые могут пригодиться в процессе эксплуатации сервера.

iftop показывает в режиме реального времени загрузку сетевого интерфейса, может запускаться с различными ключами, не буду останавливаться на этом подробно, в интернете есть информация на эту тему. Ставим:

# yum install iftop

И два интересных диспетчера задач, я чаще всего пользуюсь htop, но иногда пригодится и atop. Ставим оба, сами посмотрите, разберетесь, что вам больше нравится, подходит:

# yum install htop # yum install atop

Для вывода информации о том, какие файлы используются теми или иными процессами, советую поставить утилиту lsof . Она скорее всего рано или поздно пригодится, когда будете диагностировать работу сервера.

# yum install wget bzip2 traceroute gdisk

На этом у меня все. Базовая настройка CentOS закончена, можно приступать к установке и настройке основного функционала.

Настройка системной почты

В завершение настройки сервера CentOS сделаем так, что бы почта, адресованная локальному root, отправлялась через внешний почтовый сервер на выбранный почтовый ящик. Если этого не сделать, то она будет локально складываться в файл /var/spool/mail/root . А там может быть важная и полезная информация. Настроим ее отправку в ящик системного администратора.

Подробно об этом я рассказал в отдельной статье — . Здесь кратко только команды и быстрая настройка. Ставим необходимые пакеты:

# yum install mailx cyrus-sasl cyrus-sasl-lib cyrus-sasl-plain postfix

Рисуем примерно такой конфиг для postfix.

Cat /etc/postfix/main.cf ## DEFAULT CONFIG BEGIN ###################### queue_directory = /var/spool/postfix command_directory = /usr/sbin daemon_directory = /usr/libexec/postfix data_directory = /var/lib/postfix mail_owner = postfix inet_interfaces = localhost inet_protocols = all unknown_local_recipient_reject_code = 550 alias_maps = hash:/etc/aliases alias_database = hash:/etc/aliases debug_peer_level = 2 debugger_command = PATH=/bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin ddd $daemon_directory/$process_name $process_id & sleep 5 sendmail_path = /usr/sbin/sendmail.postfix newaliases_path = /usr/bin/newaliases.postfix mailq_path = /usr/bin/mailq.postfix setgid_group = postdrop html_directory = no manpage_directory = /usr/share/man sample_directory = /usr/share/doc/postfix-2.10.1/samples readme_directory = /usr/share/doc/postfix-2.10.1/README_FILES ## DEFAULT CONFIG END ###################### # Имя сервера, которое выводит команда hostname myhostname = centos-test.xs.local # Здесь по логике нужно оставлять только домен, но в данном случае лучше оставить полное имя сервера, чтобы в поле отправитель # фигурировало полное имя сервера, так удобнее разбирать служебные сообщения mydomain = centos-test.xs.local mydestination = $myhostname myorigin = $mydomain # Адрес сервера, через который будем отправлять почту relayhost = mailsrv.mymail.ru:25 smtp_use_tls = yes smtp_sasl_auth_enable = yes smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd smtp_sasl_security_options = noanonymous smtp_tls_security_level = may

Создаем файл с информацией об имени пользователя и пароле для авторизации.

# mcedit /etc/postfix/sasl_passwd mailsrv.mymail.ru:25 [email protected]:password

Создаем db файл.

# postmap /etc/postfix/sasl_passwd

Теперь можно перезапустить postfix и проверить работу.

# systemctl restart postfix

К стандартному алиасу для root в /etc/aliases , добавьте внешний адрес, куда будет дублироваться почта, адресованная root. Для этого редактируем указанный файл, изменяя последнюю строку.

#root: marc

Root: root,[email protected]

Обновляем базу сертификатов:

# newaliases

Отправим письмо через консоль локальному руту:

# df -h | mail -s "Disk usage" root

Письмо должно уйти на внешний ящик. Если вы будете использовать ящик от Яндекса, то скорее всего получите ошибку в логе почтового сервера и письмо не будет отправлено.

Relay=smtp.yandex.ru:25, delay=0.25, delays=0/0/0.24/0.01, dsn=5.7.1, status=bounced (host smtp.yandex.ru said: 553 5.7.1 Sender address rejected: not owned by auth user. (in reply to MAIL FROM command))

Ошибка эта означает то, что у вас в качестве отправителя почты указан не тот же ящик, что вы используете для авторизации. Как это исправить, я рассказываю в отдельной статье — . С другими почтовыми системами, где нет подобной проверки, все должно быть нормально и так.

На этом настройка локальной почты закончена. Теперь все письма, адресованные локальному root, например, отчеты от cron, будут дублироваться на внешний почтовый ящик, причем с отправкой через полноценный почтовый сервер. Так что письма будут нормально доставляться, не попадая в спам (хотя не обязательно, есть еще эвристические фильтры).

Заключение

Мы выполнили некоторые начальные шаги по настройке сервера CentOS, которые я обычно делаю при подготовке сервера сразу после установки. Я не претендую на абсолютную истину, возможно что-то упускаю или делаю не совсем верно. Буду рад разумным и осмысленным комментариям и замечаниям с предложениями.

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

    Мы покажем вам пошаговую настройку брандмауэра Firewalld в CentOS 7

    Что же такое Firewalld? Это полноценный брандмауэр, который по умолчанию доступен в CentOS 7. Мы покажем вам, как настроить его на сервере, а также расскажем об инструменте firewall-cmd.

    1. Какие же базовые понятия у брандмауэра?

    Зоны

    Firewalld способен управлять группами правил посредством зон. Это набор инструкций для управления трафиком на основе доверия к сетям. Зону можно присвоить сетевому интерфейсу для управления поведения брандмауэра. Это бывает необходимо, ведь ноутбуки могут часто подключаться к различным сетям. Компьютеры могут применять зоны для смены набора правил в зависимости от окружения. Например, если подключаться к Wi-Fi в кафе, можно применять более строгие инструкции. А дома правила могут быть лояльнее.

    В Firewalld выделяют такие зоны:

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

    Block отличается от drop тем, что при сбросе входящего запроса выдается сообщение icmp-host-prohibited либо icmp6-adm-prohibited;

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

    External - это зона внешних сетей, поддерживающая маскировку NAT для закрытости внутренней сети. Однако к ней можно получить доступ;

    Обратной стороной external является internal. Компьютерам в данной зоне можно доверять, поэтому доступными будут дополнительные сервисы;

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

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

    В зоне trusted доверять можно всем компьютерам сети.

    Сохранения правил

    В Firewalld они бывают временными и постоянными. Бывает так, что в наборе меняется либо появляется правило влияющее на поведение брандмауэра. Изменения будут потеряны после перезагрузки, поэтому их нужно сохранять. Команды firewall-cmd применяют флаг -permanent для сохранения правил. После этого ими получится пользоваться на постоянной основе.

    2. Как включить брандмауэр Firewalld?

    Начать стоит с запуска в фоновом режиме программы-демона. Unit-файл systemd носит название firewalld.service. для включения программы-демона нужно в командной строке набрать:

    Sudo systemctl start firewalld.service

    Нам нужно убедиться, что сервис запустился. Для этого понадобится:

    Firewall-cmd --state running

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

    3. Брандмауэрные правила по умолчанию

    Как их просмотреть?

    Для просмотра зоны, использующейся по умолчанию, нужно набрать:

    Firewall-cmd --get-default-zone public

    Мы видим, что Firewalld инструкций в отношении других зон не получал. Public используется по умолчанию и является единственной активной зоной, т.к. ни один интерфейс не привязывался к другим. Если хотите увидеть список всех доступных доменных зон, то укажите в консоли:

    Firewall-cmd --get-active-zones public interfaces: eth0 eth1

    Мы видим два привязанных сетевых интерфейса к зоне public. Они работают по правилам, указанным для этой зоны. Увидеть правила по умолчанию получится путем:

    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;

    Public поддерживает удаленное администрирование SSH, а также присваивание IP-адресов DHSP.

    Иные зоны брандмауэра

    Посмотрим, какие же есть другие зоны у брандмауэра. Чтобы увидеть список всех доступных, наберите в консоли:

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

    4. Как настроить интерфейсные зоны?

    К зоне по умолчанию изначально и привязываются все сетевые интерфейсы.

    Смена зоны интерфейса лишь на одну сессию

    Для этой цели нам пригодятся две опции: —change-interface= и —zone=. Для перевода в зону home eth0 наберите:

    Sudo firewall-cmd --zone=home --change-interface=eth0 success

    Имейте ввиду, что это может повлиять на функционирование определенных сервисов. Например, SSH поддерживается в зоне home, т.е. соединения сбрасываться не будут. Однако это может произойти в других зонах, что приведет к блокировке доступа к своему же серверу. Нам нужно убедиться, что интерфейс привязался к новой зоне. Наберите в командной строке:

    Когда брандмауэр будет перезагружен, интерфейс снова привяжется к зоне по умолчанию.

    Sudo systemctl restart firewalld.service firewall-cmd --get-active-zones public interfaces: eth0 eth1

    Смена зоны интерфейса на постоянной основе

    После перезапуска брандмауэра интерфейс по новой привяжется к зоне по умолчанию, если никакая другая зона не задана в интерфейсных настройках. Конфигурации в CentOS находятся в файлах формата ifcfg-interface директории /etc/sysconfig/network-scripts. Для определения зоны интерфейса нужно открыть его файл конфигурации:

    Sudo nano /etc/sysconfig/network-scripts/ifcfg-eth0

    Добавим переменную ZONE= в конец файла. Зададим другую зону в качестве значения:

    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

    После этого к зоне home будет привязан интерфейс eth0.

    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

    5. Как сделать правила для приложений?

    Добавление в зону сервиса

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

    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 появится поддержка порта 80 и HTTP. В случае, когда ваш сервер способен обслуживать SSL/TLS-трафик, получится добавить сервис HTTPS:

    Sudo firewall-cmd --zone=public --add-service=https sudo firewall-cmd --zone=public --permanent --add-service=https

    6. А если сервис недоступен?

    По умолчанию брандмауэр Firewalld включает в себя много популярных сервисов. Но бывает так, что программам нужны другие сервисы, которых нет в брандмауэре. Данную проблему можно решить парой способов.

    Способ №1: Определение сервиса

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

    Начнем с копирования уже имеющегося сценария из папки /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:

    SSH Secure Shell (SSH) is a protocol for logging into and executing commands on remote machines. It provides secure encrypted communications. If you plan on accessing your machine remotely via SSH over a firewalled interface, enable this option. You need the openssh-server package installed for this option to be useful.

    Теперь сохраним изменения и закроем файл. После этого потребуется перезапуск брандмауэра с помощью:

    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

    Способ №2: Создание порта

    Откроем порт приложения в нужной брандмауэрной зоне, и укажем его, а также протокол. Представим себе ситуацию, что нужно добавить в зону public программу, использующую протокол ТСР и порт 5000. Для активации на одну сессию поддержки приложения потребуется опция -add-port=. Кроме того, необходимо указать протокол tcp либо udp:

    Sudo firewall-cmd --zone=public --add-port=5000/tcp

    Убедимся, что все получилось:

    Firewall-cmd --list-ports 5000/tcp

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

    7. Как создать зону?

    Брандмауэр способен предоставить разные предопределенные зоны, которых обычно для работы хватает, однако иногда нужно сделать свою пользовательскую зону. К примеру, серверу DNS нужна зона privateDNS, а для веб-сервера - publicweb. После создания зон ее нужно добавить в настройки брандмауэра. Создадим зоны publicweb и privateDNS набрав в консоли:

    Sudo firewall-cmd --permanent --new-zone=publicweb sudo firewall-cmd --permanent --new-zone=privateDNS

    Проверим, все ли получилось:

    Sudo firewall-cmd --permanent --get-zones block dmz drop external home internal privateDNS public publicweb trusted work

    Firewall-cmd --get-zones block dmz drop external home internal public trusted work

    Однако новые зоны в текущей сессии будут недоступны:

    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

    Теперь получится новым зонам определить порты и сервисы. Допустим, есть необходимость добавить SSH, HTTP и HTTPS в зону publicweb:

    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:

    Кроме того, получится добавить DNS в зону privateDNS посредством:

    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

    Теперь перейдем к настройке сетевых интерфейсов. Это необходимо для того, чтобы осуществлять автоматическое подключение к нужной зоне. Допустим, что нужно привязать к publicweb eth0, то:

    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

    Привяжем также eht1 к 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

    8. Как сделать автоматический запуск брандмауэра?

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

    Sudo systemctl enable firewalld

    Это даст возможность включать брандмауэр сразу после запуска сервера.

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

    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


    Начиная с 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

    Mail (SMTP) This option allows incoming SMTP mail delivery. If you need to allow remote hosts to connect directly to your machine to deliver mail, enable this option. You do not need to enable this if you collect your mail from your ISP"s server by POP3 or IMAP, or if you use a tool such as fetchmail. Note that an improperly configured SMTP server can allow remote machines to use your server to send spam.

    В 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