Pokazywanie postów oznaczonych etykietą RHCSA. Pokaż wszystkie posty
Pokazywanie postów oznaczonych etykietą RHCSA. Pokaż wszystkie posty

Podłączanie zasobu iSCSI do naszego serwera - iscsiadm

Red Hat 6.x/7.x / CentOS 6.x/7.x
Do podłączenia się do udostępnianego nam zasobu iSCSI będziemy potrzebowali pakietu iscsi-initiator-utils i od jego instalacji musimy rozpocząć procedurę.

[root@iscsi-client ~]# yum install -y iscsi-initiator-utils

Zainstalowanie paczku utworzy nam nazwę inicjatora, która jest potrzebna w przypadku, kiedy wystawiony zasób iSCSI (target) weryfikuje tożsamość hostów podłączających się (ACL).

Naszą nazwę odnajdziemy w pliku /etc/iscsi/initiatorname.iscsi

[root@iscsi-client ~]# cat /etc/iscsi/initiatorname.iscsi
InitiatorName=iqn.1994-05.com.redhat:1feb37be685a

W paczce znajduje się narzędzie, które umożliwia wykrywanie  i podłączanie zasobu - iscsiadm. Manual do niego zawiera w przykładach w zasadzie gotowe do użycia komendy pozwalające przeprowadzić całą procedurę podłączania dysku.

W pierwszej kolejności musimy wyszukać udostępniany nam target:

[root@iscsi-client ~]# iscsiadm --mode discoverydb --type sendtargets --portal 192.168.1.204 --discover
192.168.1.204:3260,1 iqn.2003-01.org.linux-iscsi.server.x8664:sn.ca677b0f8d08

Taki wynik komendy oznacza, że wykryliśmy jeden target udostępniany nam z maszyny o adresie 192.168.1.204.
Aby zainicjować go w systemie, musimy się do niego "zalogować", zmieniając w drugiej komendzie z manualowych przykładów nazwę iqn targetu (wyświetloną w wyniku poprzedniej komendy) oraz adres ip:

[root@iscsi-client ~]# iscsiadm --mode node --targetname iqn.2003-01.org.linux-iscsi.server.x8664:sn.ca677b0f8d08 --portal 192.168.1.204:3260 --login
Logging in to [iface: default, target: iqn.2003-01.org.linux-iscsi.server.x8664:sn.ca677b0f8d08, portal: 192.168.1.204,3260] (multiple)
Login to [iface: default, target: iqn.2003-01.org.linux-iscsi.server.x8664:sn.ca677b0f8d08, portal: 192.168.1.204,3260] successful.

Polecenie pokazuje, że logowanie przebiegło pomyślnie, a to oznacza, że w pliku /proc/partitions powinniśmy zobaczyć nowy twór - nasz dysk iSCSI:

[root@iscsi-client ~]# cat /proc/partitions
major minor  #blocks  name

   8        0    8388608 sda
   8        1     512000 sda1
   8        2    7875584 sda2
  11        0    1048575 sr0
 253        0     839680 dm-0
 253        1    7032832 dm-1
   8       16    1048576 sdb

Wszystko wygląda jak powinno, dysk się pojawił, rozmiar się zgadza. Pozostaje zamountować naszą nową przestrzeń w systemie, utworzyć filesystem i cieszyć się.

W tym miejscu należy się jeszcze jedna uwaga - chodzą słuchy, że system operacyjny potrafi sprawiać niespodzianki w zakresie nazewnictwa dysków, i po podłączeniu do maszyny fizycznego dysku i restarcie (podobno) może zdarzyć się, że nasze iSCSI raptem z sdb stało się np. sdc, dlatego zaleca się mountowanie dysków poprzez ich identyfikator (UUID).

Aby poznać UUID dysku, należy utworzyć filesystem i podmountować go do naszego systemu:

