Przejdź do głównej zawartości

LINUX RHCE - Zastosowanie zapory sieciowej - firewall (iptables)

Iptables jest programem sterującym filtrami pakietów używanym głównie jako zapora sieciowa (firewall) lub NAT. Strona domowa projektu www.netfilter.org. Linux tradycyjnie zawiera jedynie ograniczoną formę mechanizmu tłumaczenia adresów sieciowych (NAT, ang. Network Address Translation), co poprawnie określa się jako tłumaczenie adresów portów (PAT, ang. Port Address Translation). Zamiast posługiwać się zakresami adresów IP, jak w prawdziwej implementacji NAT, PAT przekazuję wszystkie połączenia na pojedynczy adres. Szczegóły i różnice nie mają tutaj jednak większego znaczenia. Program iptables implementuje nie tylko NAT, ale również umożliwia filtrowanie pakietów. Wcześniejsze wersje systemu Linux miały to trochę nieuporządkowane ale od wprowadzenia iptables zarysowały się wyraźniejsze różnice między NAT, a funkcją filtracji pakietów. 

Tradycyjnie firewall konfigurowany jest pomiędzy siecią LAN , a siecią zewnętrzną taką jak internet. Ale zasady bezpieczeństwa mogą wymagać by każdy system posiadał uruchomioną zaporę. RHEL6 zwiera firewall w każdej domyślnej konfiguracji. Najlepsza zapora jest w warstwie w której można filtrować pakiety np.: narzędziem iptables. Kontrola ruchu pakietów obejmuję ich drogę od startu do celu w cieci TCP. 

Linux do komunikacji z siecią używa protokołu TCP/IP. Różne protokoły używają danych portów oraz istnieją protokoły domyślne jakie zdefiniowane są w pliku /etc/services. Aby móc się właściwie posługiwać narzędziem iptables musimy wiedzieć jaka usługa nasłuchuje na jakim porcie. Poniżej znajdzie się lista popularnie używanych usług wraz z portami nasłuchu. Pamiętajmy, że niektóre z tych portów mogą używać jednego lub więcej protokołów komunikacyjnych takich jak TCP (Transmision Control Protocol), UDP (User Datagram Protocol) i ICMP (Internet Control Message Protocol). Informację o tym jaka usługa ma powiązanie z jakim portem znajdziemy w pliku /etc/services. Przykładowo serwer FTP może komunikować się dwoma sposobami zarówno TCP jaki UDP. 

ftp             21/tcp
ftp             21/udp

Podstawowe usługi i ich porty komunikacyjne 
  • 21      - FTP
  • 22      - Secure SHell(SSH)
  • 23      - Telnet
  • 25      - Simple Mail Transfer Protocol (SMTP) Postfix, Sendmail 
  • 53      - Domain Name Service servers
  • 80      - Hypertext Transfer Protocol (HTTP)
  • 88      - Kerberos
  • 110    - Post Office Protocol, version 3 (POP3)
  • 139    - NetBios
  • 143    - Internet Mail Access Protocol (IMAP)
  • 443    - HTTP,secure (HTTPS)

IPTABLES 

Filozofią kryjącą się za iptables są "łańcuchy", które zawierają zestawy reguł dla każdego pakietu sieciowego do którego zostały przypisane. Każda reguła robi dwie rzeczy określa warunki jakie pakiet musi spełniać i działania jakie będą wykonane jeżeli pakiet pasuje do określonych warunków. 

Iptables używa prostego formatu poleceń : 

iptables -t tabletype <kierunek działania> <wzór pakietu> -j <co zrobić>

Przeanalizujmy to polecenie krok po kroku. Pierwszym przełącznikiem jest -t tabletype. Mamy dwie podstawowe opcje tabletype w iptables
  • filter     Ustawia regułe dla filtrowania pakietu 
  • nat        Konfiguruje tłumaczenie adresu sieciowego
Domyślnie filtrowanie nie musi być określone w -t tabletype ponieważ iptables określa że polecenie zawiera regułę dla pakietu , dalej mamy <kierunek działania> gdzie znajdą się cztery podstawowe działania zawarte w narzędziu iptables: 
  • -A (--append)     Dołącza regułę na końcu łańcucha 
  • -D (--delete)        Usunięcie reguły z łańcucha 
  • -L (--list)             Lista aktualnie skonfigurowanych reguł w łańcuchu 
  • -F (--flush)          Odświeża wszystkie reguły w aktualnym łańcuchu iptables
Jeżeli dodajemy lub usuwamy coś z łańcucha powinniśmy zatwierdzić dla przemieszczających się w sieci danych  w jednej z trzech wytycznych: 
  • INPUT        Wszystkie pakiety przychodzące będę sprawdzone z regułą z łańcucha 
  • OUTPUT    Wszystkie pakiety wychodzące będę ponownie sprawdzone z regułą łańcucha
  • FORWARD Wszystkie pakiety zostaną przesłane na inny host i ponownie sprawdzone z regułami zawartymi w iptables.
Zazwyczaj wszystkie te dyrektywy są nazwą danego łańcucha. 

Następnie musimy skonfigurować <wzór pakietu> . Wszystkie zapory iptables sprawdzają każdy pakiet ze wzorcem. Prostym wzorcem może być adres IP:
  • -s adres_IP     Wszystkie pakiety będą sprawdzane z jakiego adresu zostały wysłane
  • -d adres_IP     Wszystkie pakiety będą sprawdzane do jakiego adresu IP zmierzają
Wzorzec pakietu może być bardziej złożony. W TCP/IP, pakiety przesyłane są za pomocą protokołów TCP, UDP lub ICMP. Możemy ustawić protokół przełącznikiem -p dla portu docelowego. Dla przykładu :  -p tcp --dport 80 rozszerzenie mające wpływ na użytkowników sieci zewnętrznej próbujących użyć protokołu HTTP. 

Jeżeli polecenie iptables dokona porównania pakietu z wzorcem i będzie ono poprawne trzeba wiedzieć co dalej z takim pakietem zrobić. Stanowi to ostatnią opcję polecenia -j <co zrobić>. Podstawowe opcje wyglądają następująco:
  • DROP        Pakiet zostaje zrzucony. Żadna wiadomość nie jest wysyłana w odpowiedzi
  • REJECT    Pakiet zostaje zrzucony. Zostaje wysłana wiadomość o błędzie.
  • ACCEPT   Pakiet otrzymuje pozwolenie na przejście z wykonaniem działania -A : INPUT, OUTPUT lub FORWARD
Zobaczmy kilka przykładów jak skonfigurować zaporę stosując polecenia iptables. Pierwszym krokiem jest zawsze sprawdzenie aktualnej konfiguracji przy pomocy polecenia: 

# iptables -L

Chain INPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     all  --  anywhere             anywhere            state RELATED,ESTABLISHED
ACCEPT     icmp --  anywhere             anywhere
ACCEPT     all  --  anywhere             anywhere
ACCEPT     all  --  anywhere             anywhere
ACCEPT     tcp  --  anywhere             anywhere            state NEW tcp dpt:ssh
ACCEPT     tcp  --  anywhere             anywhere            state NEW tcp dpt:ftp
REJECT     all  --  anywhere             anywhere            reject-with icmp-host-prohibited

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination
ACCEPT     all  --  anywhere             anywhere            state RELATED,ESTABLISHED
ACCEPT     icmp --  anywhere             anywhere
ACCEPT     all  --  anywhere             anywhere
ACCEPT     all  --  anywhere             anywhere
REJECT     all  --  anywhere             anywhere            reject-with icmp-host-prohibited

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Jeżeli iptables zostało poprawnie skonfigurowane powinniśmy zobaczyć łańcuchy w trzech różnych kategoriach : INPUT, FORWARD oraz OUTPUT.

Schemat działania iptables - źródło Redhat.com


Utrzymanie zapory w działaniu.

Zapora Linuxa bazuje na narzędziu iptables oraz usłudze o tej samej nazwie. Przeglądając aktualne zasady które wyświetliliśmy poleceniem # iptables -L możemy się domyślić, że czysta pusta lista reguł przedstawia się następująco: 

Chain INPUT (policy ACCEPT)
target     prot opt source               destination

Chain FORWARD (policy ACCEPT)
target     prot opt source

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Jeżeli usługa iptables nie jest uruchomiona należy upewnić się że można ją uruchomić oraz mieć pewność, że zostanie uruchomiona po restarcie systemu. Do obsługi przydadzą się polecenia: 

# /etc/init.d/iptables start
# chkconfig iptables on 

Reguły na jakich bazuję zapora w systemie RedHat znajdują się w pliku /etc/sysconfig/iptables.

# cat /etc/sysconfig/iptables
# Firewall configuration written by system-config-firewall
# Manual customization of this file is not recommended.
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -i eth+ -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 21 -j ACCEPT
-A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
-A FORWARD -p icmp -j ACCEPT
-A FORWARD -i lo -j ACCEPT
-A FORWARD -i eth+ -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited COMMIT

Domyślne ustawienia zapory w RHEL 6

Wcześniej wyświetlaliśmy już domyślne ustawienia przy pomocy polecenia # iptables -L i wiemy że reguły zapory podzielone są na trzy kategorię (INPUT, FORWARD, OUTPUT). Informację znajdują się w sześciu kolumnach zawierających opcje narzędzia iptables. To co wyświetliliśmy bazuje na zapisanych w pliku /etc/sysconfig/iptables łańcuchach reguł. Pierwsza linia informuję, że regułami są reguły filtrowania. Alternatywnie mogą to być reguły określające NAT. 

*filter

Dalej ruch sieciowy do lokalnego systemu przeznaczony do przesłania dalej jest normalnie akceptowany co ustawione zostało opcją ACCEPT. 

:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]

Niektóre profesjonalne zabezpieczenia zawarte w U.S National Security Agency sugerują by zmienić opcję ACCEPT na DROP dla linii  INPUT oraz FORWARD. Ten sposób konfiguracji zabezpieczeń dotyczy poziomu RedHat Enterprise Security Network w kursie RH333 teraz zajmujemy się RHCE.
[0:0] jest licznikiem bajtów i pakietów i pozycją startową w tym przypadku jest wartość 0. Linie te umożliwiają wprowadzenie poleceń iptables. Każda z opcji i przełączników została również opisana na strona systemowego podręcznika man. 
Następne linie utrzymują aktualną komunikację sieciową w działaniu. Opcja ESTABLISHED kontynuuje akceptowanie pakietów aktualnego połączenia. Opcja RELATED akceptuje pakiety do przesłania przez sieć taką jak FTP. 

-A INPUT -m state --state ESTABLISHED, RELATED -j ACCEPT

  W następnej kolejności akceptujemy pakiety wędrujące w protokole ICMP. 

-A INPUT -p icmp -j ACCEPT

Dalej konfigurujemy akceptacje dla połączeń przez interfejs loopback oraz interfejsy eth

-A INPUT -i lo -j ACCEPT
-A INPUT -i eth+ -j ACCEPT

Kolejne linie określają dopasowanie pakietów przesłanych nowym połączeniem przez protokół TCP przesłanych do portu docelowego o numerze 22. Pakiety spełniające wszystkie kryteria zostaną zaakceptowane. 

-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 21 -j ACCEPT

Ostatnie dwie reguły dla wszystkich innych pakietów wysyłają informacje zawartą w icmp-host-prohibited:

-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited

Zakończenie wpisów łańcuchów reguł zamyka znacznik COMMIT 

Popularne usługi wraz z portami  wymagające konfiguracji zapory iptables

Amanda Backup Client
Klient zawarty w Advanced Maryland Automatic Network Disc Archiver (AMANDA) potrzebuje konfiguracji protokołu UDP na porcie 10080

Bacula
Serwer kopii zapasowych o otwartym kodzie źródłowym (Open Source) wymaga konfiguracji TCP na portach 9101,9102 i 9103

Bacula Client
Klient serwera kopii zapasowych Bacula potrzebna konfiguracja portu TCP 9102

DNS
Usługa Serwera nazw domenowych potrzebna konfiguracja protokołów UDP i TCP na porcie 53

FTP
Protokół transferu plików serwer do działania wykorzystuje port TCP 21 

IMAP
IMAP bez SSL zazwyczaj wykorzystuje TCP port 993

IPsec
UDP port 500

Mail (SMTP)
Simple Mail Transport Protocol - sendmail, postfix potrzebuje TCP 25

Multicast DNS (mDNS)
UDP port 5353

NFS4
TCP port 2049

Network Printing Client 
Standardowo klient wydruku potrzebuje UDP port 631

Network Printing Server
Serwer wydruku zazwyczaj konfigurowany jest na TCP oraz UDP 631

Open VPN
Wirtualna sieć prywatna (Open source) UDP port 1194

POP3 bez SSL
Zwyczajowo zastosowanie ma tu TCP port 995

RADIUS
UDP port 1812 oraz 1813

RedHat Cluster Suite 
TCP port 11111 oraz 21064 , UDP 5404 oraz 5405

Samba
Protokół komunikacyjny stosowany do komunikacji z sieciami Microsoft konfigurowany na TCP port 139 i 445 oraz UDP 137 i 138

Samba Client
Klient dla komunikacji z sieciami Microsoft protokół UDP porty 137 i 138

Secure WWW (HTTPS)
Komunikacja z bezpiecznym serwerem www TCP port 443

SSH 
Serwer SSH używa TCP port 22

TFTP server oraz client 
Komunikacja z Trivial File Transfer Protocol odbywa się przez TCP port 69

Virtual Machine Management (KVM)
Dostęp zdalny przebiega przy użyciu TCP port 16509

WWW (HTTP) 
Standardowy port serwera WWW TCP port 80

Graficzne narzędzia konfiguracyjne zaporę sieciową 

W systemie RedHat do konfigurowania zapory sieciowej iptables mamy również dostępne narzędzia z graficznym interfejsem. By je uruchomić z poziomu konsoli wydajemy polecenie : 

system-config-firewall-tui



Narzędzie w prosty sposób umożliwia włączenie lub wyłączenie zapory dla danej usługi lub też ustawienie Forward. 

LINKI


Komentarze

Prześlij komentarz

Najczęściej czytane w tym miesiącu

50 popularnych pytań dotyczących systemu Linux zadawanych na rozmowach kwalifikacyjnych. (Pytania & Odpowiedzi)

Jak dodać użytkownika w systemie Windows z poziomu konsoli CMD? (net user, net localgroup)

Generowanie testowych plików o określonej wielkości