15%

Спести 15% на всички хостинг услуги

Тествай уменията си и получи Отстъпка за всеки хостинг план

Използвайте код:

Skills
За начало
01.11.2024

Как да конфигурирате защитна стена с Firewalld на Linux (Пълно ръководство)

Защитата на вашия Linux сървър срещу неоторизиран достъп и злонамерен трафик не е опционална — това е фундаментална отговорност на всеки системен администратор. Независимо дали управлявате личен проект, бизнес приложение или производствен уеб сървър, правилно конфигуриран firewall е вашата първа и най-критична линия на защита. Firewalld е един от най-мощните и гъвкави инструменти за управление на firewall, налични на Linux, предлагащ динамично управление на правила, контрол на трафика базиран на зони и богата поддръжка на правила — всичко без необходимост от пълен рестарт на услугата при прилагане на промени.

Този всеобхватен справочник ви преведе през всичко, което трябва да знаете: инсталиране на Firewalld, разбиране на зони, управление на услуги и портове, писане на богати правила и мониторинг на вашия firewall в реално време. Ако хостирате на VPS или Dedicated Server от AlexHost, този справочник ще ви помогне да заключите вашата среда и поддържате силна, адаптивна позиция на сигурност.

Какво е Firewalld и защо трябва да го използвате?

Firewalld е демон за динамично управление на firewall, налични на повечето основни Linux дистрибуции, включително CentOS, RHEL, Fedora, Rocky Linux, AlmaLinux, и все повече на Debian и Ubuntu също. За разлика от по-старият iptables подход — където всяка промяна на правилата изискваше изчистване и преоставяне на целия набор от правила — Firewalld прилага промени динамично по време на работа без прекъсване на активни връзки.

Ключови предимства на Firewalld

  • Архитектура базирана на зони — присвояване на различни нива на доверие на различни мрежови интерфейси или IP диапазони
  • Динамични актуализации на правила — прилагане на промени без рестартиране на firewall или отпадане на съществуващи връзки
  • Абстракция на услуги — управление на трафика по име на услуга (например http, ssh) вместо сурови номера на портове
  • Богати правила — писане на сложни, условни правила, насочени към конкретни IP адреси, протоколи и действия
  • D-Bus интеграция — позволява на други приложения и услуги да взаимодействат с firewall програмно
  • Поддръжка на IPv4 и IPv6 — управление на двете семейства протоколи от един интерфейс

Предварителни условия

Преди да продължите, уверете се, че имате:

  • Linux сървър, работещ на CentOS 7/8/9, RHEL, Fedora, Rocky Linux, AlmaLinux, Debian или Ubuntu
  • Root или sudo достъп до сървъра
  • Основно разбиране на Linux терминални команди
  • Активна SSH сесия (держете я отворена през цялото време — ще модифицирате правила на firewall)

> Критично предупреждение: Винаги уверете се, че SSH (порт 22 по подразбиране) е изрично разрешен в правилата на вашия firewall преди активиране на Firewalld. Заключване на себе си от отдалечен сървър е често срещана и избегната грешка.

Стъпка 1: Инсталиране на Firewalld

Firewalld е включен в хранилищата по подразбиране на повечето основни Linux дистрибуции. Използвайте подходящия мениджър на пакети за вашата система.

На CentOS / RHEL / Rocky Linux / AlmaLinux

sudo yum install firewalld -y

Или, на по-нови версии, използвайки DNF:

sudo dnf install firewalld -y

На Fedora

sudo dnf install firewalld -y

На Debian / Ubuntu

Докато Firewalld е най-често свързан с RHEL-базирани системи, той е напълно поддържан на Debian-базирани дистрибуции:

sudo apt update
sudo apt install firewalld -y

> Забележка за Ubuntu/Debian потребители: Ако ufw е в момента активен на вашата система, деактивирайте го преди активиране на Firewalld, за да избегнете конфликти:

> “`bash

> sudo ufw disable

> “`

Стъпка 2: Стартиране и активиране на Firewalld

След инсталирането, стартирайте услугата Firewalld и я конфигурирайте да се стартира автоматично при системния бут:

sudo systemctl start firewalld
sudo systemctl enable firewalld

Проверете, че услугата работи правилно:

sudo systemctl status firewalld

Трябва да видите изход, подобен на:

● firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled)
   Active: active (running) since ...

Ако статусът показва active (running), Firewalld е оперативен и готов за конфигуриране.

Стъпка 3: Разбиране на Firewalld зони

Моделът, базиран на зони, е крайъгълният камък на архитектурата на Firewalld. Зона определя ниво на доверие за мрежова връзка или интерфейс. Всяка зона съдържа свой собствен набор от правила, които определят какъв трафик е разрешен или забранен.

Вградени Firewalld зони

