Firewalld - установка, настройка, команды
В данной статье предлагаю Вам познакомиться с брандмауэром Firewalld. Возможно многие его давно используют. Я впервые столкнулся с новым брандмауэром во время первой установки CentOS 7. Конечно, его можно отключить и заменить на хорошо знакомый и понятный IPTables (как вернуть IPTables в CentOS 7 – рассмотрено ниже), но осваивать что-то новое и повышать уровень своих знаний – это всегда хорошо, если нет прямой необходимости в использовании IPTables. Проще говоря, Firewalld – это не Файрвол, разработанный с нуля – это другая надстройка над IPTables. Также, как и IPTables, новый Firewalld использует для работы IPTables tool и управляет сетевым фильтром ядра, если Вы обладаете опытом работы с IPTables, Вам не составит особого труда начать пользоваться Firewalld. С приходом Firewalld мы получили ряд новых возможностей, но, в тоже время, потеряли некоторые старые. Но, обо всем по порядку, как всегда, для удобства восприятия материал разбит на смысловые блоки. В этой статье Вы найдете решения следующих задач:
- Установка Firewalld
- Обзор возможностей и новых функций Firewalld
- Список параметров и команд Firewalld
- Настройка и примеры использования Firewalld
- Замена Firewalld на IPTables
Установка и настройка брандмауэра Firewalld будет происходить в ОС CentOS 7.
- Установка Firewalld
-
Выполните для установки Firewalld:
yum -y install firewalld
Запустите:
systemctl start firewalld
Включите службу в автозагрузку:
systemctl enable firewalld
Проверим:
systemctl status firewalld
Посмотрим, что разрешено по умолчанию:
firewall-cmd --permanent --list-all
Вывод команды:
public target: default icmp-block-inversion: no interfaces: sources: services: dhcpv6-client ssh ports: protocols: masquerade: no forward-ports: sourceports: icmp-blocks: rich rules:
На постоянной основе разрешен ssh, а также клиент dhcp v6.
Выполните перезагрузку сервера после установки firewalld.
- Обзор возможностей и новых функций Firewalld
-
В firewalld авторы подготовили набор предопределенных зон.
Список всех допустимых зон firewalld можно вывести командой:
firewall-cmd --get-zones
Вывод команды:
work drop internal external trusted home dmz public block
Описание назначений зон firewalld:
- DROP
Входящие сетевые пакеты отбрасываются без ответа (drop). Разрешены только исходящие соединения.
- BLOCK
Входящие сетевые соединения отклоняются (rejected) с сообщением icmp-host-prohibited для Ipv4 и icmp6-adm-prohibited для IPv6. Разрешены только инициированные сетевые соединения внутри нашей системы.
- PUBLIC
Зона по умолчанию. Нацелена на работу в общественных сетях с не доверенными компьютерами, разрешается устанавливать только определенные входящие соединения.
- EXTERNAL
Зона для внешнего интерфейса, особенно подходит для использования во внешних сетях с разрешенным маскарадингом, для роутеров. Разрешены только конкретные входящие соединения.
- DMZ
Зона DMZ, для сетей с собственной демилитаризованной зоной с ограниченным доступом к вашей внутренней сети. Разрешены только определенные входящие соединения.
- WORK
Зона рабочей сети. Доверия к окружению нет, разрешены только определенные входящие соединения.
- HOME
Домашняя зона. Доверяем окружению, разрешены только определенные входящие соединения.
- INTERNAL
Внутренняя зона. Доверяем окружению, разрешены только определенные входящие соединения.
- TRUSTED
Все сетевые соединения разрешены.
Добавив сетевое соединение к определенной зоне мы получаем некий предустановленный набор правил.
Вывести список всех активных зон firewalld можно командой:
firewall-cmd --get-active-zones
Вывод команды:
public interfaces: enp0s3
Где enp0s3 сетевой интерфейс сервера и сопоставлен он с зоной public
Для управления firewalld существует два основных инструмента:
1. firewall-config с графическим интерфейсом.
2. firewall-cmd утилита командной строки, именно с ней мы и будем работать в данной статье.
Что именилось с приходом firewalld? Нам теперь недоступно:
1. Нет /etc/sysconfig/iptables. Настроек iptables в обычном ранее для них месте нет, firewalld хранит свои настройки в XML файлах раскидав их по /usr/lib/firewalld/ и /etc/firewalld/
2. Добавлять правила привычными командами вроде iptables -A INPUT -p ICMP -j ACCEPT уже не получится, и вообще на попытку обратиться к iptables, мы получим отказ. Собственно, просто придется настраивать его другими командами.
В то-же время му получили ряд полезных функций:
1. Возможность изменения правил без перезагрузки службы: Firewalld запускается как служба и при конфигурации учитывает и применяет только различия в правилах. Другими словами нам предоставили возможность изменять правила, не разрывая существующие соединения (на лету).
2. Концепция зон: Firewalld оперирует понятиями сетевой зоны. Сетевая зона определяет уровень доверия сетевому подключению. Другими словами это можно понять, как предустановленный набор правил, который можно назначить сетевому подключению. Во избежание конфликтов правил, одно подключение может находиться только в одной из зон, а вот в зону можно добавлять сколько угодно подключений.
- Настройка и примеры использования Firewalld
-
Запуск firewalld:
systemctl start firewalld
Остановка:
systemctl stop firewalld
Включите службу в автозагрузку:
systemctl enable firewalld
Отключение автостарта службы:
systemctl disable firewalld
Проверить статус (Вам будет предоставлена расширенная информация о работе службы):
systemctl status firewalld
Проверить статус (кратко):
firewall-cmd --state
Вывести список всех допустимых зон:
firewall-cmd --get-zones
Вывести список всех активных зон:
firewall-cmd --get-active-zones
Пример вывода команды:
public interfaces: enp0s3
Где enp0s3 сетевой интерфейс сервера и сопоставлен он с зоной public
Узнать к какой зоне принадлежит конкретный (в нашем случае enp0s3) сетевой интерфейс:
firewall-cmd --get-zone-of-interface=enp0s3
Список активных сетевых интерфейсов можно получить с помощью команды:
ip a
Вывести список сетевых интерфейсов принадлежащих конкретной зоне:
firewall-cmd --zone=public --list-interfaces
Проверим, что разрешено по умолчанию:
firewall-cmd --permanent --list-all
Вывод команды:
public (default) interfaces: sources: services: ssh dhcpv6-client masquerade: no forward-ports: icmp-blocks: rich rules:
На постоянной основе разрешен ssh, а также клиент dhcp v6. Я не использую на сервере ip v6, поэтому уберу соответствующее правило:
firewall-cmd --permanent --zone=public --remove-service=dhcpv6-client
Разрешить доступ по протоколу ssh вручную:
firewall-cmd --permanent --zone=public --add-service=ssh
Для работы веб сервера необходимо разрешить сервис http (80 порт):
firewall-cmd --permanent --zone=public --add-service=http
Если Вы планируете использовать https на Вашем сайте, необходимо разрешить https сервис (443 порт):
firewall-cmd --permanent --zone=public --add-service=https
Для работы FTP сервера необходимо открыть 21 порт, а также порты 30000-35000 для использования пассивного режима в FTP клиентах:
firewall-cmd --permanent --zone=public --add-port=21/tcp firewall-cmd --permanent --zone=public --add-port=30000-35000/tcp
Для применения изменений перезагрузите правила:
firewall-cmd --reload
Мне хочется предложить Вам выполнить еще несколько шагов по повышению уровня безопасности Вашего сервера. Есть довольно подробно написанный мануал по повышению уровня безопасности при использовании ssh. Одним из этапов настройки является изменение стандартного порта, рассмотрим более подробно настройки Firewalld при смене порта ssh.
Разрешим входящие соединения на порт 2220/tcp (на него повесим sshd):
firewall-cmd --permanent --zone=public --add-port=2220/tcp
Перезагрузим правила:
firewall-cmd --reload
Проверим:
firewall-cmd --zone=public --list-ports
Вывод команды:
2220/tcp
Порт открыт. Редактируем конфиг sshd:
nano /etc/ssh/sshd_config
Вносим изменения:
*** # If you want to change the port on a SELinux system, you have to tell # SELinux about this change. # semanage port -a -t ssh_port_t -p tcp #PORTNUMBER # В файле необходимо только указать порт Port 2220 #AddressFamily any #ListenAddress 0.0.0.0 #ListenAddress :: ***
Перезапустим ssh:
systemctl restart sshd.service
Также в случае использования SELinux (надеюсь, Вы его не отключили) необходимо выполнить дополнительные настройки. Это связано с тем, что SELinux не даст подключиться к ssh на нестандартном порте (2220):
semanage port -a -t ssh_port_t -p tcp 2220
После проверки подключения к ssh на новом порту, закройте доступ к порту 22:
firewall-cmd --permanent --zone=public --remove-service=ssh
Перезагрузите правила:
firewall-cmd --reload
- Замена Firewalld на IPTables
-
Для использования IPTables на Вашем сервере с CentOS 7, выполните следующие шаги.
Выключим Firewalld службу:
systemctl mask firewalld
Остановим Firewalld Service:
systemctl stop firewalld
Установим iptables.
yum -y install iptables-services
Включим запуск IPtables при загрузке системы, а также разрешим доступ к серверу по протоколам ssh и http:
systemctl enable iptables iptables -P INPUT ACCEPT && iptables -F && service iptables save && iptables -A INPUT -i lo -j ACCEPT && iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT && iptables -A INPUT -p tcp --dport 22 -j ACCEPT && iptables -A INPUT -p tcp --dport 80 -j ACCEPT && iptables -P INPUT DROP && iptables -P FORWARD DROP && iptables -P OUTPUT ACCEPT && service iptables save
Проверим:
iptables -L
Вы должны получить следующий вывод:
iptables: Saving firewall rules to /etc/sysconfig/iptables:[ OK ] iptables: Saving firewall rules to /etc/sysconfig/iptables:[ OK ] Chain INPUT (policy DROP) target prot opt source destination ACCEPT all -- anywhere anywhere ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED ACCEPT tcp -- anywhere anywhere tcp dpt:ssh ACCEPT tcp -- anywhere anywhere tcp dpt:http Chain FORWARD (policy DROP) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination