FIREWALLD

FIREWALLD

Сообщение ALEXX » 26 фев 2016, 21:10

Настройка firewalld CentOS 7 с примерами команд
Теги: firewalld SSH Linux

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, вы расширите кругозор - чаще всего, это стоит затраченных усилий.
Аватар пользователя
ALEXX
Администратор
Администратор
 
Автор темы
Сообщений: 1158
Фото: 35
Стаж: 3 года 11 месяцев 25 дней
Откуда: Королёв
Благодарил (а): 339 раз.
Поблагодарили: 187 раз.

FIREWALLD

Спонсор

Спонсор
 

Вернуться в Сети. Настройка и администрирование

Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1