Firewall на CentOS 7 настройка и использование

Firewall на CentOS 7 настройка и использование

Большинство IT специалистов в той или иной степени сталкиваются с Firewall, будь то настройка домашнего роутера или тонкий тюнинг, например, VMWare EDGE NSX-V виртуальной инфраструктуры. Сегодня расскажу, как использовать Firewall на CentOS 7.

Вводная часть про Firewall

Большинству, наверное, известно, что для передачи данных между узлами сети на сетевом и транспортном уровнях модели OSI, необходимы два элемента: IP адрес и порт. Например, узел под номером один отправляет пакет узлу под номером два на порт 22 и ждет ответ. Если ответ пришел, то считается, что порт открыт для подключений.

С одной стороны это удобно, но с другой позволяет просканировать узел и понять, какие порты открыты. Большинство сервисов имеют уже устоявшиеся порты. Например, 22 это ssh, 21 — ftp, 80 — http. Таким образом, после сканирования злоумышленник может понять какой сервис находится за тем или иным портом. Зная сервис, будет проще найти и применить эксплойт.

Для чего же нужен Firewall на CentOS, да и не только?

Самое главное правило файрвола: запрещено все, что не разрешено. Что это значит? Представим, что развернули сервер из шаблона с прямым выходом в интернет. Тот, кто готовил шаблон, посчитал, что сервер будет находиться в локальной сети и доступа извне к нему не будет, поэтому оставил ssh на 22 порту. В результате, без Firewall, ssh порт доступен из интернета и может быть скомпрометирован. Если же файрвол включен, 22 порт извне доступен не будет, пока не будет добавлено разрешающее правило. То есть, у администратора появляется еще одна точка где нужно подумать — а можно ли так сделать? В данном примере с ssh портом, если невозможно избежать открытия, необходимо перенести его на более высокий порт, например 29865. Это усложнит поиск и применение эксплойтов.

Опции и ключи

Перед добавлением правил, в которых вы не уверены, особенно если сервер доступен только по ssh, желательно себя обезопасить. Например, добавить скрипт в cron, который будет перезагружать Firewall. И соответственно, не применять ключ: —permanent. Тогда после перезагрузки firewalld, доступ к серверу восстановится.
--permanent правило будет сохранено после перезагрузки firewalld;
--zone=<имя зоны> указывает в какой зоне производятся изменения;
--add-port - ключ для добавления (открытия) порта;
--add-forward-port - проброс порта с одного узла на другой;
--list-all-zones - просмотр всех зон firewalld и включенных в них разрешений;
--reload - перечитать конфигурацию файрвола;
--direct --get-all-rules получение всех правил с прямыми опциями;
--direct используется перед всеми прямыми опциями.

https://fedoraproject.org/wiki/FirewallD/ru#.D0.9F.D1.80.D1.8F.D0.BC.D1.8B.D0.B5_.D0.BE.D0.BF.D1.86.D0.B8.D0.B8

Прямые опции предназначены, в основном, для возможности назначения пользовательских правил службам и приложениям. Правила не сохраняются и должны быть переопределены после перезагрузки или перезапуска. Аргументы сквозной опции такие же, как и соответствующие аргументы iptables, ip6tables, ebtables.

Практическое применение Firewall на CentOS 7

По умолчанию в CentOS 7 используется RHEL решение — firewalld. Установка, запуск, добавление в автозагрузку:

yum install firewalld
systemctl start firewalld
systemctl enable firewalld
Окружение
Пользовательское устройство: IP 192.168.100.21
Роутер: LAN - 192.168.100.1-192.168.100.200
Сервер №1: Роль: Шлюз
    Интерфейс: ens160 - 192.168.100.50 (Сеть с выходом в Inet)
    Интерфейс: ens192 - 192.168.211.1 (инфраструктурная сеть)
    Интерфейс: ens224 - 192.168.111.1 (проектная сеть)
Сервер №2: 192.168.211.3 (в инфраструктурной сети)
    Сервисы - Prometheus:9090; Telegraf:9126
Сервер №3: 192.168.111.5 (в проектной сети)
    Сервисы - Grafana:3000; Telegraf:9126
