Firewalld — различия между версиями
Andy (обсуждение | вклад) |
Andy (обсуждение | вклад) (→Ссылки) |
||
(не показано 14 промежуточных версий этого же участника) | |||
Строка 96: | Строка 96: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
− | == firewalld rich rules == | + | == "Сложные" правила firewalld == |
+ | Кроме обычных правил, для открытия/закрытия доступа к сервису или порту, <code>firewalld</code> предлагает системным администраторам | ||
+ | два других способа добавления правил "прямые" (<code>direct</code>) правила и "сложные" (<code>rich</code>). | ||
+ | |||
+ | ==== "прямые" правила ==== | ||
+ | Данный вид правил позволяет напрямую управлять файрволлом. Для их применения требуется знание основных концепций <code>ip(6)tables/ebtables</code>, таких как: | ||
+ | * таблицы <code>(filter/mangle/nat)</code> | ||
+ | * цепочки <code>(INPUT/OUTPUT/FORWARD/...)</code> | ||
+ | * команды <code>(-A/-D/-I/...)</code> | ||
+ | * параметры <code>(-p/-s/-d/-j/...)</code> | ||
+ | * целей <code>(ACCEPT/DROP/REJECT/...)</code> | ||
+ | |||
+ | Прямые правила должны быть использованы только в качестве последнего средства, когда невозможно использовать конфигурационные файлы зон. Формат правил следующий: | ||
+ | <syntaxhighlight lang="bash"> | ||
+ | [--permanent] --direct --add-rule { ipv4 | ipv6 | eb } table chain priority args | ||
+ | </syntaxhighlight> | ||
+ | Переменная <code>priority</code> используется для порядка очередности правил. Цифра <code>0</code> используется для постановки правила на самый верх, далее местонахождение правила в списке зависит от его номера. | ||
+ | <syntaxhighlight lang="bash"> | ||
+ | [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 | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | ==== "сложные" правила ==== | ||
+ | "сложные" правила позволяют создавать более комплексные правила для файрволла простым и понятным путем. Язык используемый в написании "сложных" правил | ||
+ | использует ключевые слова со значениями (в формате <code>переменная=значение</code>) и является абстрактным отображением правил <code>ip*tables</code>. | ||
+ | "сложные" правила расширяют текущие элементы зоны (<code>service, port, icmp-block, masquerade, forward-port и source-port</code>) дополнительными адресами приемника и источника, действиями, журналированием | ||
+ | и ограничением на действия и журналирование. | ||
+ | |||
+ | Правила являются частью зоны. Зона может содержать несколько правили. Применяется первое совпавшее правило! | ||
+ | |||
+ | Синтаксис сложных правил, выражается следующим блоком: | ||
+ | <syntaxhighlight lang="bash"> | ||
+ | rule | ||
+ | [source] | ||
+ | [destination] | ||
+ | service|port|protocol|icmp-block|masquerade|forward-port|source-port | ||
+ | [log] | ||
+ | [audit] | ||
+ | [accept|reject|drop|mark] | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | Порядок следования правил в зоне: | ||
+ | # Перенаправление порта или маскардинг в зоне | ||
+ | # Набор правил журналирования в зоне | ||
+ | # Набор разрешающих правил в зоне | ||
+ | # Набор запрещающих правил в зоне | ||
+ | |||
+ | ==== Список основных команд для "сложных" правил firewalld ==== | ||
+ | {| class="wikitable" | ||
+ | |- | ||
+ | ! Параметр !! Значение | ||
+ | |- | ||
+ | | --add-rich-rule='rule' [--zone=zone] || Добавить правило в зону. Если зона не указывается, то используется зона по-умолчанию. | ||
+ | |- | ||
+ | | --remove-rich-rule='rule' [--zone=zone] || Убрать правило из зоны. Если зона не указывается, то используется зона по-умолчанию. | ||
+ | |- | ||
+ | | --query-rich-rule='rule' [--zone=zone] || Проверить было ли добавлено правило в зону. Возвращает <code>0</code>, если правило существует, в противном случае - возвращает <code>1</code> | ||
+ | |- | ||
+ | | --list-rich-rules [--zone=zone] || Вывод списка "сложных" правил в зоне. Если зона не указывается, то используется зона по-умолчанию. | ||
+ | |- | ||
+ | |} | ||
+ | |||
+ | Пример журналирования: | ||
+ | <syntaxhighlight lang="bash"> | ||
+ | [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 ~]# | ||
+ | </syntaxhighlight> | ||
+ | Проверим, работает ли правило: | ||
+ | <syntaxhighlight lang="bash"> | ||
+ | [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 ~]# | ||
+ | </syntaxhighlight> | ||
+ | Совершим вход, по протоколу <code>ssh</code> на машину <code>vm-01</code>, после чего проверим записи в <code>/var/log/messages</code>: | ||
+ | <syntaxhighlight lang="bash"> | ||
+ | $ 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 ~]# | ||
+ | </syntaxhighlight> | ||
+ | Пример перенаправления портов: | ||
+ | <syntaxhighlight lang="bash"> | ||
+ | [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 ~]# | ||
+ | </syntaxhighlight> | ||
+ | Совершим вход, по протоколу <code>ssh</code> на порт <code>3333</code> машины <code>vm-01</code> с машины <code>vm-02</code>: | ||
+ | <syntaxhighlight lang="bash"> | ||
+ | [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 ~]# | ||
+ | </syntaxhighlight> | ||
== Ссылки == | == Ссылки == | ||
[https://fedoraproject.org/wiki/FirewallD/ru Описание Firewalld]<br /> | [https://fedoraproject.org/wiki/FirewallD/ru Описание Firewalld]<br /> | ||
+ | [https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html/security_guide/sec-configuring_firewalld Настройка Firewalld]<br /> | ||
+ | [https://ru.wikibooks.org/wiki/Iptables Iptables] |
Текущая версия на 16:26, 21 февраля 2018
Содержание
Настройка правил файрволла firewalld
Предварительные требования
- Виртуальная машина с двумя сетевыми интерфейсами
- Установленные пакеты:
firewalld
,firewalld-filesystem
Общая информация
firewalld
разделяет весь входящий трафик на зоны, где каждой зоне соответствует свой набор правил.
Для проверки принадлежности входящих соединений зоне, используется следующая логика, в которой побеждает первое совпадение:
- Исходный адрес входящего пакета совпадает с исходным правилом настройки зоны, в таком случае пакет отправляется на обработку в данной зоне.
- Если исходный интерфейс для пакета совпадает с правилами настройки зоны - эта зона будет использована
- В противном случае, будет использована зона по-умолчанию. Зона по-умолчанию не отдельная зона, поэтому она указывает на другую зону в системе.
Если поведение по-умолчанию не изменено администратором, либо конфигурацией 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]
Порядок следования правил в зоне:
- Перенаправление порта или маскардинг в зоне
- Набор правил журналирования в зоне
- Набор разрешающих правил в зоне
- Набор запрещающих правил в зоне
Список основных команд для "сложных" правил 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 ~]#