[root@iscsi-client ~]# fdisk /dev/sdb
[... tworzymy partycję ...]
[root@iscsi-client ~]# mkfs.xfs /dev/sdb1
meta-data=/dev/sdb1              isize=256    agcount=4, agsize=65024 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=0        finobt=0
data     =                       bsize=4096   blocks=260096, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=0
log      =internal log           bsize=4096   blocks=853, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
[root@iscsi-client ~]# mount /dev/sdb1 /iscsi/
[root@iscsi-client ~]# blkid /dev/sdb1
/dev/sdb1: UUID="a3719902-0ee5-4095-b713-af768c5fb7e0" TYPE="xfs"

We wpisie w /etc/fstab dla tego dysku należy w pierwszej kolumnie, zamiast jego ścieżki /dev/sdx podać UUID=numer_uuid_z_polecenia_blkid.

[RH7] Odzyskiwanie dostępu do konta root - resetowanie hasła

Red Hat 7.x / CentOS 7.x
W wersji 7 systemu z rodziny RedHat odzyskanie hasła root nieco się skomplikowało. Nie wystarczy już dodać "jedynki" jako parametru startowego systemu, a sprowadzenie systemu do trybu rescue czy emergency wymaga od nas nadal znajomości hasła root.
Pocedura odzyskania/resetowania hasła nie jest może bardzo skomplikowana, ale wymaga od nas kilku kroków.
Wymagany jest oczywiście fizyczny dostęp do konsoli serwera, ponieważ nie da się jej zrealizować poprzez ssh.

Pierwszym krokiem będzie restart maszyny i edycja parametrów startowych systemu. Podczas inicjalizacji bootloadera musimy wybrać z menu gruba pozycję odpowiadającą naszemu systemowi (będzie to najczęściej pierwsza pozycja menu) a następnie przejść do edycji parametrów poprzez wciśnięcie e.

Naszym oczom ukaże się kilka linijek konfiguracji - odnajdujemy pierwszą rozpoczynającą się od linux16. Na jej końcu dodajemy wpis, który spowoduje przekazanie nam prompta systemu przed przekazaniem sterowania z initramfs do kernela.

[...]rhgb quiet LANG=en_US.UTF-8 rd.break

Bootujemy system z nowymi parametrami poprzez kombinację ctrl+x.

W tym trybie nasz root filesystem jest podmountowany w trybie ro jako /sysroot, uniemożliwiając zmianę hasła w systemie. Konieczne będzie jego przemountowanie do trybu rw i chrootowanie:

switch_root:/# mount -o remount,rw /sysroot
switch_root:/# chroot /sysroot
sh-4.2#

Od tej chwili operować będziemy na plikach naszego systemu, i wszystkie zmiany będą permanentne.
Istnieje jeszcze jeden element, który uniemożliwiać nam będzie zmianę hasła - reguły selinuxowe. Wyłączamy zatem selinuxa:

sh-4.2# setenforce 0
setenforce: SELinux is disabled

Teraz możemy zmienić hasło root, poprzez zwyczajowe:

sh-4.2# passwd

Pozostaje nam do wykonania jeszcze jedna, bardzo ważna operacja. Modyfikacja pliku /etc/shadow dokonywana poprzez wywołanie komendy passwd usuwa nam konteksty selinuxowe i skutecznie pozbawi nas możliwości korzystania z systemu, dlatego należy pamiętać o ich odtworzeniu:

sh-4.2# touch /.autorelabel

Utworzenie pliku wymusi na systemie odtworzenie kontekstów przed jego wyłączniem.

Kolejnym krokiem będzie przemountowanie filesystemu w tryb ro i restart maszyny:

sh-4.2# mount -o remount,ro /
sh-4.2# exit
exit
switch_root:/# exit
logout

I voila. Odzyskaliśmy kontrolę nad naszym root-em.

[RH7] Konfiguracja i edycja reguł lokalnego firewalla [PT.2 - port rules, masquerading, direct rules, lockdown]

