CentOS - это свободный дистрибутив, основанный на исходном коде Red Hat Enterprise Linux, фактически, он создается с этих исходников практически без изменений, разработчики только вырезают весь брендинг Red Hat. Но в отличие от Red Hat, CentOS полностью бесплатна и получает регулярные обновления, спустя немного времени после выхода их для Red Hat поскольку они тоже собираются из исходного кода.

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

1. Настройка статического IP адреса

Первое, что нужно сделать - это настроить сеть. На персональных компьютерах используется получение IP адреса по DHCP, и компьютер при каждом запуске будет иметь другой адрес, сервер должен всегда работать на одном адресе, поэтому мы присваиваем ему статический IP. Также нужно настроить DNS и шлюз по умолчанию. Но сначала установите утилиту net-tools:

yum install net-tools

Сначала посмотрим доступные сетевые интерфейсы и текущий IP адрес:

Теперь можно перейти к настройке интерфейса через файл /etc/sysconfig/network-scripts/ifcfg-enp0s3, например, с помощью редактора vi:

vi /etc/sysconfig/network-scripts/ifcfg-enp0s3

IPADDR = ваш_ip
GATEWAY = шлюз_для_доступа_к_сети
DNS1 = IP_адрес_DNS1
DNS2 = IP_адрес_DNS2

После внесения изменений этот файл будет выглядеть вот так:

Затем останется перезагрузить сеть чтобы применить новые настройки:

service network restart

Потом, при необходимости вы можете сменить IP адрес таким же способом.

2. Имя компьютера

Следующее что нам нужно сделать - это изменить имя компьютера. Текущее имя компьютера хранится в переменной HOSTNAME:

Чтобы его изменить вам нужно отредактировать файл /etc/hostname и заменить там старое имя на новое.

vi /etc/hostname

Также вы можете использовать команду hostnamectl:

hostnamectl set-hostname "имя_хоста"

3. Обновление CentOS

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

yum update && yum upgrade

4. Установите браузер

Во многих случаях приходится использовать CentOS из командной строки без графического интерфейса, поэтому может понадобиться браузер, чтобы найти что-либо в интернете или проверить работоспособность сайтов из командной строки. Для установки браузера links наберите:

yum install links

Вы можете найти и другие консольные браузеры для Linux, например, Lynx или Elinks.

5. Настройка часового пояса

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

Сначала получите список часовых поясов:

timedatectl list-timezones

Затем установите нужный, например, Europe/Kyiv:

timedatectl set-timezone Europe/Kyiv

Затем проверьте:

7. Настройка локали

Локаль определяет язык и кодировку, которая будет использоваться в вашей системе, например, для включения русского языка установите значение ru_RU.UTF-8

localectl set-locale LANG=ru_RU.UTF-8

Затем смотрим что получилось:

Затем устанавливаем раскладку клавиатуры:

localectl set-keymap us

8. Отключите SELinux

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

sed -i "s/(^SELINUX=).*/SELINUX=disabled/" /etc/selinux/config

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

9. Создайте пользователя

Использовать систему от имени суперпользователя небезопасно и тем более небезопасно оставлять открытым доступ к root аккаунту по ssh. Сначала создайте обычного пользователя и установите для него пароль:

useradd имя_пользователя
# passwd пароль

Затем добавьте пользователя в группу wheel, чтобы разрешать пользователю работать от имени администратора:

usermod -G wheel имя_пользователя

Теперь осталось подправить настройки sudo, для этого добавьте такую строчку, если ее там еще нет:

%wheel ALL = (ALL) ALL

10. Включите сторонние репозитории

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

Для добавления репозитория Enterprise Linux Repository (EPEL) выполните:

yum install epel-release
# rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm

10. Настройка SSH

Чаще всего нам приходится работать с серверами не напрямую, а по сети, через SSH. Обычно служба SSH уже установлена и активирована, но для ее правильной работы нужно выполнить несколько настроек. Сначала нужно настроить использование только безопасного протокола, для этого откройте файл /etc/ssh/ssh_config и удалите строчку Protocol 2,1. А вместо нее добавьте:

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

PermitRootLogin no

11. Установите веб-сервер Apache

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

yum install httpd

Когда установка будет завершена, перед тем, как вы сможете перейти к работе нужно разрешить HTTP в брандмауере:

firewall-cmd --add-service=http
# firewall-cmd -permanent -add-port=3221/tcp
# firewall-cmd --reload

Теперь осталось добавить Apache в автозагрузку:

