Починаючи з CentoOS 7 для настройки правил фільтрації трафіку з’явився новий інструмент брандмауер. Саме його рекомендується використовувати для управління правилами iptables. У CentOS 8 замість стандартного пакета фільтрації iptables тепер використовується фреймворк nftables, і при налаштуванні правил брандмауера через firewalld насправді ви налаштовуєте nftables. У цій статті ми розглянемо установку, основні концепції та налаштування брандмауера firewalld на сервері під керуванням CentOS 8 (в CentOS 7 все аналогічно).

БрандмауерD – міжмережевий екран для захисту сервера від небажаного трафіку з підтримкою динамічного управління правилами (без перезапуску) і реалізації постійних правил брандмауера. Працює як інтерфейс для iptables і nftables. FirewallD можна використовувати майже в усіх дистрибутивах Linux.

Основні концепції firewalld, зони і правила

Перед тим як приступити до встановлення та налаштування брандмауер, Ми познайомимося з поняттям зон, які використовуються для визначення рівня довіри до різних сполук. Для різних зон брандмауер можна застосувати різні правила фільтрації, вказувати активні опції брандмауера у вигляді попередньо визначених служб, протоколів і портів, перенаправлення портів і rich-rules.

Брандмауер фільтрує вхідний трафік по зонам в залежності від застосованих до зони правил. якщо IP-адреса відправника запиту відповідає правилам будь-якої зони, то пакет буде відправлятися через цю зону. Якщо ж адреса не відповідає жодній з налаштованих на сервері зоні, пакет буде оброблятися зоною використовуваної за замовчуванням. При встановленні брандмауер зона за замовчуванням називається громадськості.

У firewalld є зони, де вже попередньо налаштовані дозволу для різних служб. Можна використовувати ці настройки або створювати власні зони. Список зон по-замовчуванню, які створюються при установці firewalld (зберігаються в каталозі / usr / lib / firewalld / zones /):

крапля мінімальний рівень довіри. Всі вхідні з’єднання блокуються без відповіді, допускаються тільки вихідні з’єднання;
блок зона схожа з попередньою, але при відхиленні вхідних запитів відправляється повідомлення icmp-host-prohibited для Ipv4 або icmp6-adm-prohibited для Ipv6;
громадськості представляє громадські, недовірених мережі. Можна вирішувати вибрані вхідні з’єднання в індивідуальному порядку;
зовнішній зовнішні мережі при використанні брандмауера в якості шлюзу. Вона налаштована для маскування NAT, тому ваша внутрішня мережа залишається приватною, але доступною;
внутрішній антонім зони external. Хост володіють достатнім рівнем довіри, доступний ряд додаткових служб;
dmz використовується для комп’ютерів, розташованих в DMZ (ізольовані комп’ютери без доступу до іншої мережі). Дозволені тільки певні вхідні з’єднання;
робота зона для робочих машин (більшість комп’ютерів в мережі довірені);
додому зона домашньої мережі. Можна довіряти більшості ПК, але підтримуються тільки певні вхідні з’єднання;
довіряють довіряти всім машинам в мережі. Найбільш відкрита з усіх доступних опцій, вимагає свідомого використання.

В брандмауер використовується два набори правил – постійні і тимчасові. Тимчасові правила працюють до перезавантаження сервера. За замовчуванням при додаванні правил в брандмауер, Правила вважаються тимчасовими (час виконання). Щоб додати правило на постійній основі потрібно використовувати прапор – постійний. Такі правила будуть застосовуватися після перезавантаження сервера.

Установка і включення firewalld в CentOS

У CentOS 7/8 firewalld встановлюється за умовчанням при установці ОС. Якщо ви його видалили і хочете встановити firewalld, можете скористатися стандартним менеджером yum / dnf:

# yum install firewalld -y — для Centos 7
# dnf install firewalld -y — для Centos 8

установка firewalld в centos 8

щоб демон брандмауер запускався автоматично зі стартом сервера, потрібно додати його в автозавантаження:

# systemctl enable firewalld

І запустити:

# systemctl start firewalld

Перевірити статус сервісу:

# systemctl status firewalld

● firewalld.service - firewalld - dynamic firewall daemon
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled)
Active: active (running) since Mon 2019-10-14 14:54:40 +06; 22s ago
Docs: man:firewalld(1)
Main PID: 13646 (firewalld)
CGroup: /system.slice/firewalld.service
└─13646 /usr/bin/python2 -Es /usr/sbin/firewalld --nofork --nopid
Oct 14 14:54:40 server.vpn.ru systemd[1]: Starting firewalld - dynamic firewall daemon...
Oct 14 14:54:40 server.vpn.ru systemd[1]: Started firewalld - dynamic firewall daemon.