Red Hat 7.x / CentOS 7.x
W pierwszej części było kilka słów teoretycznych i podstawowa konfiguracja firewalld - zony i serwisy. Czas brnąć dalej.

Konfiguracja otwarcia portów

Poza definiowalnymi serwisami pozostaje nam oczywiście możliwość dodawania customowych reguł filtrowania opartych o zwyczajowe numery portów, z jakich chcemy ruch do naszego systemu wpuszczać.
Jak można się domyślać po dwóch poprzednich zagadnieniach, definicja będzie opierać się na podaniu strefy, w której regułe chcemy umieścić, oraz numeru portu - wrażenie jest jak najbardziej prawidłowe, ponieważ wszystkie definicje zostały w firewalld zunifikowane.
Rozpocznijmy od listowania definicji portów, jakie mamy już zdefiniowane w naszych strefach:

[root@server ~]# firewall-cmd --list-ports

Listowanie takie dotyczy, tak jak wcześniej domyślnej strefy (listowanie innej wymaga użycia przełącznika --zone=nazwa_strefy).
Nie uzyskaliśmy żadnej odpowiedzi, co oznacza, że strefa nie zawiera definicji dla portów - ale samo przejście komendy bez echa może być nieco dezorientujące.
I tutaj muszę przypomnieć wcześniejsze Post Scriptum, mianowicie przełącznik --list-ports, tak jak wspominany tam --list-services pokazuje nam jedno, konkretne zagadnienie konfiguracyjne, bez wglądu w inne parametry. Moim zdaniem zapytanie idealnie nadaje się do skryptowania opartego o te reguły, ale w codziennej administracji bardziej przejrzyste jest --list-all.
Krótki rzut oka na pełną konfigurację - dla sprawdzenia reguł portów usunąłem wszystkie serwisy z poprzedniej konfiguracji:

[root@server ~]# firewall-cmd --list-all
dmz (default, active)
  interfaces: enp0s3 enp0s9
  sources:
  services:
  ports:
  masquerade: no
  forward-ports:
  icmp-blocks:
  rich rules:

Tutaj widać wyraźnie - nie ma żadnych definicji portów. Brak serwisu ssh oznacza, że nie mamy otwartego portu 22, i próba połączenia potwierdza to. Zdefiniujmy zatem, dla porównania, otwarcie ruchu do ssh nie używając serwisów:

[root@server ~]# firewall-cmd --add-port=22/tcp
success
[root@server ~]# firewall-cmd --list-all
dmz (default, active)
  interfaces: enp0s3 enp0s8
  sources:
  services:
  ports: 22/tcp
  masquerade: no
  forward-ports:
  icmp-blocks:
  rich rules:

Tak jak w poprzednich elementach konfiguracji, usunięcie portu zrealizujemy poprzez przełącznik --remove-port.
Przydatna również może okazać się możliwość otwarcia zakresu portów, np:

[root@server ~]# firewall-cmd --add-port=20-23/tcp
success
[root@server ~]# firewall-cmd --list-all
dmz (default, active)
  interfaces: enp0s3 enp0s8 enp0s9
  sources:
  services:
  ports: 20-23/tcp
  masquerade: no
  forward-ports:
  icmp-blocks:
  rich rules:

Tym sposobem możemy otwierać ruch na dowolnym porcie i protokole, zależnie od potrzeby.

Masquerade - port forwarding

Konfiguracja forwardowania portów ma analogiczną składnię, przy czym ilość parametrów, z oczywistych względów jest większa.
Aby forwardowanie miało szansę zadziałać, w pierwszej kolejności wymagane jest uruchomienie usługi masqueradingu:

[root@server ~]# firewall-cmd --add-masquerade
success