systemctl start httpd.service
# systemctl enable httpd.service

12. Установите PHP

PHP - это современный язык веб-приложений и скриптов. Он часто используется в качестве языка программирования общего назначения. Для установки выполните:

После установки необходимо перезапустить Apache:

echo -e "" > /var/www/html/phpinfo.php

Затем откройте созданный файл в браузере:

links http://127.0.0.1/phpinfo.php

13. Установка базы данных

MariaDB - это база данных, основанная на исходном коде MySQL. Дистрибутивы Linux на базе Red Hat используют MariaDB вместо MySQL. Базы данных - незаменимая вещь на сервере, поэтому настройка CentOS после установки должна включать ее установку. Для установки MariaDB наберите:

yum install mariadb-server mariadb

Затем запустите и добавьте в автозагрузку:

systemctl start mariadb.service
# systemctl enable mariadb.service

И разрешите в использование службы в брандмауэре:

firewall-cmd --add-service=mysql

Осталось запустить скрипт настройки:

/usr/bin/mysql_secure_installation

14. Установите GCC

GCC расшифровывается как GNU Compiler Collection, это набор компиляторов, которые считаются стандартом для сборки программ в Linux. Но по умолчанию он не поставляется с CentOS, поэтому для установки наберите:

Затем вы можете посмотреть версию GCC:

15. Установите Java

Java - это объективно-ориентированный язык программирования общего назначения. Он не устанавливается по умолчанию, поэтому настройка CentOS 7 после установки может включать и его установку. Для этого выполните:

yum install java

Затем проверьте версию:

Выводы

В этой статье мы рассмотрели как выполняется настройка сервера CentOS 7 после установки. Как видите, есть много элементарных действий, которые желательно сделать перед тем, как использовать сервер на производстве. Если у вас остались вопросы, спрашивайте в комментариях!

Порой появляется потребность установить и настроить сервер Centos, работающий по SSH протоколу. Цели бывают самые разные: от создания веб-сервера до серверного мониторинга. Но при этом настройка и установка сервера Centos всегда происходит примерно одинаково. Потому в данной статье вы найдете универсальные решения для вашего запроса, и сможете использовать описанные советы для разных ситуаций, когда нужно сгенерировать SSH сервер.

Настройка самого сервера Centos — стандартные шаги

Какой бы вы не установили сервер, вам в любом случае нужно будет выполнить ряд стандартных настроек, чтобы установка прошла успешно. Во-первых, вам нужно позаботиться о том, чтобы на сервере была верно указана дата, и чтобы она автоматически обновлялась при переходе на летнее или зимнее время. После этого можете подготовить сервер для удобства управления, к примеру, установите Midnight Commander, чтобы было проще прописывать команды. Также не забудьте обновить Centos, чтобы он корректно работал (команда для обновления: yum -y update). После введенных изменений обязательно перезапустите сервер, чтобы новые конфигурации вступили в силу: reboot.

Настройка и установка OpenSSH в Centos

Чтобы можно было создать сервер с SSH протоколом, необходима установка OpenSSH. Это весьма популярная программа для создания серверов и подключения к ним клиентом. Установка OpenSSH происходит из консоли при помощи следующей команды: yum install openssh-server. Но куда важнее правильная настройка, чем установка, так как по умолчанию созданный вами сервер Centos хоть и будет работать по защищенному протоколу SSH, но не будет считаться безопасным.

Первым делом вам необходимо определиться с IP-адресами, которые будут пользоваться SSH сервером. Настройка разрешенных и запрещенных адресов происходит в iptables, где вы указываете семейства IP, а также конкретные адреса, для которых вход разрешен. Это хороший способ обеспечить безопасность вашему хосту SSH. Запрещать доступ можно при помощи строки host.deny, а разрешать при помощи host.allow.

Основная настройка сервера заключается в редактировании файла конфигураций /etc/ssh/sshd_config. Именно в нем находятся самые сильные и самые слабые стороны протокола SSH. По умолчанию сервер не защищен, так как в нем даже порт указан стандартный. А это отличная лазейка для подборщиков паролей, которые могут взломать аккаунты клиентов вашего сервера. Вы можете закомментировать стандартный порт 22 и указать новое его значение, чтобы подборщики не смогли даже попасть на страницу авторизации для перебора паролей.