Або командою:

# firewall-cmd --state

Команда firewall-cmd є фронтенда firewalld до nftables / iptables.

# firewall-cmd --state

running

Робота з правилами firewalld

Правила за умовчанням:

Перед налаштуванням правил firewalld, потрібно перевірити, яка зона використовується за умовчанням:

# firewall-cmd --get-default-zone

firewall-cmd — get-default-zone

Так як firewalld ми тільки встановили і ще не налаштовували, у нас зона по-замовчуванню громадськості.

Перевіримо активну зону. Вона також одна – public:

# firewall-cmd --get-active-zones

public
interfaces: eth0

Як бачимо, мережевий інтерфейс eth0 управляється зоною громадськості.

Щоб подивитися правила активної зони, введіть:

# firewall-cmd --list-all

public (active)
target: default
icmp-block-inversion: no
interfaces: eth0
sources:
services: dhcpv6-client ssh
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:

З лістингу видно, що в дану зону додані звичайні операції, пов’язані з DHCP-клієнтом і ssh.

доступні зони

Щоб переглянути список всіх зон, потрібно виконати команду:

# firewall-cmd --get-zones

У мене вийшов такий список:

block dmz drop external home internal public trusted work

Щоб перевірити правила конкретної зони, потрібно додати прапор – zone.

# firewall-cmd --zone=home --list-all

home
target: default
icmp-block-inversion: no
interfaces:
sources:
services: dhcpv6-client mdns samba-client ssh
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:

Правила всіх зон, можна переглянути командою:

# firewall-cmd --list-all-zones

Лістинг буде досить великий, так як зон може бути багато.

Зміна зони за замовчуванням.

За замовчуванням всі мережеві інтерфейси розташовані в зоні громадськості, Але їх можна перенести в будь-яку з зон, командою:

# firewall-cmd --zone=home —change-interface=eth0

після параметра —Зона = вказати потрібну зону.

Щоб змінити зону за замовчуванням, потрібно застосувати команду:

# firewall-cmd --set-default-zone=home

firewall-cmd —set-default-zone

Додавання правил для додатків

Щоб відкрити порт для додатка, можна додати в виключення сервіс. Вивести список доступних сервісів:

# firewall-cmd --get-services

firewall-cmd --get-services

Висновок буде містити велику кількість сервісів. Детальна інформація про службу міститься в її xml файлі. Ці файли розташовані в директорії / usr / lib / firewalld / services.

наприклад:

# cd /usr/lib/firewalld/services

# cat smtp.xml

<?xml version="1.0" encoding="utf-8"?>
<service>
<short>Mail (SMTP)</short>
<description>This option allows incoming SMTP mail delivery. If you need to allow remote hosts to connect directly to your machine to deliver mail, enable this option. You do not need to enable this if you collect your mail from your ISP's server by POP3 or IMAP, or if you use a tool such as fetchmail. Note that an improperly configured SMTP server can allow remote machines to use your server to send spam.</description>
<port protocol="tcp" port="25"/>
</service>

У XML файлі є опис сервісу, протокол і номер порту, який буде відкритий в firewalld.

xml опису сервісів для firewalld

При додаванні правил, ви можете використовувати параметр —Додавання послуги, Щоб відкрити доступ певного сервісу:

# firewall-cmd --zone=public --add-service=http

success

# firewall-cmd --zone=public --add-service=https

success

Після додавання правил, можна перевірити, додані чи сервіси в зазначену зону:

# firewall-cmd --zone=public --list-services

dhcpv6-client http https ssh

Якщо ви хочете зробити ці правила постійними, при додаванні потрібно додати параметр —Постійний.

Щоб видалити сервіс із зони:

# firewall-cmd --permanent --zone=public --remove-service=http

# firewall-cmd --zone=public --permanent --list-services

dhcpv6-client https ssh test

Якщо ви хочете додати в виключення свій сервіс, ви можете створити файл xml самостійно і заповнити його. Ви маєте можливість копіювати дані з будь-якого сервісу, змінити назву, опис і номер порту.

скопіюємо файл smtp.xml в директорію для роботи з сервісами користувачів:

# cp /usr/lib/firewalld/services/smtp.xml /etc/firewalld/services

Змініть опис сервісу в файлі.

створити власну службу в firewalld

Сам файл xml теж потрібно перейменувати на ім’я вашого сервісу. Після чого, потрібно перезавантажити firewalld і перевірити чи є наш сервіс в списку:

# firewall-cmd --get-services

Я назвав сервіс тест і в списку він з’явився:

syslog-tls telnet test tftp

Тепер можна додати створений сервіс в будь-яку зону:

# firewall-cmd --zone=public --add-service=test --permanent

success

# firewall-cmd --zone=public --permanent --list-services

dhcpv6-client http https ssh test

Якщо ви на знайшли потрібний вам сервіс в списку, ви можете відкрити потрібний порт на firewalld командою:

# firewall-cmd --zone=public —add-port=77/tcp – відкрити 77 порт tcp
# firewall-cmd --zone=public —add-port=77/udp – відкрити 77 порт удп
# firewall-cmd --zone=public —add-port=77-88/udp – відкрити діапазон портів 77-88 удп
# firewall-cmd --zone=public —list-ports – перевірити список дозволених портів

Заблокувати / дозволити ICMP відповіді:

# firewall-cmd --zone=public --add-icmp-block=echo-reply
# firewall-cmd --zone= public --remove-icmp-block=echo-reply

Видалити додану порт:

# firewall-cmd --zone=public —remove-port=77/udp – видалити тимчасове правило 77 удп

# firewall-cmd --permanent --zone=public —remove-port=77/udp – видалити постійне правило

firewall-cmd --zone = public -add-port - відкрити порт в файервол

Додавання власних зон

Ви можете створити власну зону (назву її наш):

# firewall-cmd --permanent --new-zone=our

Після створення нової зони, як і після створення сервісу, потрібне перезавантаження брандмауер:

# firewall-cmd --reload

success

# firewall-cmd --get-zones

block dmz drop external home internal our public trusted work

Зона наш доступна. Ви можете додавати в неї сервіси або відкривати певні порти.

Firewalld: блокування IP-адрес, створення виключень

Ви можете додавати в виключення firewalld довірені адреси IP адреси або блокувати небажані.

Щоб додати в виключення конкретний IP- адресу (наприклад 8.8.8.8) на вашому сервері через брандмауер, Використовуйте команду:

# firewall-cmd --zone=public --add-rich-rule="rule family="ipv4" source address="8.8.8.8" accept"

Перевірте зону, і переконайтеся що IP доданий в виключення в правилі rich rules:

# firewall-cmd --zone=public --list-all

public (active)
target: default
icmp-block-inversion: no
interfaces: eth0
sources:
services: dhcpv6-client http https ssh test
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
rule family="ipv4" source address="8.8.8.8" accept

щоб заблокувати IP, Потрібно замінити прийняти на відкинути:

# firewall-cmd --zone=public --add-rich-rule="rule family="ipv4" source address="8.8.4.4" reject"

# firewall-cmd --zone=public --list-all

public (active)
target: default
icmp-block-inversion: no
interfaces: eth0
sources:
services: dhcpv6-client http https ssh test
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
rule family="ipv4" source address="8.8.8.8" accept
rule family="ipv4" source address="8.8.4.4" reject

Можна дозволити певну службу тільки для запитів з конкретного IP адреси:

#firewall-cmd --permanent --add-rich-rule 'rule family="ipv4" source address="10.10.1.0/24" service name="https" accept'

Якщо вам потрібно терміново заблокувати взагалі всі запити до сервера, використовуйте команду паніки:

# firewall-cmd --panic-on

Вийти з режиму паніки можна або командою:

# firewall-cmd --panic-off

Або перезагрузив сервер.

Ви можете заблокувати конфігурацію firewalld, щоб локальні сервіси з правами root не могли змінити створені вами правила брандмауера:

# firewall-cmd --lockdown-on

Вийти з режиму блокування:

# firewall-cmd --lockdown-off

Перенаправлення портів в firewalld

Ви можете створити правило перенаправлення портів в firewalld. Щоб перенаправити 443 порт на 9090:

# firewall-cmd --zone=public --add-forward-port=port=443:proto=tcp:toport=9090 --permanent

Щоб видалити правило перенаправлення порту:

# firewall-cmd --zone=public --remove-forward-port=port=443:proto=tcp:toport=9090

Leave a Reply

Your email address will not be published. Required fields are marked *