Obecny status jest doskonale widoczny w widoku generowanym przez przełącznik --list-all.
Samo przekierowanie portu możemy realizować zarówno na określony port jak i adres ip, lub uwzględniając oba elementy jednocześnie. Składnia przełącznika nie wygląda może zbyt przyjaźnie, ale jest bardzo logicznie uporządkowana - zawiera sekcje port (port na który przychodzi ruch), proto (protokół komunikacji), topotr (docelowy port przekierowania) oraz toaddr (docelowy adres przekierowania):

[root@server ~]# firewall-cmd --add-forward-port=port=50:proto=tcp:toport=22
success
[root@server ~]# firewall-cmd --list-all
dmz (default, active)
  interfaces: enp0s3 enp0s8
  sources:
  services:
  ports:
  masquerade: yes
  forward-ports: port=50:proto=tcp:toport=22:toaddr=
  icmp-blocks:
  rich rules:

W ramach testu działania zamknąłem na maszynie wszystkie porty, otwierając jedynie port 50/TCP - zdefiniowane przekierowanie umożliwiło zalogowanie się ssh na maszynę poprzez port 50 - a odrzuciło połączenie po standardowym 22, więc rezultat jest zgodny z oczekiwaniami.

Dodawanie reguł direct i chain-ów

firewall-cmd pozostawia nam możliwość operowania ra regułach analogicznych do tych, które pamiętamy z iptables. Reguły te są wpisywane bezpośrednio do tablic iptables, a korzystanie z nich wymaga  zrozumienia konstrukcji łańcuchów iptables.
Składnia tego typu definicji wygląda następująco:

[root@server ~]# firewall-cmd [--permanent] --direct --add-rule {ipv4|ipv6|eb} table chain priority args

Przełącznik --permanent odpowiada oczywiście za trwałe zapisanie reguły w systemie. --add-rule jak sugeruje nazwa odpowiada za dodanie reguły. Reguła taka musi mieć określony protokół (ipv4, ipv6 lub ethernet bridges). Kolejnymi elementami wymaganymi są tablica iptables do której reguła ma być dodana oraz odpowiedni chain.
Priorytet wykorzystywany jest do zarządzania kolejnością reguł - 0 oznacza dodanie reguły na początku tablicy, a kolejne numery powodują dodanie jej odpowiednio dalej. Dodanie kilku reguł z jednakowym priorytetem może spowodować przypadkową kolejność ich stosowania (w ramach priorytetu), dlatego, jeśli zależy nam na wymuszeniu kolejności warto zastosować różne priorytety.
Argumentami komendy będą przełączniki stosowane w iptables.
Przykładowe polecenie może wyglądać następująco:

[root@server ~]# firewall-cmd --direct --add-rule ipv4 filter IN_dmz_allow 0 -m tcp -p tcp --dport 2345 -j ACCEPT

Zdefiniowane wcześniej reguły możemy przeglądać poleceniem:

[root@server firewalld]# firewall-cmd --direct --get-all-rules
ipv4 filter IN_dmz_allow 0 -m tcp -p tcp --dport 2345 -j ACCEPT

lub dla konkretnej tablicy:

[root@server firewalld]# firewall-cmd --direct --get-rules ipv4 filter IN_dmz_allow
0 -m tcp -p tcp --dport 2345 -j ACCEPT

Przełącznik --direct umozliwia nam również definiowanie własnych chain-ów w odpowiednich tablicach.

[root@server firewalld]# firewall-cmd --direct --add-chain ipv4 filter test_chain
success

A zdefiniowane przez nas chain-y możemy podejrzeć przez:

[root@server firewalld]# firewall-cmd --direct --get-all-chains
ipv4 filter test_chain

Usuwanie, zarówno reguł jak i chain-ów realizujemy analogicznie, używając odpowiednio przełączników --remove-rule i --remove-chain.

Cały czas pozostaje nam możliwość weryfikowania zdefiniowanych reguł poprzez klasyczne iptables -nL, ale ilość tablic powoduje, że nie są one zbyt czytelne.

Lockdown - blokowanie możliwości zmian reguł przez aplikacje

