CentOS zawiera kilka narzędzi do zarządzania zaporą. Jednym z nich jest Iptables, który jest instalowany jako część systemu podstawowego. Począwszy od CentOS 7, narzędzie FirewallD zastępuje iptables jako domyślne do zarządzania zaporą.

Odpowiednio skonfigurowana zapora, jest jednym z najważniejszych aspektów ogólnego bezpieczeństwa systemu. FirewallD to kompletne rozwiązanie do konfiguracji zapory, które zarządza regułami iptables i zapewnia interfejs do ich obsługi.

W poniższym artykule został wyjaśniony proces konfiguracji zapory z FirewallD w systemie CentOS.

  • instalacja oraz włączenie FirewallD:

FirewallD jest instalowany domyślnie w CentOS 7, lecz w przypadku gdy nie jest zainstalowany w systemie, można zainstalować pakiet, wydając polecenie jego instalacji:

# sudo yum install firewalld

Usługa Firewalld jest domyślnie wyłączona. Instalacja nie aktywuje automatycznie zapory, aby uniknąć blokady z serwera. Można sprawdzić stan zapory za pomocą polecenia:

# sudo firewall-cmd --state

not running

Jeśli FirewallD został właśnie zainstalowany lub wcześniej nie został włączony, to jego status będzie nie uruchomiony (not running), w przeciwnym wypadku status będzie uruchomiony (running).

Aby uruchomić FirewallD jako usługę oraz dodać go do listy programów uruchamianych wraz ze startem systemu, należy wydać polecenia:

# sudo systemctl start firewalld
# sudo systemctl enable firewalld
  • domyślna strefa używana w FirewallD:

Po włączeniu usługi FirewallD po raz pierwszy strefa publiczna zostanie ustawiona jako strefa domyślna. Można wyświetlić strefę domyślną używaną w FirewallD, wpisując polecenie:

# sudo firewall-cmd --get-default-zone

public

Aby wyświetlić listę dostępnych stref, należy wydać polecenie:

# sudo firewall-cmd --get-zones

block dmz drop external home internal public trusted work

Domyślnie wszystkim interfejsom sieci przypisywana jest strefa domyślna. Aby sprawdzić, które strefy są używane przez typ interfejsu sieciowego, należy wydać polecenie:

# sudo firewall-cmd --get-active-zones

public
   interfaces: eth0 eth1

Powyższy przykład przedstawia, że oba interfejsy eth0 i eth1 są przypisane do strefy publicznej.

Można wyświetlić konfigurację oraz ustawienia reguł zapory dla strefy publicznej poleceniem:

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

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

Z powyższego wyniku można wywnioskować, że strefa publiczna jest aktywna i ustawiona jako domyślna, używana przez interfejsy eth0 i eth1. Dozwolone są także połączenia związane z klientem DHCP i SSH.

Aby sprawdzić konfigurację wszystkich dostępnych typów stref, należy wydać polecenie:

# sudo firewall-cmd --list-all-zones

Polecenie wyświetli dużą listę ustawień wszystkich dostępnych stref.

  • zmiana strefy domyślnej interfejsu sieciowego:

Można łatwo zmienić strefę interfejsu, używając flagi –zone w połączeniu z flagą –change-interface. Dla przykładu następujące polecenie przypisze interfejs eth1 do strefy roboczej (work):

# sudo firewall-cmd --zone=work --change-interface=eth1

Weryfikację wprowadzonych zmian, można sprawdzić poleceniem:

# sudo firewall-cmd --get-active-zones

work
   interfaces: eth1
 public
   interfaces: eth0
  • ogólna zmiana strefy domyślnej:

Aby zmienić strefę domyślną, należy użyć flagi –set-default-zone, a następnie nazwy strefy, która ma zostać ustawiona jako domyślna. Na przykład, aby zmienić strefę domyślną na domową (home), należy uruchomić następujące polecenie:

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

Weryfikację wprowadzonych zmian, można sprawdzić poleceniem:

# sudo firewall-cmd --get-default-zone

home
  • ruch przychodzący usługi w zaporze:

W FirewallD można zezwolić na ruch dla określonych portów na podstawie predefiniowanych reguł zwanych usługami.

Aby uzyskać listę wszystkich domyślnych dostępnych typów usług, należy wydać polecenie:

# sudo firewall-cmd --get-services
firewalld serwisy oraz usługi