ЗонаНиво на довериеТипична употреба
dropНай-нискоВсички входящи връзки се отпадат без отговор
blockМного нискоВходящите връзки се отхвърлят с ICMP съобщение
publicНискоЗона по подразбиране за недоверени публични мрежи
externalНискоЗа външни интерфейси с NAT маскиране
dmzСредноСървъри, достъпни отвън, но изолирани вътрешно
workСредно-високоРаботни мрежи с умерено доверие
homeВисокоДомашни мрежи, където други хостове са доверени
internalВисокоВътрешни мрежи, подобни на домашни
trustedНай-високоВсички връзки се приемат

Проверка на текущата зона по подразбиране

sudo firewall-cmd --get-default-zone

Списък на всички налични зони

sudo firewall-cmd --get-zones

Преглед на текущо активни зони и техните интерфейси

sudo firewall-cmd --get-active-zones

Пример на изход:

public
  interfaces: eth0

Стъпка 4: Промяна на зоната по подразбиране

Пример 1 — Задаване на зоната по подразбиране на public (Препоръчано за VPS/Dedicated сървъри)

За повечето интернет-ориентирани сървъри, public е подходящата зона по подразбиране. Тя прилага консервативно ниво на доверие и разрешава само изрично разрешен трафик:

sudo firewall-cmd --set-default-zone=public

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

sudo firewall-cmd --get-default-zone

Очакван изход:

public

Пример 2 — Задаване на зоната по подразбиране на home

Ако вашият сървър работи на доверена частна мрежа (като домашна лаборатория или вътрешна среда за разработка), зоната home позволява по-разрешителна комуникация между доверени хостове:

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

Проверете:

sudo firewall-cmd --get-default-zone

Очакван изход:

home

Пример 3 — Задаване на зоната по подразбиране на work

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

sudo firewall-cmd --set-default-zone=work

Проверете:

sudo firewall-cmd --get-default-zone

Очакван изход:

work

Стъпка 5: Управление на услуги с Firewalld

Firewalld включва библиотека от предварително определени дефиниции на услуги, които картографират имена на услуги към съответните портове и протоколи. Това улеснява управлението на правилата по намерение, а не по сурови номера на портове.

Списък на всички предварително определени услуги

sudo firewall-cmd --get-services

Разрешаване на услуга в зона

За разрешаване на HTTP трафик (порт 80/TCP) в зоната public постоянно:

sudo firewall-cmd --zone=public --add-service=http --permanent

За разрешаване на HTTPS трафик (порт 443/TCP):

sudo firewall-cmd --zone=public --add-service=https --permanent

За разрешаване на SSH (порт 22/TCP) — винаги уверете се, че това е разрешено преди да направите други промени:

sudo firewall-cmd --zone=public --add-service=ssh --permanent

Прилагане на промени чрез преоставяне на Firewalld

Флагът --permanent записва правилото в постоянната конфигурация, но не го прилага незабавно към работещия firewall. Винаги преоставете след направяне на постоянни промени:

sudo firewall-cmd --reload

Проверка на услуги в зона

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

Пример на изход:

dhcpv6-client http https ssh

Премахване на услуга от зона

За премахване на HTTPS от зоната public:

sudo firewall-cmd --zone=public --remove-service=https --permanent
sudo firewall-cmd --reload

Стъпка 6: Управление на портове директно

В случаи, когато услуга няма предварително определена дефиниция на Firewalld, можете да отворите или затворите конкретни портове директно.

Отваряне на конкретен порт

За отваряне на порт 8080 над TCP в зоната public:

sudo firewall-cmd --zone=public --add-port=8080/tcp --permanent
sudo firewall-cmd --reload

За отваряне на UDP порт (например порт 53 за DNS):

sudo firewall-cmd --zone=public --add-port=53/udp --permanent
sudo firewall-cmd --reload

За отваряне на диапазон от портове (например 6000–6100 TCP):

sudo firewall-cmd --zone=public --add-port=6000-6100/tcp --permanent
sudo firewall-cmd --reload

Затваряне на конкретен порт

За затваряне на порт 8080:

sudo firewall-cmd --zone=public --remove-port=8080/tcp --permanent
sudo firewall-cmd --reload

Списък на всички отворени портове в зона

sudo firewall-cmd --zone=public --list-ports

Стъпка 7: Напредналата конфигурация с богати правила

Богатите правила ви дават гранулиран, условен контрол над трафика — далеч отвъд това, което позволяват простите правила за услуга или порт. Те поддържат филтриране по IP адрес на източника, IP адрес на дестинацията, протокол, порт и действие (приемане, отхвърляне, отпадане, логване).

Синтаксис на богато правило

rule [family="<ipv4|ipv6>"]
     [source address="<IP/CIDR>"]
     [destination address="<IP/CIDR>"]
     [service name="<service>"] | [port port="<port>" protocol="<tcp|udp>"]
     [log [prefix="<prefix>"] [level="<level>"] [limit value="<rate>"]]
     [accept|reject|drop]

Пример 1 — Разрешаване на SSH само от конкретен IP адрес

Това е една от най-важните конфигурации на сигурност за всеки отдалечен сървър. Ако управлявате вашия сървър от фиксиран IP адрес, ограничете достъпа на SSH само до този IP адрес:

sudo firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="203.0.113.50" service name="ssh" accept' --permanent
sudo firewall-cmd --reload