Aplikacje oraz serwisy, jeśli są uruchomione z uprawnieniami root, mają możliwość zmiany konfiguracji firewalla (np. libvirt). Opcja lockdown daje nam możliwość kontrolowania tych możliwości.
Lockdown konfiguracji wykonujemy poprzez ustawienie wartości yes w pliku /etc/firewalld/firewalld.conf

[root@server firewalld]# vi /etc/firewalld/firewalld.conf
[...]
Lockdown=yes
[...]
[root@server firewalld]# firewall-cmd --reload
success
[root@server firewalld]# firewall-cmd --query-lockdown
yes

Po przeładowaniu, zmian w konfiguracji będą mogły dokonywać jedynie aplikacje zdefiniowane na białej liście, w pliku /etc/firewalld/lockdown-whitelist.xml
Plik posiada predefiniowane reguły, które umożliwiają edycję reguł np. root-owi - do przetestowania działania usunąłem je z pliku - efekt jest zgodny ze spodziewanym:

[root@server firewalld]# firewall-cmd --add-service ftp
Error: ACCESS_DENIED: lockdown is enabled

Lockdown, a w zasadzie reguły whitelist mogą być zdefiniowane w oparciu o kilka elementów:
- context - konteksty selinuxowe danej aplikacji (ps -e --context)
- uid - id użytkownika
- user - nazwa użytkownika
- commands - polecenia
i w takiej też kolejności są przez lockdown sprawdzane.

Zarządzanie odbywa się przez przełączniki:

[root@server firewalld]# firewall-cmd --add-lockdown-whitelist-command='/usr/bin/python -Es /usr/bin/firewall-cmd'
success
[root@server firewalld]# firewall-cmd --add-lockdown-whitelist-context='system_u:system_r:kernel_t:s0'
success
[root@server firewalld]# firewall-cmd --add-lockdown-whitelist-uid=500
success
[root@server firewalld]# firewall-cmd --add-lockdown-whitelist-user=test
success

Usuwać reguły będziemy identycznie, zastępując --add-lockdown-... przez --remove-lockdown...

Weryfikacja odbywać się może poprzez:

[root@server firewalld]# firewall-cmd --list-lockdown-whitelist-user
test
[root@server firewalld]# firewall-cmd --list-lockdown-whitelist-uid
500
[root@server firewalld]# firewall-cmd --list-lockdown-whitelist-context
system_u:system_r:kernel_t:s0
[root@server firewalld]# firewall-cmd --list-lockdown-whitelist-command
/usr/bin/python -Es /usr/bin/firewall-cmd

Konfiguracja i edycja reguł lokalnego firewalla - firewalld i firewall-cmd [PT.1 - zones & services]  

[RH7] Konfiguracja i edycja reguł lokalnego firewalla - firewalld i firewall-cmd [PT.1 - zones & services]

Red Hat 7.x / CentOS 7.x
Wersja 7 systemu spod znaku czerwonego kapelusza w nowy sposób spogląda na obsługę komunikacji sieciowej naszego systemu. Usługą odpowiedzialną za ten kawałek został firewalld.
Moje pierwsze wrażenia? Konfiguracja i definiowanie reguł jest chyba bardziej czytelne, z pewnością bardziej intuicyjne, choć od osoby przyzwyczajonej do iptables wymaga poświęcenia kilku chwil na zaznajomienie się z nowym sposobem operowania w środowisku.

firewalld operuje na zdefiniowanych strefach sieciowych (zonach), które są rodzajem kontenerów reguł sieciowych. Strefa taka określa zasady jakie będą stosowane dla np. interfejsu sieciowego sklasyfikowanego w takiej strefie. Reguły aplikacji korzystających z sieci oparto na innych pseudo kontenerach - serwisach - które w formie plików xml definiują porty, czy też zakresy portów jakie mają pozostać otwarte na naszym serwerze. Ale po kolei...

