@JS's Notes

Site with notes from my work.

Wprowadzenie do Firewalld w systemach Fedora 30 / CentOS 8 / RHEL 8

2019-10-05 System @JS
Strefy

Strefy to zestaw predefiniowanych reguł firewalla. Pliki z regułami dla każdej ze stref znajdują się w katalogu /usr/lib/firewalld/zones/.

$ ls -l /usr/lib/firewalld/zones/
-rw-r--r--. 1 root root 299 08-01 17:25 block.xml
-rw-r--r--. 1 root root 293 08-01 17:25 dmz.xml
-rw-r--r--. 1 root root 291 08-01 17:25 drop.xml
-rw-r--r--. 1 root root 304 08-01 17:25 external.xml
-rw-r--r--. 1 root root 343 08-01 17:25 FedoraServer.xml
-rw-r--r--. 1 root root 525 08-01 17:25 FedoraWorkstation.xml
-rw-r--r--. 1 root root 369 08-01 17:25 home.xml
-rw-r--r--. 1 root root 384 08-01 17:25 internal.xml
-rw-r--r--. 1 root root 340 08-01 17:25 public.xml
-rw-r--r--. 1 root root 162 08-01 17:25 trusted.xml
-rw-r--r--. 1 root root 336 08-01 17:25 work.xml

$ cat /usr/lib/firewalld/zones/public.xml
<?xml version="1.0" encoding="utf-8"?>
<zone>
  <short>Public</short>
  <description>For use in public areas. You do not trust the other computers on networks to not harm your computer. Only selected incoming connections are accepted.</description>
  <service name="ssh"/>
  <service name="mdns"/>
  <service name="dhcpv6-client"/>
</zone>

Predefiniowane strefy:

  • block - wszystkie przychodzące połączenia sieciowe są odrzucane. Możliwe są tylko połączenia sieciowe inicjowane z poziomu systemu,
  • dmz - strefa zdemilitaryzowana (DMZ), która zapewnia ograniczony dostęp do sieci LAN i zezwala na ruch przychodzący na wybrane porty,
  • drop - wszystkie przychodzące połączenia sieciowe są odrzucane, a dozwolone są tylko połączenia wychodzące,
  • external - strefa wykorzystywana w zastosowaniach typu router dla interfejsu przychodzącego,
  • home - strefa dla zastosowań takich jak stacja robocza, laptop, komputer stacjonarny w sieci LAN, w której ufamy innym komputerom. Zezwala na ruchu sieciowy na wybranych portach TCP/IP.
  • internal - strefa do użytku w sieciach wewnętrznych LAN, gdy w większości ufamy innym serwerom lub komputerom,
  • public - strefa, w której nie ufamy żadnym innym urządzeniom i zezwalamy na ruch sieciowy tylko na wymaganych portach i dla określonych usług,
  • trusted - strefa gdzie wszystkie połączenia sieciowe są akceptowane,
  • work - strefa do użytku w miejscu pracy, w którym ufasz współpracownikom i innym serwerom.

W systemie Fedora Linux dodatkowo znajdziemy strefy FedoraServer i FedoraWorkstation zawierające predefiniowane reguły dla tego typu zastosowań (w przypadku instalacji serwera, strefa FedoraSerwer jest strefą domyślną).

Przykłady użycia firewall-cmd

Wykaz wszystkich stref przy uruchomionym w systemie firewallu:

$ firewall-cmd --get-zones

Wyświetlenie domyślnej strefy firewalla:

$ firewall-cmd --get-default-zone

Informacja o aktywnych strefach i przypisanych do nich interfejsach sieciowych:

$ firewall-cmd --get-active-zones

Wyświetlenie reguł zapory i usług dla strefy public:

$ sudo firewall-cmd --list-all --zone=public
public
  target: default
  icmp-block-inversion: no
  interfaces:
  sources:
  services: dhcpv6-client mdns ssh
  ports:
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

Przykład usuwania dostępu do usług dhcpv6-client i mdns:

$ sudo firewall-cmd --remove-service=dhcpv6-client --permanent
$ sudo firewall-cmd --remove-service=mdns --permanent
$ sudo firewall-cmd --reload

Listowanie aktywnych usług:

$ sudo firewall-cmd --list-services

Sprawdzenie dozwolonych usług i otwartych portów w bieżącej strefie:

$ sudo firewall-cmd --list-all

Sprawdzenie dozwolonych usług we wszystkich strefach:

$ sudo firewall-cmd --list-all-zones

Sprawdzenie stanu zapory:

$ sudo firewall-cmd --state

Polecenie ponownego załadowania konfiguracji firewalld po wprowadzeniu zmian w regułach:

$ sudo firewall-cmd --reload

Zmiany konfiguracji zapory do momentu dodania do stałego zestawu reguł są tymczasowe. Następujące polecenia tymczasowo otworzą porty TCP 80/443 (http/https). Powyższe reguły nie są zachowywane podczas ponownego uruchomienia systemu lub podczas restartowania usługi firewalld:

$ sudo firewall-cmd --zone=public --add-service=http
$ sudo firewall-cmd --zone=public --add-service=https

Aby dodać regułę na stałe, należy na końcu dodać –permanent i ponownie przeładować reguły firewalld.

Aby znaleźć listę usług obsługiwanych przez firewalld można posłużyć się przykładowymi poleceniami:

$ sudo firewall-cmd --get-services
$ sudo firewall-cmd --get-services | grep https
$ ls -l /usr/lib/firewalld/services/
$ cat /usr/lib/firewalld/services/ssh.xml

Przykład dodania na stałe i usunięcia na stałe usługi dns (port TCP/UDP 53) z reguł firewalla:

$ sudo firewall-cmd --zone=public --add-service=dns --permanent
$ sudo firewall-cmd --reload
$ sudo firewall-cmd --zone=public --remove-service=dns --permanent
$ sudo firewall-cmd --reload

Otwarcie portu TCP:

$ sudo firewall-cmd --zone=public --add-port=1313/tcp --permanent

Wyświetlenie portów dodanych do reguł firewalla:

$ sudo firewall-cmd --zone=internal --list-ports

Usunięcie na stałe portu z regul firewalla:

$ sudo firewall-cmd --zone=public --remove-port=1313/tcp --permanent

Przekierowanie i usunięcie przekierowania portu 80 do 8080 na tym samym systemie:

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

Masquerading ruchu z portu 443 do portu 443 serwera o adresie IP 192.168.1.187

$ sudo firewall-cmd --zone=public --add-masquerade
$ sudo firewall-cmd --zone=public --add-forward-port=port=443:proto=tcp:toport=443:toaddr=192.168.1.187 --permanent

Usunięcie powyższej reguły z reguł firewalla:

$ sudo firewall-cmd --zone=public --remove-masquerade
$ sudo firewall-cmd --zone=public --remove-forward-port=port=443:proto=tcp:toport=443:toaddr=192.168.1.187 --permanent

Wyświetlenie listy reguł:

$ firewall-cmd --zone=public --list-all --permanent

Zezwolenie na dostęp do portu SSH 22 tylko z adresu IP 192.168.1.113:

$ sudo firewall-cmd --permanent --zone=public --add-rich-rule 'rule family="ipv4" source address="192.168.1.113" port port=22 protocol=tcp accept'

Weryfikacja nowej reguły:

$ sudo firewall-cmd --list-rich-rules --permanent

Zezwolenie na dostęp do portu TCP 11111 z sieci 192.168.1.0/24:

$ sudo firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" port protocol="tcp" port="11111" accept'

Usunięcie powyższych reguł:

$ sudo firewall-cmd --remove-rich-rule 'rule family="ipv4" source address="192.168.1.113" port port=22 protocol=tcp accept' --permanent
$ sudo firewall-cmd --remove-rich-rule 'rule family="ipv4" source address="192.168.1.0/24" port port="11111" protocol="tcp" accept' --permanent

Instalacja serwera i klienta NTP w systemach Fedora 30 / CentOS 7 / RHEL 8

2019-10-05 System @JS

W RHEL 8 pakiet ntp nie jest już dostępny a obsługa protokołu NTP jest realizowana przez demona chronyd, który dostarcza nam pakiet o nazwie chrony. Do wykonania instalacji oraz konfiguracji wymagany jest użytkownik root lub dowolny użytkownik z uprawnieniami sudo.

Środowisko testowe:

  1. NTP serwer - Fedora 30 / RHEL 8: 192.168.1.187 (ctx07vm.local.lnxorg)
  2. NTP klient - Centos 7: 192.168.1.183 (ctx03vm.local.lnxorg)

W obu przypadkach pakiet chrony został domyślnie zainstalowany wraz z instalacją systemu. W przypadku jego braku zainstalujemy go poleceniem:

# Fedora 30 / RHEL 8
dnf update -y && dnf install chrony -y
# Centos 7
yum update -y && yum install chrony -y

Stan usługi sprawdzamy za pomocą polecenia systemctl. W przypadku gdy pakiet został doinstalowany, uruchamiamy usługę chronyd oraz włączamy automatyczne uruchamianie wraz z systemem:

systemctl status chronyd.service
sudo systemctl start chronyd.service
sudo systemctl enable chronyd.service

Na serwerze edytujemy plik konfiguracyjny /etc/chrony.conf i ustawiamy dyrektywę allow na adres sieci, z której klienci będą się łączyć do naszego serwera NTP, np.:

allow 192.168.1.0/24

Restartujemy usługę chronyd. Jeśli korzystamy z zapory firewalld otwieramy port dla serwera NTP w jej konfiguracji:

systemctl restart chronyd.service
firewall-cmd --permanent --add-service=ntp
firewall-cmd --reload

Konfigurację klienta NTP również przeprowadzamy w pliku /etc/chrony.conf. Komentujemy domyślne serwery NTP określone jako wartość dyrektywy server i w ich miejsce ustawiamy adres naszego serwera:

server 192.168.1.187

Restartujemy usługę chronyd:

systemctl restart chronyd.service
systemctl status chronyd.service

Za pomocą polecenia chronyc sources wyświetlamy bieżące źródła czasu, do których chronyd uzyskuje dostęp. W wyniku powinien pojawić się adres naszego serwera NTP:

[serwis@ctx03vm ~]$ sudo chronyc sources
210 Number of sources = 1
MS Name/IP address         Stratum Poll Reach LastRx Last sample
===============================================================================
^* ctx07vm.local.lnxorg          3   6    17     0   +523us[+4075us] +/-   55ms

Na serwerze uruchamiamy polecenie:

chronyc clients

Tym razem w wyniku powinna pojawić się informacja o klientach NTP podłączonych do naszego serwera.

[sysadmin@ctx07vm ~]$ sudo chronyc clients
Hostname                      NTP   Drop Int IntL Last     Cmd   Drop Int  Last
===============================================================================
ctx03vm.local.lnxorg            3      0   6   -    13       0      0   -     -

W pliku konfiguracyjnym można również wskazać lokalizację zawierającą klucze uwierzytelniające podnoszące bezpieczeństwo połączenia między serwerem a klientami. Odpowiada za to dyrektywa keyfile. Domyślną lokalizacją jest /etc/chrony.keys natomiast klucze generujemy za pomocą polecenia:

chronyc keygen