Пример 2 — Блокиране на целия трафик от конкретен IP адрес

За напълно блокиране на IP адрес, който генерира злонамерен трафик:

sudo firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="198.51.100.25" drop' --permanent
sudo firewall-cmd --reload

Пример 3 — Разрешаване на HTTP от конкретна подмрежа

За разрешаване на HTTP трафик само от доверена вътрешна подмрежа (например 192.168.1.0/24):

sudo firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" service name="http" accept' --permanent
sudo firewall-cmd --reload

Пример 4 — Ограничаване на скоростта на SSH връзки за предотвратяване на брутална сила

Логване и ограничаване на опитите за SSH връзка за намаляване на експозицията към атаки с брутална сила:

sudo firewall-cmd --zone=public --add-rich-rule='rule service name="ssh" log prefix="SSH-ATTEMPT" level="notice" limit value="3/m" accept' --permanent
sudo firewall-cmd --reload

Пример 5 — Разрешаване на конкретен порт от конкретен IP

sudo firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="10.0.0.5" port port="3306" protocol="tcp" accept' --permanent
sudo firewall-cmd --reload

Списък на всички богати правила в зона

sudo firewall-cmd --zone=public --list-rich-rules

Премахване на богато правило

sudo firewall-cmd --zone=public --remove-rich-rule='rule family="ipv4" source address="198.51.100.25" drop' --permanent
sudo firewall-cmd --reload

Стъпка 8: Мониторинг и одит на вашия firewall

Редовното преглеждане на конфигурацията на вашия firewall е съществено за поддържане на силна позиция на сигурност. Firewalld предоставя няколко команди за проверка на текущото състояние на вашите правила.

Преглед на пълната конфигурация за зоната по подразбиране

sudo firewall-cmd --list-all

Пример на изход:

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

Преглед на конфигурация за всички зони

sudo firewall-cmd --list-all-zones

Преглед на конфигурация за конкретна зона

sudo firewall-cmd --zone=dmz --list-all

Проверка дали конкретна услуга е разрешена

sudo firewall-cmd --zone=public --query-service=http

Проверка дали конкретен порт е отворен

sudo firewall-cmd --zone=public --query-port=8080/tcp

Стъпка 9: Правила по време на работа срещу постоянни — разбиране на разликата

Firewalld работи с два различни слоя на конфигурация:

СлойФлагПостоянствоУпотреба
По време на работа*(без флаг)*Загубено при преоставяне/рестартВременно тестване на правила
Постоянно--permanentОцелява преоставяне и рестартПроизводствени конфигурации

Най-добра практика работен процес

  1. Тестирайте правилото по време на работа първо (без --permanent) за проверка, че работи както се очаква
  2. Добавете правилото постоянно след потвърждение
  3. Преоставете Firewalld за синхронизиране на конфигурациите по време на работа и постоянни
# Step 1: Test at runtime
sudo firewall-cmd --zone=public --add-service=http

# Step 2: Verify it works as expected, then make it permanent
sudo firewall-cmd --zone=public --add-service=http --permanent

# Step 3: Reload to sync
sudo firewall-cmd --reload

Алтернативно, приложете постоянно правило и незабавно преоставете в един работен процес:

sudo firewall-cmd --zone=public --add-service=http --permanent && sudo firewall-cmd --reload

Стъпка 10: Присвояване на мрежови интерфейси на зони

Ако вашият сървър има множество мрежови интерфейси (често срещано на Dedicated сървъри с публични и частни NIC), можете да присвоите всеки интерфейс на различна зона с различни нива на доверие.

Присвояване на интерфейс на зона

sudo firewall-cmd --zone=internal --add-interface=eth1 --permanent
sudo firewall-cmd --reload

Промяна на зоната на интерфейс

sudo firewall-cmd --zone=public --change-interface=eth0 --permanent
sudo firewall-cmd --reload

Премахване на интерфейс от зона

sudo firewall-cmd --zone=internal --remove-interface=eth1 --permanent
sudo firewall-cmd --reload

Стъпка 11: Активиране на IP маскиране и пренасочване на портове

За сървъри, действащи като шлюзове или работещи NAT (Network Address Translation), Firewalld поддържа маскиране и пренасочване на портове естествено.

Активиране на маскиране (NAT)

sudo firewall-cmd --zone=external --add-masquerade --permanent
sudo firewall-cmd --reload

Пренасочване на порт (например пренасочване на външен порт 80 към вътрешен порт 8080)

sudo firewall-cmd --zone=public --add-forward-port=port=80:proto=tcp:toport=8080 --permanent
sudo firewall-cmd --reload

Пренасочване на трафик към различен хост

sudo firewall-cmd --zone=public --add-forward-port=port=80:proto=tcp:toport=80:toaddr=192.168.1.10 --permanent
sudo firewall-cmd --reload

Практични конфигурации на сигурност за AlexHost

15%

Спести 15% на всички хостинг услуги

Тествай уменията си и получи Отстъпка за всеки хостинг план

Използвайте код:

Skills
За начало