Налаштування FirewallD на сервері з CentOS 8 і 7

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


зміст:

  • Основні концепції firewalld, зони і правила
  • Установка і включення firewalld в CentOS
  • Робота з правилами firewalld
  • Firewalld: блокування IP-адрес, створення виключень
  • Перенаправлення портів в firewalld

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

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

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

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

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

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

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

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

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

# Yum install firewalld -y - для Centos 7
# Dnf install firewalld -y - для Centos 8

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

# 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

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

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

# Firewall-cmd --get-active-zones

public interfaces: eth0

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

Список мережевих інтерфейсів CentOS можна вивести:

# Ip link show
або
# Nmcli device status

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

# 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

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

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

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

# Firewall-cmd --zone = home -change-interface = eth0

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

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

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

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

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

# Firewall-cmd --get-services

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

наприклад:

# Cd / usr / lib / firewalld / services

# Cat smtp.xml

  Mail (SMTP) 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.  

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

При додаванні правил, ви можете використовувати параметр -add-service, щоб відкрити доступ певного сервісу:

# 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

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

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

# 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

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

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

# Firewall-cmd --get-services

Я назвав сервіс test і в списку він з'явився:

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 порт udp
# Firewall-cmd --zone = public -add-port = 77-88 / udp - відкрити діапазон портів 77-88 udp
# 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 udp

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

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

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

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

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

# Firewall-cmd --reload

success

# Firewall-cmd --get-zones

block dmz drop external home internal our public trusted work

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

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

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

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

# 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, потрібно замінити accept на reject:

# 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

У Windows ви можете налаштувати порт-форвардного за допомогою netsh.

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

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