Задачи
  1. открыть порт для внешних подключений;
  2. разрешить хождение трафика между инфраструктурной сетью и проектной;
  3. разрешить инфраструктурной и проектной сетям выходить в интернет;
  4. проброс портов. При обращении на шлюз:
    • по порту 9090 должен открываться 192.168.211.3 по порту 9090, т.е. сервис prometheus;
    • через 3000 должен открываться 192.168.111.5 по порту 3000, т.е. сервис grafana;
    • с 9126 и 9127 должны открываться 192.168.211.3 и 192.168.111.5 соответственно по порту 9126, т.е. exporter telegraf.

Открыть порт для внешних подключений

Например, установили nginx, запустили, командой netstat видим, что 80 порт поднят и слушается nginx, но браузер подключиться не может. Для того, чтобы порт стал доступен извне, на Firewall необходимо открыть входящие подключения к нему:

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

Разрешить хождение трафика между инфраструктурной сетью и проектной

Для того, чтобы разрешить хождение трафика между сетями, необходимо воспользоваться прямыми опциями. Проще говоря, воспользоваться возможностями iptables. В netfilter цепочке FORWARD разрешить (-j ACCEPT) прохождение пакета от одной сети в другую. Разрешающее правило с интерфейса ens192 на ens224 и обратно, выглядят так:

firewall-cmd --permanent --direct --add-rule ipv4 filter FORWARD 0 -i ens192 -o ens224 -j ACCEPT
firewall-cmd --permanent --direct --add-rule ipv4 filter FORWARD 0 -i ens224 -o ens192 -j ACCEPT
firewall-cmd --reload

Разрешить инфраструктурной и проектной сетям выходить в интернет

Возможность выхода в интернет подсетям можно осуществить только через NAT, то есть для конечных узлов в интернете все запросы будут приходить от адреса шлюза (если шлюз не спрятан еще за один NAT). Вкратце, для цепочки POSTROUTING в таблице nat добавляется действие над пакетом MASQUERADE. Этот метод позволяет узлу, который не имеет общедоступного IP-адреса, обмениваться данными с другими узлами через посредника (шлюз), расположенного между ним и Интернетом. Хорошая статья про iptables: https://www.k-max.name/linux/netfilter-iptables-v-linux/.

firewall-cmd --permanent --direct --add-rule ipv4 nat POSTROUTING 0 -o ens160 -j MASQUERADE

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

firewall-cmd --direct --permanent --add-rule ipv4 filter FORWARD 0 -i ens160 -o ens192 -m state --state RELATED,ESTABLISHED -j ACCEPT
firewall-cmd --direct --permanent --add-rule ipv4 filter FORWARD 0 -i ens160 -o ens224 -m state --state RELATED,ESTABLISHED -j ACCEPT
firewall-cmd --reload

по порту 9090 должен открываться 192.168.211.3 по порту 9090, т.е. сервис Prometheus
firewall-cmd --permanent --zone=public --add-port=9090/tcp
firewall-cmd --permanent --zone=public --add-forward-port=port=9090:proto=tcp:toport=9090:toaddr=192.168.211.3
firewall-cmd --reload

через 3000 должен открываться 192.168.111.5 по порту 3000, т.е. сервис Grafana
firewall-cmd --permanent --zone=public --add-port=3000/tcp
firewall-cmd --permanent --zone=public --add-forward-port=port=3000:proto=tcp:toport=3000:toaddr=192.168.111.5
firewall-cmd --reload

с 9126 и 9127 должны открываться 192.168.211.3 и 192.168.111.5 соответственно по порту 9126, т.е. Exporter telegraf
firewall-cmd --permanent --zone=public --add-port=9126/tcp
firewall-cmd --permanent --zone=public --add-port=9127/tcp
firewall-cmd --permanent --zone=public --add-forward-port=port=9126:proto=tcp:toport=9126:toaddr=192.168.211.3
firewall-cmd --permanent --zone=public --add-forward-port=port=9127:proto=tcp:toport=9126:toaddr=192.168.111.5
firewall-cmd --reload

Заключение

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