Firewall to warstwa ochronna skonfigurowana pomiędzy siecią prywatną i publiczną (Internetem). Istnieje wiele rodzajów firewalli, jeden z nich przeprowadza filtrowanie pakietów. Pakiet danych powstaje w procesie zwanym enkapsulacją, polegającym na dodawaniu informacji nagłówkowych do komunikatu w czasie formowaniu pakiety. Nagłówek zawiera takie informacje jak: źródłowy i docelowy adres IP, port i typ danych. W oparciu o zdefiniowane reguły firewall przechwytuje wszystkie przychodzące i wychodzące pakiety, sprawdza nagłówek i podejmuje decyzję czy puścić pakiet dalej. Porty dla każdej usługi dostępnej w systemie zdefiniowane są w pliku /etc/services
i są takie same we wszystkich systemach operacyjnych łącznie z RHEL.
Tworzenie firewalla przy pomocy iptables lub firewalld.
Począwszy od RHEL7.0 usługi iptables i firewall mogą być konfigurowane i zarządzane przez demona firewalld. Główną zaletą demona firewalld jest możliwość wprowadzania aktualizacji bez zakłócania połączeń sieciowych, restartowania usługi czy restartowania systemu. Zarządzać demonem firewalld można z poziomu komendy firewall-cmd, graficznie narzędziem firewall-config lub manualnie poprzez edycję odpowiednich plików.
Iptables bez firewalld przechowuje swoje reguły w pliku /etc/sysconfig/iptables
. Iptables z firewalld zapisuje reguły w katalogu /etc/firewalld
i dostarcza wiele szablonów dla różnych usług w katalogu /usr/lib/firewalld
. Te szablony mogą być kopiowane i modyfikowane do wykorzystania dla nowych usług.
W jednym zadanym czasie można zarządzać firewallem tylko w jeden sposób: albo metodą iptables albo metodą firewalld, nie można obu tych metod stosować równolegle.
Plik konfiguracyjny iptables: /etc/sysconfig/iptables
.
Domyślna zawartość pliku:
# cat /etc/sysconfig/iptables
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [9:1624]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT
iptables pozwala nam definiować tabele zawierające grupy reguł zwane łańcuchami, każda tabela powiązana jest z przetwarzaniem pakietów różnych typów. W przykładzie powyżej zdefiniowana została jedna domyślna tabela nazwana filter, która zawiera trzy predefiniowane łańcuchy (INPUT, FORWARD i OUTPUT) z łańcuchem INPUT zawierającym wiele reguł. Wszystkie przychodzące i wychodzące pakiety przechodzą przez co najmniej jeden z tych skonfigurowanych łańcuchów. Pakiety przeznaczone dla lokalnego systemu używają łańcucha INPUT, pakiety wychodzące z systemu lokalnego używają łańcucha OUTPUT, pakiety które mają być przeroutowane do innej sieci używają łańcucha FORWARD. Każdy łańcuch ma swoją polityką zwaną celem (targetem), który może przyjmować taki wartości jak: ACCEPT, REJECT, DROP lub LOG. Polityka ACCEPT pozwala przejść pakietowi, polityka REJECT odrzuca pakiet i wysyła komunikat zwrotny, polityka DROP odrzuca pakiet bez żadnego powiadomienia, polityka LOG wysyła informacje o pakiecie do demona rsyslogd celem logowania. W przykładzie powyżej zauważyć można także pozycję “state“, która określa ona stan przychodzącego połączenia. Połączenie może być w stanie: NEW, ESTABILISHED, RELATED lub INVALID. Stan NEW identyfikuje pakiet, który nie jest częścią istniejącego połączenia, stan ESTABILISHED wskazuje, że pakiet jest częścią istniejącego połączenia, stan RELATED oznacza, że pakiet został wygenerowany w relacji z inną istniejącą komunikacją, stan INVALID określa że pakiet nie pasuje do innych stanów.
Pierwsza reguła w pliku wyżej powoduje akceptację wszystkich połączeń przychodzących, druga reguła będzie zezwalać na przychodzące zapytania ICMP (pingi), trzecia reguła będzie zezwalać na połączenia przychodzące na interfejsie loopback (pętla), czwarta reguła będzie pozwalać na ruch TCP na porcie 22 (ssh). Ostatnie die reguły będą odrzucać jakiekolwiek pakiety sieciowe z jakiegokolwiek źródła z komunikatem icmp-host-prohhibited odsyłanym z powrotem do systemu źródłowego.
Plik może być edytowany w edytorze tekstu, komendą iptables lub komendą lokkit (część pakietu system-config-firewall-base).
Kontrolowanie usług iptables i firewalld.
Usługi iptables i firewalld nie mogą być uruchomione równolegle.
Automatyczne uruchamianie firewalld przy starcie systemu:
# systemctl enable firewalld
ln -s '/usr/lib/systemd/system/firewalld.service' '/etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service'
ln -s '/usr/lib/systemd/system/firewalld.service' ‘/etc/systemd/system/basic.target.wants/firewalld.service'
Uruchamianie usługi firewalld:
# systemctl start firewalld
Sprawdzenie statusu usługi firewalld:
# systemctl status firewalld –l
firewalld.service - firewalld - dynamic firewall daemon
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled)
Active: active (running) since Sat 2014-11-08 08:10:31 EST; 1min 27s ago
Main PID: 18228 (firewalld)
CGroup: /system.slice/firewalld.service
└─18228 /usr/bin/python -Es /usr/sbin/firewalld --nofork --nopid
Nov 08 08:10:30 server1.example.com systemd[1]: Starting firewalld - dynamic firewall daemon…
Nov 08 08:10:31 server1.example.com systemd[1]: Started firewalld - dynamic firewall daemon.
Zatrzymanie usługi:
# systemctl stop firewalld
Usunięcie usługi firewalld z autostartu:
# systemctl disable firewalld
rm '/etc/systemd/system/basic.target.wants/firewalld.service'
rm '/etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service'
Automatyczne uruchamianie iptables przy starcie systemu:
# systemctl enable iptables
ln -s '/usr/lib/systemd/system/iptables.service' '/etc/systemd/system/basic.target.wants/iptables.service'
Uruchamianie usługi iptables:
# systemctl start iptables
Sprawdzenie statusu:
# systemctl status iptables –l
iptables.service - IPv4 firewall with iptables
Loaded: loaded (/usr/lib/systemd/system/iptables.service; enabled)
Active: active (exited) since Sat 2014-11-08 08:16:59 EST; 23s ago
Process: 18784 ExecStart=/usr/libexec/iptables/iptables.init start (code=exited, status=0/SUCCESS)
Main PID: 18784 (code=exited, status=0/SUCCESS)
Nov 08 08:16:59 server1.example.com iptables.init[18784]: iptables: Applying firewall rules: [ OK ]
Nov 08 08:16:59 server1.example.com systemd[1]: Started IPv4 firewall with iptables.
Komenda iptables.
Komenda ta używana jest do modyfikowania reguł firewalla gdy wyłączony jest demon firewalld. Opcje związane z komendą iptables zawiera tabela poniżej.
Opcja | Opis |
-A (append) |
Dodaje jedną lub więcej reguł na koniec łańcucha. |
-I (--insert) |
Dodaje jedną lub więcej reguł na początek łańcucha. |
-D (--delete) |
Kasuje jedną lub więcej reguł łańcucha. |
-F (--flush) |
Czyści łańcuch lub tabelę. |
-L (--list) |
Listuje załadowane reguły. |
-N (--new-chain) |
Dodaje nowy łańcuch. |
-R (--replace) |
Zamienia regułę w łańcuchu. |
-X (--delete-chain) |
Kasuje łańcuch. |
-d (--destination) |
Określa adres przeznaczenia |
--dport |
Określa numer portu przeznaczenia |
-i (--in-interface) |
Określa interfejs sieciowy |
-j (--jump) |
Określa gdzie pakiet ma przeskoczyć jeżeli reguła zostanie dopasowana |
-m (--match) |
Określa nazwę dopasowania |
-o (--out-interface) |
Określa interfejs sieciowy używany dla pakietów wychodzących. |
-p (--protocol) |
Definiuje protokół wg pliku /etc/protocols |
-s (--source) |
Określa adres źródłowy |
-t (--table) |
Określa typ tabeli. Domyślna jest tabela filter. |
-v (--verbose) |
Wyświetla dokładniejsze informacje na wyjściu. |
Wyświetlanie listy załadowanych reguł iptables w systemie:
# iptables -L -n
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:80
ACCEPT tcp -- 10.0.0.0/8 0.0.0.0/0 state NEW tcp dpt:22
ACCEPT tcp -- X.Y.Z.0/24 0.0.0.0/0 state NEW tcp dpt:22
REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
Chain FORWARD (policy ACCEPT)
target prot opt source destination
REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Ćwiczenie 1. Dodawanie i aktywacja reguł iptables.
Uruchamiamy iptables z opcją -F żeby wykasować wszystkie istniejące reguły:
# iptables –F
Dodajemy regułę do tabeli filter aby pozwolić na ruch przychodzący na porcie 80:
# iptables –t filter –A INPUT –p tcp --dport 80 –j ACCEPT
Dodajemy regułę aby odrzucić ruch wychodzący ICMP bez wysyłania komunikatów zwrotnych:
# iptables –A OUTPUT –p icmp –j DROP
Dodajemy regułę do forwardowania całego ruchu przychodzącego do sieci 192.168.0.0/24:
# iptables –A FORWARD –d 192.168.0.0/24 –j ACCEPT
Dodajemy regułę na początku wszystkich reguł aby zezwolić na pierwszy i wszystkie następne przychodzące połączenia FTP na porcie 21:
# iptables –I INPUT –m state --state NEW –p tcp --dport 21 –j ACCEPT
Dodajemy regułę aby zabronić ruchu istniejącym i nowym wychodzącym połączeniom na porcie 25:
# iptables –A OUTPUT –m state --state NEW,ESTABLISHED –p tcp --dport 25 –j DROP
Zapisanie zmian w pliku /etc/sysconfig/iptables
:
# service iptables save
iptables: Saving firewall rules to /etc/sysconfig/iptables: [ OK ]
Dodanie usługi iptables do autostartu:
# systemctl enable iptables
Sprawdzamy listę załadowanych reguł iptables:
# iptables -L
Ćwiczenie 2. Dodawanie i usuwanie reguł iptables.
Dodajemy regułę aby zezwolić na ruch przychodzący na porcie 90 z podsieci 192.168.1.0/24:
# iptables –I INPUT –s 192.168.1.0/24 –p tcp --dport 90 –j ACCEPT
Dodajemy regułę aby odrzucać cały przychodzący ruch z podsieci 192.168.3.0/24 na interfejsie eth1:
# iptables –A INPUT –s 192.168.3.0/24 –i eth1 –j DROP
Dodajemy regułę aby odrzucać ruch wychodzący ICMP do wszystkich systemów z podsieci 192.168.3.0/24 za wyjątkiem adresu IP 192.168.3.3/24:
# iptables –I INPUT ! –d 192.168.3.3/24 –p icmp –j DROP
Dodajemy regułę aby forwardować cały ruch przychodzący z 192.168.1.0/24 do 192.168.2.0/24:
# iptables –A FORWARD –s 192.168.1.0/24 –d 192.168.2.0/24 –j ACCEPT
Kasujemy powyższą regułę:
# iptables –D FORWARD –s 192.168.1.0/24 –d 192.168.2.0/24 –j ACCEPT
Zapisujemy wszystkie reguły w pliku /etc/sysconfig/iptables
:
# service iptables save
Sprawdzamy listę załadowanych reguł iptables:
# iptables -L
Pliki konfiguracyjne demona firewalld.
Demon firewalld składuje reguły firewalla z pliku XML w dwóch różnych lokalizacjach: /usr/lib/firewalld
oraz /etc/firewalld
. Pliki z katalogu /usr/lib/firewalld/services
mogą być wykorzystane jako szablony i przekopiowane do katalogu /etc/firewalld/services
. Demon firewalld czyta pliki zlokalizowane w katalogu /etc/firewalld
i stosuje reguły w nich zawarte.
Przykładowy plik XML z szablonem dla usługi SSH:
# cat /usr/lib/systemd/services/ssh.xml
<?xml version="1.0" encoding="utf-8"?>
<service>
<short>SSH</short>
<description>Secure Shell (SSH) is a protocol for logging into and executing commands on remote machines. It provides secure
encrypted communications. If you plan on accessing your machine remotely via SSH over a firewalled interface, enable this option.
You need the openssh-server package installed for this option to be useful.</description>
<port protocol="tcp" port="22"/>
</service>