Следующий важный штрих настроек — это запрет входа для root-пользователя. Если все же подборщикам удастся попасть к вам на сервер и они смогут войти в качестве суперадминистратора, то все закончится очень плохо. Они распространят вирус по сети, заразив тем самым компьютеры других клиентов навязчивой рекламой и прочими вредоносными программами. Кругом будет спам, попапы и полный произвол. А вся важная информация будет украдена. Так что пропишите в файле конфигураций возле PermitRootLogin слово «no», чтобы root-пользователь не зашел к вам «в гости» на хост.

Чтобы окончательно побороть взломщиков аккаунтов сервера, вы можете перенастроить параметры аутентификации, а точнее параметры сессии авторизации.

Сделайте так, чтобы у них не хватало времени на подбор паролей. К примеру, уменьшите количество попыток для ввода паролей до возможного минимума возле строки MaxAuthTries. Также ограничьте длительность авторизации для всех пользователей при помощи функции LoginGraceTime. Обязательно укажите в файле конфигураций следующее: PermitEmptyPasswords no. Это запретит клиентам заходить на хост с пустым паролем, что весьма полезно, ведь обратная настройка — это аналогично тому, если бы вы сами приглашали грабителей к себе в дом.

Если на вас напали хитрые подборщики паролей, которые создают множество ботов в попытке завладеть аккаунтом клиента, то вы можете активировать автоматическую блокировку роботов. Для этого в файле /etc/pam.d/system-auth пропишите следующую строку: auth required pam_abl.so config=/etc/security/pam_abl.conf. Она активирует pam-модуль, который будет автоматически вносить ip-адреса в таблицу запрещенных в iptables. В ином случае вам бы пришлось заниматься этим вручную, что весьма надоедает со временем.

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

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

SELinux

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

Файл конфигурации находится в /etc/sysconfig/selinux. Открываем его текстовым редактором и правим строчку:

#nano /etc/sysconfig/selinux SELINUX = Enforcing Disabled

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

#systemctl reboot

Firewalld

Firewalld предоставляет функциональность динамически управляемого брандмауэра с поддержкой сетевых зон, призванных определить уровень доверия для сетевого соединения или интерфейса. Он имеет поддержку настройки межсетевого экрана IPv4, IPv6 и сетевых мостов, а также разделяет среду выполнения и параметры конфигурации. Firewalld также имеет интерфейс для добавления правил брандмауэра непосредственно из служб и приложений.

По умолчанию Firewalld включен, а все порты считаются закрытыми. Если вам необходимо открыть какой-либо порт, воспользуйтесь командой:

#firewall-cmd --permanent --zone=public --add-port=80/tcp

В данном случае 80 - номер порта, который необходимо открыть (подставьте нужный). Порты будут открытыми до тех пор, пока вы их сами не закроете, или пока не отключите Firewalld. Firewalld отключается командами:

#systemctl stop firewalld #systemctl disable firewalld

#firewall-cmd --permanent --zone=public --add-port=12345/tcp

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

#firewall-cmd --permanent --zone=public --remove-port=12345/tcp

Fail2ban

Fail2ban — это система для защиты сервера от брутфорс-атак (атаки с перебором пароля). Принцип работы заключается в том, что если в течение определенного времени было n неудачных попыток авторизации, то ip-адрес, с которого были предприняты попытки авторизации заносится в бан-лист. Данная система просто необходима, т.к. без него к вашему серверу могут получить доступ. Fail2ban следит за указанными портами, например SSH — 22 (стандартный, желательно изменить на свой). Fail2ban настраивается через конфигурационный файл. Ниже инструкция о том, как установить и настроить Fail2ban.

Для начала необходимо подключить репозиторий EPEL, пакет Fail2ban находится там. Делаем это командой:

#rpm -Uvh http://download.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm

#yum install fail2ban

После установки производим настройку Fail2ban. Конфигурационный файл находится здесь — /etc/fail2ban/jail.conf , но, как сказано в комментариях в его начале, данный файл рекомендуется не изменять, вместо этого нужно создать локальную копию /etc/fail2ban/jail.local . И в дальнейшем править конфигурацию именно в нем.

#cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local #nano /etc/fail2ban/jail.local

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

Ignoreip = 127.0.0.1/8 192.168.1.10/24 bantime = 900 findtime = 600 maxretry = 6

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

bantime - время, на которое указанный ip-адрес попадет в бан-лист. Время указывается в секундах. Для постоянного бана достаточно указать любое отрицательное число.

findtime - время, в течение которого после неверной попытки авторизации будет производится слежение за данным ip-адресом. Если за время findtime совершится maxretry попыток неудачной авторизации, то ip-адрес попадет в бан-лист.

