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 используется перед всеми прямыми опциями.
Прямые опции предназначены, в основном, для возможности назначения пользовательских правил службам и приложениям. Правила не сохраняются и должны быть переопределены после перезагрузки или перезапуска. Аргументы сквозной опции такие же, как и соответствующие аргументы 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
Задачи
- открыть порт для внешних подключений;
- разрешить хождение трафика между инфраструктурной сетью и проектной;
- разрешить инфраструктурной и проектной сетям выходить в интернет;
- проброс портов. При обращении на шлюз:
- по порту 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. К сожалению, это лишь малая часть от того, какими возможностями обладает этот инструмент.