Firewalld

Материал из pNp Wiki
Перейти к: навигация, поиск

Настройка правил файрволла firewalld

Предварительные требования

  • Виртуальная машина с двумя сетевыми интерфейсами
  • Установленные пакеты: firewalld, firewalld-filesystem

Общая информация

firewalld разделяет весь входящий трафик на зоны, где каждой зоне соответствует свой набор правил. Для проверки принадлежности входящих соединений зоне, используется следующая логика, в которой побеждает первое совпадение:

  1. Исходный адрес входящего пакета совпадает с исходным правилом настройки зоны, в таком случае пакет отправляется на обработку в данной зоне.
  2. Если исходный интерфейс для пакета совпадает с правилами настройки зоны - эта зона будет использована
  3. В противном случае, будет использована зона по-умолчанию. Зона по-умолчанию не отдельная зона, поэтому она указывает на другую зону в системе.

Если поведение по-умолчанию не изменено администратором, либо конфигурацией NetworkManager'а, то зона по-умолчанию для каждого нового интерфейса в системе становится зона public. firewalld поставляется с некоторым количеством сконфигурированных зон. Для управления файрволлом используется команда firewall-cmd. Конфигурационные файлы firewalld находятся в директории /etc/firewalld/

Сконфигрурированные зоны для firewalld

Параметр Значение
work Предназначено для использования в рабочем пространстве. Остальные компьютеры сети, по большей части, считаются надёжными (с точки зрения причинения вреда вашему ПК). Разрешены лишь отдельные входящие соединения (ssh, ipp-client, или dhcpv6-client).
drop Все входящие сетевые пакеты сбрасываются, ответ на них недопустим. Возможны только исходящие сетевые соединения.
internal Предназначено для использования во "внутренних" сетях. Остальные компьютеры сети, по большей части, считаются надёжными (с точки зрения причинения вреда вашему ПК). Разрешены лишь отдельные входящие соединения (ssh, mdns, ipp-client, samba-client, или dhcpv6-client).
external Предназначено для использования во "внешних" сетях с активированным режимом маскарадинга, особенно с применением роутеров. Остальные компьютеры сети считаются ненадёжными (с точки зрения причинения вреда вашему ПК). Разрешены лишь отдельные входящие соединения (ssh).
trusted Разрешены все сетевые соединения.
home Предназначено для использования в домашних сетях. Остальные компьютеры сети, по большей части, считаются надёжными (с точки зрения причинения вреда вашему ПК). Разрешены лишь отдельные входящие соединения (ssh, mdns, ipp-client, samba-client, или dhcpv6-client).
dmz Предназначено для компьютеров в личной "безоружной" зоне с ограниченным доступом к внутренней сети. Разрешены лишь отдельные входящие соединения (ssh).
public Предназначено для использования в общественных местах. Остальные компьютеры сети считаются ненадёжными (с точки зрения причинения вреда вашему ПК). Разрешены лишь отдельные входящие соединения (ssh и dhcpv6-client). Зона по-умолчанию для новых сетевых интерфейсов.
block Все входящие сетевые соединения отклоняются с сообщениями icmp-host-prohibited (для IPv4) и icmp6-adm-prohibited (для IPv6). Возможны только инициированные в рамках данной системы сетевые соединения.

Список основных команд для firewalld