Więcej informacji o każdej usłudze można znaleźć, otwierając powiązany plik .xml w katalogu /usr/lib/firewalld/services. Na przykład usługa HTTP jest zdefiniowana w ten sposób:

<?xml version="1.0" encoding="utf-8"?>
<service>
  <short>WWW (HTTP)</short>
  <description>HTTP is the protocol used to serve Web pages. If you plan to make your Web server publicly available, enable this option. This option is not required for viewing pages locally or developing Web pages.</description>
  <port protocol="tcp" port="80"/>
</service>

Aby zezwolić na ruch przychodzący HTTP (port 80) dla interfejsów w strefie publicznej, tylko dla bieżącej sesji, należy uruchomić polecenie:

# sudo firewall-cmd --zone=public --add-service=http
Jeśli modyfikowana jest strefa domyślna, można pominąć flagę –zone.

Aby sprawdzić, czy usługa http została dodana pomyślnie, należy użyć polecenia z flagą –list-services:

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

ssh dhcpv6-client http

Jeśli zapora ma pamiętać, aby port 80 (http) był otwarty po ponownym uruchomieniu maszyny wirtualnej, należy ponownie wpisać to samo polecenie, ale tym razem z flagą –permanent:

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

Można teraz wyświetlić listę usług z –list-services wraz z flagą –permanent, aby zweryfikować zmiany:

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

ssh dhcpv6-client http
  • usuwanie usługi:

Składnia usuwania usługi jest praktycznie taka sama jak podczas dodawania usługi. Po prostu należy użyć opcji –remove-service zamiast flagi –add-service:

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

Powyższe polecenie usunie usługę http ze stałej (permanent) konfiguracji strefy publicznej.

  • ruch przychodzący na porcie w zaporze:

Co należy zrobić, jeśli na maszynie uruchomiony jest program, dla którego nie ma odpowiedniej usługi na liście?

W takich sytuacjach są dwie opcje. Można otworzyć odpowiednie porty lub zdefiniować nową usługę w FirewallD.

Na przykład usługa HTTPS nasłuchuje na porcie 443 i używa TCP. Aby otworzyć port w strefie publicznej dla bieżącej sesji należy użyć flagi –add-port = i wydać polecenie:

# sudo firewall-cmd --zone=public --add-port=443/tcp
Protokoły sieciowe mogą być albo TCP albo UDP.

Aby sprawdzić, czy port został pomyślnie dodany, należy użyć flagi –list-ports:

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

443/tcp

Aby zachować port 443 otwarty po ponownym uruchomieniu maszyny wirtualnej, należy dodać regułę do stałych ustawień, uruchamiając to samo polecenie, lecz używając flagi –permanent.

Natomiast składnia usuwania portu jest praktycznie taka sama jak podczas dodawania portu. Po prostu należy użyć opcji –remove-port zamiast flagi –add-port.

# sudo firewall-cmd --zone=public --remove-port=443/tcp
  • utworzenie nowej usługi w FirewallD:

Jak już wcześniej zostało wspomniane, domyślne usługi są przechowywane w katalogu /usr/lib/firewalld/services. Najprostszym sposobem utworzenia nowej usługi jest skopiowanie istniejącego pliku usługi do katalogu /etc/firewalld/services, który jest miejscem dla plików usług tworzonych przez użytkownika wraz z zmodyfikowanymi ustawieniami.

Na przykład, aby utworzyć definicję usługi dla HTTPS, można użyć pliku usługi HTTP i odpowiednio go zmodyfikować. Plik należy skopiować, a następnie użyć edytora nano lub vi w celu naniesienia zmian w konfiguracji:

# sudo cp /usr/lib/firewalld/services/http.xml /etc/firewalld/services/https.xml

Teraz należy otworzyć nowo utworzony plik https.xml i zmienić krótką nazwę i opis usługi w znacznikach xml. Najważniejszym znacznikiem, który należy zmienić, jest znacznik portu, który określa numer portu i protokół, który ma zostać otwarty.

W poniższym przykładzie został otwarty port 443 TCP oraz zdefiniowana usługa o nazwie https:

<?xml version="1.0" encoding="utf-8"?>
<service version="1.0">
<short>https</short>
<description>HTTPS is an extension of the Hypertext Transfer Protocol (HTTP). It is used for secure communication over a computer network, and is widely used on the Internet.</description>
<port protocol="tcp" port="443"/>
</service>

Można teraz zapisać plik https.xml oraz przeładować usługę FirewallD poleceniem:

# sudo firewall-cmd --reload