Firewalld – to skrót od Firewall Daemon. Jest to alternatywa dla popularnego i znanego w większości iptables narzędzia do dynamicznego zarządzania systemową zaporą w systemie Linux. O ile iptables może wydawać się skomplikowany, o tyle firewalld, podobnie trochę jak ufw, pozwoli mniej doświadczonym użytkownikom na konfigurację podstawowych reguł firewall’a i zabezpieczenie swojego serwera. Firewalld jest domyślnym firewallem w systemach Centos/RHEL, a od jakiegoś czasu także w Ubuntu.

Korzystając z iptables musimy z reguły pamiętać i znać na pamięć kombinacje reguł, pamiętać o odpowiedniej tablicy, o przełącznikach, pamiętać całą tą konstrukcję. Dla bardziej doświadczonych i starszych adminów, którzy „wychowali” się na iptables z pewnością nie stanowi to problemu, ale dziś mamy szereg rozwiązań jak firewalld, które pozwalają na mniej skomplikowane zarządzanie firewallem dla tych, którzy nadal zaporę opierają bezpośrednio na systemie linux, a nie na urządzeniach do tego dedykowanych – z różnych powodów, jak choćby najprostszy, gdzie kupujemy po prostu serwer dedykowany czy VPS i dostawca lub też Data Center nie umożliwiają konfiguracji czegoś nadrzędnego.

Jeszcze słowem wstępu, warto zaznaczyć, że w backendzie firewalld wykorzystuje nftables, czyli zamiennik iptables, z którego dotychczas korzystało większość „nakładek” lub innych arptables, ebtables czy ipset. Nftables przynosi wiele usprawnień, jak szybsze aktualizowanie regułek (co ma znaczenie przy większych i bardziej rozbudowanych firewallach). Jedną z największych zalet firewalld jest to, że wszystko trzymane jest w jednej tablicy. Jednym z problemów związanych z używaniem iptables przez firewalld jest to, że firewalld przejmuje pełną kontrolę nad firewallem hosta. Nftables rozwiązuje te problemy, dzięki czemu unikamy konfliktów z innymi aplikacjami, które nie wchodzą w bezpośrednią interakcję z firewallem.

Inną, ważną kwestią jest możliwość łączenia w nftables różnych zachowań np. logowania i reguły – innymi słowy: w jednej regule w nftables możemy zarówno logować, dopuszczać czy odrzucać połączenia. W iptables wymagałoby to co najmniej dwóch reguł.

Jak firewalld działa w praktyce z nftables?

Aktualnie firewalld wchodzi w interakcję z nftables bezpośrednio za pomocą nft. W podobny sposób opiera swoje działanie korzystając z iptables. W przyszłości, jak obiecują twórcy, zostanie to jeszcze mocniej zoptymalizowane i przyspieszone przez nowszą wersję biblioteki linftables. Poniżej możemy zobaczyć na diagramie w jaki sposób firewalld operuje z backendem.

Źródło: https://firewalld.org

Instalujemy firewalld:

Jeśli jeszcze nie mamy w systemie firewalld, instalujemy go za pomocą menedżera pakietów. W tym artykule pokażę to na przykładzie systemu CentOS. W tym systemie powinien być on zainstalowany domyślnie po instalacji systemu, ale jeśli z jakiegoś powodu go nie ma (np. w instancjach chmurowych, VPS’ach itd.), zainstaluj:

yum install firewalld

Włączamy go do systemu, aby startował razem z systemem:

systemctl enable firewalld
systemctl start firewalld
systemctl status firewalld

Po uruchomieniu, aby sprawdzić status w samym firewallu wydamy polecenie:

firewall-cmd --state

Firewalld ma wbudowane kilka stref, poziomów bezpieczeństwa, a inne aplikacje, które wejdą z nim w interakcję, mogą dodawać swoje strefy i swoje własne poziomy bezpieczeństwa.

firewall-cmd --get-zones

Zwróci:

block dmz drop external home internal nm-shared public trusted work

I są to wbudowane strefy tuż po instalacji firewalld:

– block – blokowanie i odrzucanie połączeń ze zwrotną informacją icmp;

dmz – strefa zdemilitaryzowana, dopuszczaj praktycznie wszystko;

– drop – oznacza blokowanie i odrzucanie połączeń, bez informacji icmp;

– external – ograniczone zaufanie, włączona maskarada, ograniczony ruch;

– home – strefa domowa, większe zaufanie dla połączeń wewnątrz;

internal – analogicznie jak external, ale dla połączeń od środka, większe zaufanie dla urządzeń działających od środka w ramach strefy, podobnie do strefy home;