Obsługa wszystkiego co związane jest z firewalld odbywa się przez jedno z dwóch narzędzi - w trybie graficznym może to być firewall-config, w trybie tekstowym będzie to firewall-cmd. W drugim przypadku, zwyczajowo wszystko mamy ładnie opisane w manualu oraz w helpie dla komendy - przy czym, jak zaobserwowałem, w helpie jest kilka przełączników, których w manualu nie ma...

Wspomniałem o zonach, i od nich wypada rozpocząć szerszy opis przygody z firewalld. Zony, to predefiniowane zestawy reguł, które są stosowane w naszym systemie bez konieczności definiowania czegokolwiek. (możemy zdefiniować własną zonę z naszym zestawem reguł, ale to chyba zabawa dla admina, który cokolwiek już o firewalld wie, więc pominę temat, przynajmniej na razie).
Predefiniowane zony możemy podejrzeć sobie wydając polecenie:

[root@server ~]# firewall-cmd --get-zones
block dmz drop external home internal public trusted work

Poszczególne zony traktują naszą sieć mniej więcej tak:

- block - wypuszczamy wszystkie pakiety, a wpuszczamy jedynie te, które są odpowiedzią na nasze zapytanie
- dmz - jak wskazuje nazwa - wpuszczamy tylko wybrane połączenie w sieci wewnętrznej - domyślnie ssh
- drop - identycznie jak block, z tym, że połączenia są faktycznie dropowane i nie wysyłamy na nie odpowiedzi o zablokowaniu połączenia
- external - nie ufamy nikomu na zewnątrz, więc wpuszczamy tylko zdefiniowany ruch (domyślnie jedynie ssh)
- home - raczej ufamy innym komputerom, więc domyślnie wpuszczamy ssh, sambę, mdns, ipp-client i dhcpv6
- internal - w zasadzie tak samo jak home - sieć wewnątrzna
- public - nie ufamy nikomu... no chyba, że przez ssh albo dhcpv6
- trusted - ufamy wszystkim i wpuszczamy wszystko - taki domyślny ACCEPT na początku tablicy iptables
- work - w zasadzie wierzymy w dobre zamiary innych userów sieci, ale na wszelki wypadek wpuszczamy tylko ssh, ipp i dhcpv6

To tak z grubsza - moim zdaniem za dużo tych definicji, ale jak to mówią od przybytku głowa nie boli, a może są jakieś głąbsze różnice, do których póki co nie dotarłem.
W tym miejscu wspomnę o pierwszej ścieżce systemowej, która jest przydatna w pracy z firewalld, a mianowicie /usr/lib/firewalld. W podkatalogu zones znajdują się pliki xml zawierające definicję i krótki opis każdej ze stref.
W pierwszej kolejności zweryfikujmy, czy nasz deamon działa:

[root@server ~]# firewall-cmd --state
running

Działa. Więc zajmijmy się konfiguracją.

Działania z zonami

Domyślnie nasze interfejsy przypisane są do strefy public - rezultat jest mniej więcej taki sam, jak w przypadku domyślnej konfiguracji iptables w wersjach wcześniejszych systemu.
Przypisanie to możemy sprawdzić poprzez:

[root@server ~]# firewall-cmd --get-active-zones
public
  interfaces: enp0s3

Polecenie pokazuje nam wszystkie aktywne w systemie strefy, oraz przypisane do nich interfejsy.

Wszystkie interfejsy naszej maszyny są dodawane do strefy domyślnej, której definicję sprawdzimy następująco:

[root@server ~]# firewall-cmd --get-default-zone
public

Na dowód takiego zachowania, dodałem w swojej maszynie dwa kolejne interfejsy sieciowe, a efektem jest:

[root@server ~]# firewall-cmd --get-active-zones
public
  interfaces: enp0s3 enp0s8 enp0s9

Strefę domyślną możemy zmienić w bardzo prosty sposób:

[root@server ~]# firewall-cmd --set-default-zone=dmz
success
[root@server ~]# firewall-cmd --get-default-zone
dmz

Każdy z naszych interfejsów możemy przypisać do innej strefy, i definiować dla niego specyficzne reguły, które nie będą działały dla interfejsu w innej strefie.
Przypisanie takie realizujemy poprzez usunięcie go z obecnej strefy i przypisanie do nowej:

[root@server ~]# firewall-cmd --zone=public --remove-interface=enp0s8
success
[root@server ~]# firewall-cmd --zone=dmz --add-interface=enp0s8
success
[root@server ~]# firewall-cmd --get-active-zones
dmz
  interfaces: enp0s8
public
  interfaces: enp0s3

Nie udało mi się jednak w ten sposób uzyskać permanentnego przypisania interfejsów do różnych zone, a restart serwera przywraca wszystko do strefy domyślnej.... może to taki "feature" [firewall-cmd v.0.3.9].
Sam Red Hat podaje jednak alternatywną - działającą - metodę stałego przypisania do zony. W pliku konfiguracyjnym interfejsu /etc/sysconfig/network-scripts/ifcfg-enp0s* należy umieścić parametr ZONE= wraz z nazwą zony.

Serwisy

Domyślne ustawienia stref rzadko kiedy będą zadowalające dla administratora, ze względu na ograniczoną ilość usług, które są sieciowo "przepuszczane". Kolejnym poziomem abstrakcji wprowadzonym przez firewalld, a ułatwiającym korzystanie z niego są serwisy.
Serwis jest definicją portu oraz protokołu sieciowego, który ma zostać przepuszczony przez firewall np. na potrzeby aplikacji. Jest to bardzo ciekawe, i przydatne podejście. Tym bardziej, że definiowanie własnych serwisów jest banalnie proste. Ale po kolei.

Weryfikacja w jaki sposób obsługujemy ruch sieciowy sprowadza się do wylistowania zawartości wszystkich aktywnych zon. Biorąc pod uwagę problem z permanentnym skonfigurowaniem kilku na raz, aktywną pozostaje tylko domyślna, dlatego wystarczy polecenie:

[root@server ~]# firewall-cmd --list-all
dmz (default, active)
  interfaces: enp0s3
  sources:
  services: ssh
  ports:
  masquerade: no
  forward-ports:
  icmp-blocks:
  rich rules:

Jeśli aktywnych byłoby kilka - do powyższej komendy należy dodać przełącznik --zone=nazwa_zone
Jak wynika z powyższego, w zonie dmz mamy skonfigurowany serwis ssh, co oznacza, że ruch na porcie 22 jest otwarty.  Szybka weryfikacja, i faktycznie serwer odpowiada po ssh.

Dodawanie serwisów w danej zonie odbywa się poprzez polecenie:

[root@server ~]# firewall-cmd --zone=dmz --add-service=ftp
success

Analogicznie sytuacja wygląda z usuwaniem serwisu z zony:

[root@server ~]# firewall-cmd --zone=dmz --remove-service=ssh
success

Po tych dwóch operacjach nasze reguły sieciowe przedstawiać się będą następująco:

[root@server ~]# firewall-cmd --list-all
dmz (default, active)
  interfaces: enp0s3
  sources:
  services: ftp
  ports:
  masquerade: no
  forward-ports:
  icmp-blocks:
  rich rules:

I kolejna szybka weryfikacja.... nie zalogujemy się już po ssh (nie sprawdzam portu 21, ponieważ nie mam na tej maszynie ftp-a).

Listę wszystkich predefiniowanych serwisów znajdziemy w formie plików xml w katalogu /usr/lib/firewalld/services, a konfigurację możemy sprawdzić poprzez podejrzenie ich zawartości. Nazwa pliku jest tożsama z nazwą serwisu.
P.S. Jeśli nie potrzebujemy oglądać całej konfiguracji zony, możemy również podejrzeć skonfigurowane serwisy korzystając z przełącznika --list-services, choć nie daje to pełnego obrazu konfiguracji (ale o tym w następnej części).