Параметр Значение
-- get-default-zone Получение зоны, указанной по умолчанию для сетевых соединений.
-- set-default-zone Определение зоны по-умолчанию. Команда изменяет уже загруженную конфигурацию и постоянную.
--get-zones Получение списка всех доступных зон.
--get-services Получение списка поддерживаемых постоянно служб.
--get-active-zones Получение списка зон используемых в данный момент (имеют интерфейс или источник привязанный к ним, вместе с информацией об интерфейсе или источнике).
--add-source=source[/mask] [--zone=zone] Привязать трафик из источника к зоне. Если зона не указывается, то используется зона по-умолчанию.
--remove-source=source[/mask] [--zone=zone] Отвязать трафик из источника от зоны, если он был привязан ранее.
--add-interface=interface [--zone=zone] Привязать трафик из интерфейса к зоне. Если зона не указывается, то используется зона по-умолчанию.
--change-interface=interface [--zone=zone] Ассоциировать трафик от интерфейса с зоной. Если зона не указывается, то используется зона по-умолчанию.
--list-all [--zone=zone] Отображение списка интерфейсов, портов и сервисов, сконфигурированных для зоны. Если зона не указывается, то используется зона по-умолчанию.
--list-all-zones Отображение списка интерфейсов, портов и сервисов, сконфигурированных для всех зон.
--add-service=service Разрешить прохождение трафика к демону. Если зона не указывается, то используется зона по-умолчанию.
--add-port=portid[-portid]/protocol Разрешить прохождение трафика на порт/группу портов. Если зона не указывается, то используется зона по-умолчанию.
--remove-service=service Убрать прохождение трафика к демону. Если зона не указывается, то используется зона по-умолчанию.
--remove-port=portid[-portid]/protocol Убрать прохождение трафика на порт/группу портов. Если зона не указывается, то используется зона по-умолчанию.
--reload Перезагрузка правил файрвола без обрыва соединений.
--permanent Опция используется для постоянного применения изменений, однако изменения не распространяются на работающую конфигурацию, но вступят в силу только после перезагрузки. Если опция не задана, то изменения распространяются только на работающую конфигурацию.

Обычные правила firewalld

Добавим сервис http в зону по-умолчанию:

[root@vm-01 ~]# firewall-cmd --add-service=http --permanent
success
[root@vm-01 ~]# firewall-cmd --list-services 
https dhcpv6-client smtp ssh dns
[root@vm-01 ~]# firewall-cmd --reload
success
[root@vm-01 ~]# firewall-cmd --list-services 
http dns dhcpv6-client smtp ssh https
[root@vm-01 ~]#

"Сложные" правила firewalld

Кроме обычных правил, для открытия/закрытия доступа к сервису или порту, firewalld предлагает системным администраторам два других способа добавления правил "прямые" (direct) правила и "сложные" (rich).

"прямые" правила

Данный вид правил позволяет напрямую управлять файрволлом. Для их применения требуется знание основных концепций ip(6)tables/ebtables, таких как:

  • таблицы (filter/mangle/nat)
  • цепочки (INPUT/OUTPUT/FORWARD/...)
  • команды (-A/-D/-I/...)
  • параметры (-p/-s/-d/-j/...)
  • целей (ACCEPT/DROP/REJECT/...)

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

[--permanent] --direct --add-rule { ipv4 | ipv6 | eb } table chain priority args

Переменная priority используется для порядка очередности правил. Цифра 0 используется для постановки правила на самый верх, далее местонахождение правила в списке зависит от его номера.

[root@serverX ~]# firewall-cmd --direct --permanent --add-chain ipv4 raw blacklist
[root@serverX ~]# firewall-cmd --direct --permanent --add-rule ipv4 raw PREROUTING 0 -s 192.168.0.0/24 - j blacklist
[root@serverX ~]# firewall-cmd --direct --permanent --add-rule ipv4 raw blacklist 0 -m limit --limit 1/min -j LOG --log-prefix "blacklisted"
[root@serverX ~]# firewall-cmd --direct --permanent --add-rule ipv4 raw blacklist 1 -j DROP

"сложные" правила

"сложные" правила позволяют создавать более комплексные правила для файрволла простым и понятным путем. Язык используемый в написании "сложных" правил использует ключевые слова со значениями (в формате переменная=значение) и является абстрактным отображением правил ip*tables. "сложные" правила расширяют текущие элементы зоны (service, port, icmp-block, masquerade, forward-port и source-port) дополнительными адресами приемника и источника, действиями, журналированием и ограничением на действия и журналирование.

Правила являются частью зоны. Зона может содержать несколько правили. Применяется первое совпавшее правило!

Синтаксис сложных правил, выражается следующим блоком:

rule
             [source]
             [destination]
             service|port|protocol|icmp-block|masquerade|forward-port|source-port
             [log]
             [audit]
             [accept|reject|drop|mark]

Порядок следования правил в зоне:

  1. Перенаправление порта или маскардинг в зоне
  2. Набор правил журналирования в зоне
  3. Набор разрешающих правил в зоне
  4. Набор запрещающих правил в зоне

Список основных команд для "сложных" правил firewalld

Параметр Значение
--add-rich-rule='rule' [--zone=zone] Добавить правило в зону. Если зона не указывается, то используется зона по-умолчанию.
--remove-rich-rule='rule' [--zone=zone] Убрать правило из зоны. Если зона не указывается, то используется зона по-умолчанию.
--query-rich-rule='rule' [--zone=zone] Проверить было ли добавлено правило в зону. Возвращает 0, если правило существует, в противном случае - возвращает 1
--list-rich-rules [--zone=zone] Вывод списка "сложных" правил в зоне. Если зона не указывается, то используется зона по-умолчанию.

Пример журналирования:

[root@vm-01 ~]# firewall-cmd --add-rich-rule='rule service name="ssh" log prefix="### ssh ###" level="notice" limit value="10/m" accept'
success
[root@vm-01 ~]#

Проверим, работает ли правило:

[root@vm-01 ~]# firewall-cmd --list-rich-rules
rule service name="ssh" log prefix="### ssh ###" level="notice" limit value="10/m" accept
[root@vm-01 ~]#

Совершим вход, по протоколу ssh на машину vm-01, после чего проверим записи в /var/log/messages:

$ ssh root@192.168.122.158
root@192.168.122.158's password: 
Last login: Tue Feb 20 05:55:59 2018 from gateway
[root@vm-01 ~]# grep "###" /var/log/messages
Feb 21 08:41:51 vm-01 kernel: ### ssh ###IN=eth0 OUT= MAC=52:54:00:07:c2:1a:52:54:00:05:14:94:08:00 SRC=192.168.122.1 DST=192.168.122.158 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=12041 DF PROTO=TCP SPT=60864 DPT=22 WINDOW=29200 RES=0x00 SYN URGP=0 
[root@vm-01 ~]#

Пример перенаправления портов:

[root@vm-01 ~]# firewall-cmd --add-forward-port=port=3333:proto=tcp:toport=22:toaddr=192.168.1.1
success
[root@vm-01 ~]# firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: eth0 eth1
  sources: 
  services: dhcpv6-client dns http https smtp ssh
  ports: 8081/tcp 3260/tcp 8888/tcp
  protocols: 
  masquerade: yes
  forward-ports: port=3333:proto=tcp:toport=22:toaddr=192.168.1.1
  sourceports: 
  icmp-blocks: 
  rich rules: 
	rule service name="ssh" log prefix="### ssh ###" level="notice" limit value="10/m" accept
[root@vm-01 ~]#

Совершим вход, по протоколу ssh на порт 3333 машины vm-01 с машины vm-02:

[root@vm-02 ~]# ssh -p3333 root@192.168.1.1
The authenticity of host '[192.168.1.1]:3333 ([192.168.1.1]:3333)' can't be established.
ECDSA key fingerprint is aa:33:2a:9c:6f:24:cd:d9:b5:2a:d6:81:a8:da:e3:15.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '[192.168.1.1]:3333' (ECDSA) to the list of known hosts.
root@192.168.1.1's password: 
Last login: Wed Feb 21 08:41:54 2018 from gateway
[root@vm-01 ~]# grep "###" /var/log/messages
Feb 21 09:13:14 vm-01 kernel: ### ssh ###IN=eth1 OUT= MAC=52:54:00:92:b1:55:52:54:00:12:f1:62:08:00 SRC=192.168.1.2 DST=192.168.1.1 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=14555 DF PROTO=TCP SPT=53023 DPT=22 WINDOW=14600 RES=0x00 SYN URGP=0 MARK=0x64 
[root@vm-01 ~]#

Ссылки

Описание Firewalld
Настройка Firewalld
Iptables