public – strefa publiczna, podobnie jak w znanych z systemach windows – strefa publiczna blokuje ruch między urządzeniami, brak zaufania między nimi. Jeśli nie zdefiniowano innej strefy to domyślnie będzie stosowana właśnie strefa publiczna.

– trusted – po wrzuceniu urządzenia w tą strefę, będzie ono zaufane bez żadnych innych, dodatkowych ograniczeń np. dwa serwery między sobą any<>any;

work – strefa „firmowa”, która w większym stopniu ufa urządzeniom w tej strefie i zezwala na połączenia typowych usług it między sobą.

Jak już wspomniałem, domyślną strefą jest ustawiana strefa public, jeśli nie zdefiniowano innej strefy. Możemy to łatwo zmienić za pomocą komendy:

firewall-cmd --set-default-zone=drop

lub jeśli chcemy odpowiadać icmp:

firewall-cmd --set-default-zone=block

Przeładowanie reguł firewalld:

firewall-cmd --reload

Aby sprawdzić listę aktualnie używanych stref dla interfejsu karty sieciowej:

firewall-cmd --get-active-zones

Konfiguracja, otwieranie, zamykanie portów

Testowo uruchomiłem usługę na porcie 80 – serwer www.

Ze względu na włączonego firewalla strona jest jednak niedostępna, bo port jest zamknięty na świat.

Odblokowujemy port 80:

firewall-cmd --zone=block --permanent --add-port=80/tcp

Warto zwrócić uwagę na przełącznik –permanent. Dodanie go pozwoli zachować regułę po restarcie serwera. Bez przełącznika –permanent po restarcie firewalld wróci do pierwotnej konfiguracji.

Samo dodanie reguły jeszcze nie odblokuje portu. Należy przeładować regułki za pomocą jak wyżej.

firewall-cmd –reload

Strona jest dostępna ze świata.

Jak usunąć regułę?

firewall-cmd --zone=block --permanent --remove-port=80/tcp

Strona ponownie nie będzie dostępna, a port zostanie zablokowany.

W jednej regule możemy dodać więcej portów, na przykład gdybyśmy chcieli dodać port 80 i 443 jednocześnie, możemy to zrobić w ramach jednej komendy.

firewall-cmd --zone=block --permanent --add-port=80/tcp --add-port=443/tcp

Analogicznie, usunięcie kilku portów w jednym poleceniu.

firewall-cmd --zone=block --permanent --remove-port=80/tcp --remove-port=443/tcp

Po każdej zmianie przeładowujemy firewalld.

Forwardowanie portów

Załóżmy, że mamy typową konfigurację z serwerem na froncie i w sieci lokalnej mamy serwer WWW. Przychodzi zatem potrzeba wystawienia danej usługi na świat. Możemy wykorzystać do tego tradycyjnie forwardowanie portów.

Mamy aktualnie dwa serwery, jeden z publicznym adresem i prywatnym 10.0.0.3 oraz jeden z prywatnym adresem (bez publicznego) 10.0.0.2.

Aktualnie, domyślną strefą jest strefa public w naszym firewallu.

Dodajemy maskaradę. Jest niezbędna do forwardowania.

firewall-cmd --zone=public --add-masquerade

Wystawiamy pod portem 8080 serwer WWW na lokalnym serwerze 10.0.0.2:80

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

Pamiętajmy o przełączniku –permanent jeśli chcemy, aby regułka została po restarcie.

Pozostałe reguły, porty dodajemy analogicznie, co pozwoli na zbudowanie podstawowej ochrony dla naszego środowiska i serwera.

Lockdown

To specjalny tryb firewalld, który uniemożliwia innym aplikacjom wchodzenie w interakcje z firewallem. Kiedy założymy lock’a na firewalld, tylko użytkownik root będzie w stanie modyfikować reguły firewalla.

Włączenie lockdown’a:

firewall-cmd --lockdown-on

Wyłączenie lockdown’a:

firewall-cmd --lockdown-off

Panic

Istnieje także specjalny tryb “panic”, który w sytuacji awaryjnej odetnie całkowicie ruch do serwera i wygasi dodatkowo aktywne połączenia.

Warto jednak pamiętać, że jeśli pracujemy na zdalnym serwerze, włączenie trybu panic zaowocuje automatycznym odcięciem dostępu do takiego serwera i konieczne będzie skorzystanie z konsoli typu KVM, aby zalogować się do serwera. W sytuacji jednak ataku na nasz serwer, opcja panic, może być bardzo przydatna.

Włączenie panic’a:

firewall-cmd --panic-on

Wyłączenie:

firewall-cmd --panic-off