W tym miejscu należy wspomnieć o jednej, bardzo ważnej właściwości. Ten sposób konfigurowania serwisów nie jest permanentny, i nie przetrwa restartu maszyny.
Do rozwiązania tego problemu możemy użyć dwóch metod:
- używając przełącznika --permanent podczas dodawania lub kasowania serwisu, który każdą wprowadzoną z nim regułę zapisze na stałe w konfiguracji, lub
- zapisując konfigurację zawartą w pamięci, poprzez użycie polecenia firewall-cmd --runtime-to-permanent po wprowadzeniu wszystkich interesujących nas reguł.

Używanie opcji --permanent implikuje z kolei konieczność przeładowania reguł firewalld, ponieważ wprowadzana tak reguła jest zapisywana w konfiguracji, ale nie ładowana do działająego już serwisu. Po dodaniu reguł permanentnych będziemy musieli użyć polecenia firewall-cmd --reload. Używanie jednej z kombinacji jest dowolne, zależnie od preferencji admina.

Tworzenie własnych definicji serwisów


Przydatność serwisów możemy zauważyć, m.in. w przypadku konieczności zdefiniowania własnych reguł aplikacji, która instalowana jest na wielu serwerach (np. aplikacja monitorująca, serwer aplikacyjny itp.). Aplikacje takie niejednokrotnie wymagają otwarcia kilku portów, i na wszystkich maszynach konfiguracja ta jest identyczna, dlatego wygodnie będzie stworzyć własny plik definicji, i dodawać nasz serwis do stref na poszczególnych maszynach. Operacja polegać będzie na skopiowaniu jednego z instniejących plików definicji do katalogu /etc/firewalld/services/ (w nim są przetrzymywane wszystkie definicje serwisów tworzone przez użytkownika), nazwaniu go zgodnie z nazwą serwisu i jego edycji - całość jest bardzo intuicyjna, więc ten temat zakończę na przykładzie, bez zbędnych komentarzy...
Scenariusz przykładu obejmuje: Skonfigurujemy przykładowy plik reguł dla serwera jboss, którego aplikacje nasłuchują na portach (TCP) 80, 8080, 443, 8180, multicast klastra działa na porcie (UDP) 45688, a klaster komunikuje się po porcie (TCP) 7800.

[root@server ~]# cp /usr/lib/firewalld/services/http.xml /etc/firewalld/services/jboss.xml
[root@server ~]# vi /etc/firewalld/services/jboss.xml
<?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>

Zawartość zmieniamy na założoną konfigurację:

<?xml version="1.0" encoding="utf-8"?>
<service>
  <short>Jboss</short>
  <description>Moja definicja Jboss-a</description>
  <port protocol="tcp" port="80"/>
  <port protocol="tcp" port="8080"/>
  <port protocol="tcp" port="443"/>
  <port protocol="tcp" port="8180"/>
  <port protocol="udp" port="45688"/>
  <port protocol="tcp" port="7800"/>
</service>

Pozostaje nam jeszcze załadować serwis do strefy, i gotowe:

[root@server ~]# firewall-cmd --permanent --add-service=jboss
success
[root@server ~]# firewall-cmd --reload
success
[root@server ~]# firewall-cmd --list-all
dmz (default, active)
  interfaces: enp0s3
  sources:
  services: jboss ssh
  ports:
  masquerade: no
  forward-ports:
  icmp-blocks:
  rich rules:

W następnej części zajmiemy się konfiguracją portów, masqueradingu i definicjami direct, bardziej zbliżonymi w swej formie do reguł iptables.

Konfiguracja i edycja reguł lokalnego firewalla [PT.2 - port rules, masquerading, direct rules, lockdown]