Как да конфигурирате защитна стена с 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 | Оцелява преоставяне и рестарт | Производствени конфигурации |
Най-добра практика работен процес
- Тестирайте правилото по време на работа първо (без
--permanent) за проверка, че работи както се очаква - Добавете правилото постоянно след потвърждение
- Преоставете 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