maxretry - максимальное количество неверных попыток авторизации за время findtime. При достижении этого порогового значения ip-адрес будет занесен в бан-лист.

Далее спускаемся ниже и находим раздел JAILS , в нем описывается, какие сервисы и порты нужно мониторить, и что с ними делать в случае срабатывания защиты. Также в каждой секции можно определить свои параметры bantime, findtime, maxretry, а если они не указаны, то параметры берутся из секции . Ищем интересующие нас секции и редактируем их, мы настроим слежение за сервисом SSH. Для этого переходим к секции , дописываем в нее строчку «enabled = true» , и меняем порт на назначенный нами ранее:

Enabled = true port = 12345 action = iptables-multiport logpath = %(sshd_log)s

Запускаем сервис fail2ban и добавляем его в автозагрузку:

#systemctl start fail2ban #systemctl enable fail2ban

На этом базовая настройка безопасности заканчивается. Теперь можно спокойно открывать доступ к серверу по SSH. Если какой-либо злоумышленник попытается использовать брутфорс для получения доступа к вашему серверу по SSH, то у него ничего не выйдет — его ip-адрес будет блокироваться. Все остальные порты защищены с помощью 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!

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

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

# systemctl disable firewalld
# systemctl stop firewalld

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

# yum install iptables-services

Запускаем брандмауэр:

# systemctl start iptables
# systemctl start ip6tables

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

# systemctl enable iptables
# systemctl enable ip6tables

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

# /sbin/iptables-save > /etc/sysconfig/iptables
# /sbin/ip6tables-save > /etc/sysconfig/ip6tables

Или по-старинке:

# service iptables save

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

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

# systemctl restart iptables.service

Зоны

Демон firewalld управляет группами правил при помощи так называемых зон.

Зоны – это, по сути, наборы правил, которые управляют трафиком на основе уровня доверия к той или иной сети. Зоны присваиваются сетевым интерфейсам и управляют поведением брандмауэра.

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

В firewalld существуют следующие зоны:

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

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

Правила firewalld бывают постоянными и временными. Если в наборе появляется или изменяется какое-либо правило, текущее поведение брандмауэра изменяется сразу. Однако после перезагрузки все изменения будут утрачены, если их не сохранить.

Большинство команд firewall-cmd может использовать флаг —permanent, который сохранит правило, после чего оно будет использоваться на постоянной основе.

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

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

sudo systemctl start firewalld.service

Убедитесь, что сервис запущен:

firewall-cmd --state
running

Теперь брандмауэр запущен и работает согласно конфигурации по умолчанию.

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

Правила брандмауэра по умолчанию

Просмотр правил по умолчанию

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

firewall-cmd --get-default-zone
public

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

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


public
interfaces: eth0 eth1

К зоне public привязаны два сетевых интерфейса: eth0 и eth1. Интерфейсы, привязанные к зоне, работают согласно правилам этой зоны.

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

firewall-cmd --list-all
public (default, active)
interfaces: eth0 eth1
sources:
services: dhcpv6-client ssh
ports:
masquerade: no
forward-ports:
icmp-blocks:
rich rules:

Итак, теперь вы знаете, что:

  • public является зоной по умолчанию и единственной активной зоной.
  • К ней привязаны интерфейсы eth0 и eth1.
  • Она поддерживает трафик DHCP (присваивание IP-адресов) и SSH (удаленное администрирование).

Другие зоны брандмауэра

Теперь следует ознакомиться с другими зонами.

Чтобы получить список всех доступных зон, введите:

firewall-cmd --get-zones

Чтобы получить параметры конкретной зоны, добавьте в команду флаг —zone=.

firewall-cmd --zone=home --list-all
home
interfaces:
sources:
services: dhcpv6-client ipp-client mdns samba-client ssh
ports:
masquerade: no
forward-ports:
icmp-blocks:
rich rules:

Чтобы вывести определения всех доступных зон, добавьте опцию —list-all-zones. Для более удобного просмотра вывод можно передать в пейджер:

firewall-cmd --list-all-zones | less

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

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

Изменение зоны интерфейса на одну сессию

Чтобы перевести интерфейс в другую зону на одну сессию, используйте опции —zone= и —change-interface=.

Например, чтобы перевести eth0 в зону home, нужно ввести:

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

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

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

firewall-cmd --get-active-zones
home
interfaces: eth0
public
interfaces: eth1

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

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

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

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

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

В конец файла добавьте переменную ZONE= и в качестве значения укажите другую зону, например, home:

. . .
DNS1=2001:4860:4860::8844
DNS2=2001:4860:4860::8888
DNS3=8.8.8.8
ZONE=home

Сохраните и закройте файл.

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

sudo systemctl restart network.service
sudo systemctl restart firewalld.service

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

firewall-cmd --get-active-zones
home
interfaces: eth0
public
interfaces: eth1

Настройка зоны по умолчанию

Также вы можете выбрать другую зону по умолчанию.

Для этого используется параметр —set-default-zone=. После этого все интерфейсы будут привязаны к другой зоне:

sudo firewall-cmd --set-default-zone=home
home
interfaces: eth0 eth1

Создание правил для приложений

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

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

firewall-cmd --get-services
RH-Satellite-6 amanda-client bacula bacula-client dhcp dhcpv6 dhcpv6-client dns ftp high-availability http https imaps ipp ipp-client ipsec kerberos kpasswd ldap ldaps libvirt libvirt-tls mdns mountd ms-wbt mysql nfs ntp openvpn pmcd pmproxy pmwebapi pmwebapis pop3s postgresql proxy-dhcp radius rpc-bind samba samba-client smtp ssh telnet tftp tftp-client transmission-client vnc-server wbem-https

Примечание : Больше информации о каждом конкретном сервисе можно найти в файлах.xml в каталоге /usr/lib/firewalld/services. К пример, сведения о сервисе SSH хранятся в /usr/lib/firewalld/services/ssh.xml и выглядят так:



SSH

Чтобы включить поддержку сервиса в той или иной зоне, используйте опцию —add-service=. Указать целевую зону можно с помощью опции —zone=. По умолчанию эти изменения будут работать в течение одной сессии. Чтобы сохранить изменения и использовать их на постоянной основе, добавьте флаг —permanent.

Например, чтобы запустить веб-сервер для обслуживания трафика HTTP, для начала нужно включить поддержку этого трафика в зоне public на одну сессию:

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

Если сервис нужно добавить в зону по умолчанию, флаг —zone= можно опустить.

Убедитесь, что операция выполнена успешно:

firewall-cmd --zone=public --list-services
dhcpv6-client http ssh

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

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

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

sudo firewall-cmd --zone=public --permanent --list-services
dhcpv6-client http ssh

Теперь зона public поддерживает HTTP и порт 80 на постоянной основе. Если веб-сервер может обслуживать трафик SSL/TLS, вы также можете добавить сервис https (для одной сессии или в набор постоянных правил):

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

Что делать, если нужный сервис недоступен?

Брандмауэр firewalld по умолчанию включает в себя многие наиболее распространённые сервисы. Однако некоторым приложениям необходимы сервисы, поддержка которых отсутствует в firewalld. В таком случае вы можете поступить двумя способами.

Способ 1: Настройка порта

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

Например, приложение, которое использует порт 5000 и протокол TCP, нужно добавить в зону public. Чтобы включить поддержку приложения на дну сессию, используйте параметр —add-port= и укажите протокол tcp или udp.

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

Убедитесь, что операция прошла успешно:

firewall-cmd --list-ports
5000/tcp

Также можно указать последовательный диапазон портов, отделив первый и последний порт диапазона с помощью тире. Например, если приложение использует UDP-порты 4990-4999, чтобы добавить их в зону public, нужно ввести:

sudo firewall-cmd --zone=public --add-port=4990-4999/udp

После тестирования можно добавить эти правила в постоянные настройки брандмауэра.

sudo firewall-cmd --zone=public --permanent --add-port=5000/tcp
sudo firewall-cmd --zone=public --permanent --add-port=4990-4999/udp
sudo firewall-cmd --zone=public --permanent --list-ports
success
success
4990-4999/udp 5000/tcp

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

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

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

Для начала нужно скопировать существующий сценарий из каталога /usr/lib/firewalld/services в каталог /etc/firewalld/services (здесь брандмауэр ищет нестандартные настройки).

Например, можно скопировать определение сервиса SSH и использовать его для определения условного сервиса example. Имя сценария должно совпадать с именем сервиса и иметь расширение.xml.

sudo cp /usr/lib/firewalld/services/service.xml /etc/firewalld/services/example.xml

Откорректируйте скопированный файл.

sudo nano /etc/firewalld/services/example.xml

В файле находится определение SSH:



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.

Большую часть определения сервиса составляют метаданные. Изменить краткое имя сервиса можно в тегах . Это человекочитаемое имя сервиса. Также нужно добавить описание сервиса. Единственное изменение, которое повлияет на работу сервиса – это изменение номера порта и протокола.

Вернёмся к сервису example; допустим, он требует открыть TCP- порт 7777 и UDP- порт 8888. Определение будет выглядеть так:



Example Service
This is just an example service. It probably shouldn"t be used on a real system.

Сохраните и закройте файл.

Перезапустите брандмауэр:

sudo firewall-cmd --reload

Теперь сервис появится в списке доступных сервисов:

firewall-cmd --get-services
RH-Satellite-6 amanda-client bacula bacula-client dhcp dhcpv6 dhcpv6-client dns example ftp high-availability http https imaps ipp ipp-client ipsec kerberos kpasswd ldap ldaps libvirt libvirt-tls mdns mountd ms-wbt mysql nfs ntp openvpn pmcd pmproxy pmwebapi pmwebapis pop3s postgresql proxy-dhcp radius rpc-bind samba samba-client smtp ssh telnet tftp tftp-client transmission-client vnc-server wbem-https

Создание зон

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

Например, для веб-сервера можно создать зону publicweb, а для DNS-сервиса – зону privateDNS.

Создавая зону, нужно добавить её в постоянные настройки брандмауэра.

Попробуйте создать зоны publicweb и privateDNS:

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

Убедитесь, что зоны существуют:

sudo firewall-cmd --permanent --get-zones

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

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

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

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

Теперь вы можете присвоить новым зонам требуемые сервисы и порты. К примеру, в зону publicweb можно добавить SSH, HTTP и HTTPS.

sudo firewall-cmd --zone=publicweb --add-service=ssh
sudo firewall-cmd --zone=publicweb --add-service=http
sudo firewall-cmd --zone=publicweb --add-service=https
firewall-cmd --zone=publicweb --list-all
publicweb
interfaces:
sources:
services: http https ssh
ports:
masquerade: no
forward-ports:
icmp-blocks:
rich rules:

В зону privateDNS можно добавить DNS:

sudo firewall-cmd --zone=privateDNS --add-service=dns
firewall-cmd --zone=privateDNS --list-all
privateDNS
interfaces:
sources:
services: dns
ports:
masquerade: no
forward-ports:
icmp-blocks:
rich rules:

Затем можно привязать сетевые интерфейсы к новым зонам:

sudo firewall-cmd --zone=publicweb --change-interface=eth0
sudo firewall-cmd --zone=privateDNS --change-interface=eth1

Теперь можно протестировать настройку. Если всё работает правильно, вы можете добавить эти правила в постоянные настройки.

sudo firewall-cmd --zone=publicweb --permanent --add-service=ssh
sudo firewall-cmd --zone=publicweb --permanent --add-service=http
sudo firewall-cmd --zone=publicweb --permanent --add-service=https
sudo firewall-cmd --zone=privateDNS --permanent --add-service=dns

После этого можно настроить сетевые интерфейсы для автоматического подключения к правильной зоне.

К примеру, eth0 будет привязан к publicweb:

sudo nano /etc/sysconfig/network-scripts/ifcfg-eth0
. . .
IPV6_AUTOCONF=no
DNS1=2001:4860:4860::8844
DNS2=2001:4860:4860::8888
DNS3=8.8.8.8
ZONE=publicweb

А интерфейс eth1 будет привязан к privateDNS:

sudo nano /etc/sysconfig/network-scripts/ifcfg-eth1
. . .
NETMASK=255.255.0.0
DEFROUTE="no"
NM_CONTROLLED="yes"
ZONE=privateDNS

Перезапустите сетевые сервисы и брандмауэр:

sudo systemctl restart network
sudo systemctl restart firewalld

Проверьте зоны:

firewall-cmd --get-active-zones
privateDNS
interfaces: eth1
publicweb
interfaces: eth0

Убедитесь, что в зонах работают нужные сервисы:

firewall-cmd --zone=publicweb --list-services
http htpps ssh
firewall-cmd --zone=privateDNS --list-services
dns

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

sudo firewall-cmd --set-default-zone=publicweb

Автоматический запуск брандмауэра

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

Для этого введите:

sudo systemctl enable firewalld

Теперь брандмауэр будет запускаться вместе с сервером.

Заключение

Брандмауэр firewalld — очень гибкий инструмент. Зоны позволяют быстро изменять политику брандмауэра.

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

Tags: ,